diff options
author | dshaligram <dshaligram@c06c8d41-db1a-0410-9941-cceddc491573> | 2007-06-07 17:32:26 +0000 |
---|---|---|
committer | dshaligram <dshaligram@c06c8d41-db1a-0410-9941-cceddc491573> | 2007-06-07 17:32:26 +0000 |
commit | ee653d2656b747a8b8426fafc55c7c1cff008871 (patch) | |
tree | 527f7ed8f8a53532963f8d5eeb18fc91acf3c193 /crawl-ref/source/libunix.cc | |
parent | 23931ce20599deb7cac821f41964d232855e7133 (diff) | |
download | crawl-ref-ee653d2656b747a8b8426fafc55c7c1cff008871.tar.gz crawl-ref-ee653d2656b747a8b8426fafc55c7c1cff008871.zip |
Added support for Unicode characters in the map display with ncursesw (enabled
by setting UNICODE_GLYPHS=y in makefile.unix).
Removed the (1,1) offset between map and grid. Both map and grid are now in
sync.
Store object indexes instead of raw characters in env.map so that players can
change charsets and have the display update immediately.
git-svn-id: https://crawl-ref.svn.sourceforge.net/svnroot/crawl-ref/trunk@1552 c06c8d41-db1a-0410-9941-cceddc491573
Diffstat (limited to 'crawl-ref/source/libunix.cc')
-rw-r--r-- | crawl-ref/source/libunix.cc | 121 |
1 files changed, 96 insertions, 25 deletions
diff --git a/crawl-ref/source/libunix.cc b/crawl-ref/source/libunix.cc index b9d9342e92..b245ccdbab 100644 --- a/crawl-ref/source/libunix.cc +++ b/crawl-ref/source/libunix.cc @@ -47,6 +47,10 @@ #include "externs.h" #include "files.h" +#ifdef UNICODE_GLYPHS +#include <locale.h> +#endif + #include <termios.h> static struct termios def_term; @@ -64,11 +68,12 @@ static struct termios game_term; #endif // Character set variable -int Character_Set = CHARACTER_SET; +static int Character_Set = CHARACTER_SET; // Globals holding current text/backg. colors -short FG_COL = WHITE; -short BG_COL = BLACK; +static short FG_COL = WHITE; +static short BG_COL = BLACK; +static int Current_Colour = COLOR_PAIR(BG_COL * 8 + FG_COL); static int curs_fg_attr(int col); static int curs_bg_attr(int col); @@ -180,6 +185,10 @@ static void termio_init() #endif tcsetattr(0, TCSAFLUSH, &game_term); + +#ifdef UNICODE_GLYPHS + crawl_state.unicode_ok = !!setlocale(LC_ALL, ""); +#endif } @@ -410,6 +419,18 @@ int putch(unsigned char chr) return (addch(chr)); } +int putwch(unsigned chr) +{ +#ifdef UNICODE_GLYPHS + if (chr <= 127) + return (putch(chr)); + + wchar_t c = chr; + return (addnwstr(&c, 1)); +#else + return (putch(static_cast<unsigned char>(chr))); +#endif +} char getche() { @@ -570,7 +591,7 @@ static int curs_fg_attr(int col) void textcolor(int col) { - attrset( curs_fg_attr(col) ); + attrset( Current_Colour = curs_fg_attr(col) ); } static int curs_bg_attr(int col) @@ -629,7 +650,7 @@ static int curs_bg_attr(int col) void textbackground(int col) { - attrset( curs_bg_attr(col) ); + attrset( Current_Colour = curs_bg_attr(col) ); } @@ -638,28 +659,57 @@ int gotoxy(int x, int y) return (move(y - 1, x - 1)); } -static unsigned oldch, oldmangledch; -static int faked_x = -1, faked_y; - -void fakecursorxy(int x, int y) +#ifdef UNICODE_GLYPHS +typedef cchar_t char_info; +inline bool operator == (const cchar_t &a, const cchar_t &b) { - if (oldch && faked_x != -1 - && mvinch(faked_y, faked_x) == oldmangledch) + return (a.attr == b.attr && *a.chars == *b.chars); +} +inline char_info character_at(int y, int x) +{ + cchar_t c; + mvin_wch(y, x, &c); + return (c); +} +inline bool valid_char(const cchar_t &c) +{ + return *c.chars; +} +inline void write_char_at(int y, int x, const cchar_t &ch) +{ + move(y, x); + add_wchnstr(&ch, 1); +} +static void flip_colour(cchar_t &ch) +{ + const unsigned colour = (ch.attr & A_COLOR); + const int pair = PAIR_NUMBER(colour); + + int fg = pair & 7; + int bg = (pair >> 3) & 7; + + if (pair == 63) { - if (faked_x != x - 1 || faked_y != y - 1) - mvaddch(faked_y, faked_x, oldch); - else - return; + fg = COLOR_WHITE; + bg = COLOR_BLACK; } - - const unsigned c = mvinch(y - 1, x - 1); - const int ch = c & A_CHARTEXT; - const unsigned colour = c & A_COLOR; - const int pair = PAIR_NUMBER(colour); - faked_x = x - 1; - faked_y = y - 1; - oldch = c; + const int newpair = (fg * 8 + bg); + ch.attr = COLOR_PAIR(newpair); +} +#else // ! UNICODE_GLYPHS +typedef unsigned char_info; +#define character_at(y,x) mvinch(y,x) +#define valid_char(x) (x) +#define write_char_at(y,x,c) mvaddch(y, x, c) + +#define char_info_character(c) ((c) & A_CHARTEXT) +#define char_info_colour(c) ((c) & A_COLOR) + +static void flip_colour(unsigned &ch) +{ + const unsigned colour = char_info_colour(ch); + const int pair = PAIR_NUMBER(colour); int fg = pair & 7; int bg = (pair >> 3) & 7; @@ -671,9 +721,30 @@ void fakecursorxy(int x, int y) } const int newpair = (fg * 8 + bg); - - mvaddch( y - 1, x - 1, oldmangledch = ((ch & 127) | COLOR_PAIR(newpair)) ); + ch = ((ch & 127) | COLOR_PAIR(newpair)); +} +#endif + +static char_info oldch, oldmangledch; +static int faked_x = -1, faked_y; +void fakecursorxy(int x, int y) +{ + if (valid_char(oldch) && faked_x != -1 + && character_at(faked_y, faked_x) == oldmangledch) + { + if (faked_x != x - 1 || faked_y != y - 1) + write_char_at(faked_y, faked_x, oldch); + else + return; + } + + char_info c = character_at(y - 1, x - 1); + oldch = c; + faked_x = x - 1; + faked_y = y - 1; + flip_colour(c); + write_char_at( y - 1, x - 1, oldmangledch = c); move(y - 1, x - 1); } |