--- slang-1.4.5/src/slang.h.acs 2002-07-09 00:03:57.000000000 -0400 +++ slang-1.4.5/src/slang.h 2002-07-09 00:11:06.000000000 -0400 @@ -1255,6 +1255,8 @@ #ifdef UTF8 typedef int SLsmg_Char_Type; +extern SLtt_Char_Type SLcurses_Acs_Map [128]; +#define acs_map SLcurses_Acs_Map #define SLSMG_EXTRACT_CHAR(x) ((x) & 0xFFFFFF) #define SLSMG_EXTRACT_COLOR(x) (((x)>>24)&0xFF) #define SLSMG_BUILD_CHAR(ch,color) (((SLsmg_Char_Type)(wchar_t)(ch))|((color)<<24)) @@ -1396,7 +1398,11 @@ extern void SLsmg_set_screen_start (int *, int *); extern void SLsmg_draw_hline (unsigned int); extern void SLsmg_draw_vline (int); +#ifdef UTF8 +extern void SLsmg_draw_object (int, int, SLsmg_Char_Type); +#else extern void SLsmg_draw_object (int, int, unsigned char); +#endif extern void SLsmg_draw_box (int, int, unsigned int, unsigned int); extern int SLsmg_get_column(void); extern int SLsmg_get_row(void); @@ -1408,6 +1414,9 @@ extern int SLsmg_Display_Eight_Bit; extern int SLsmg_Tab_Width; +extern int SLsmg_Is_Unicode; +extern int SLsmg_Setlocale; + #define SLSMG_NEWLINE_IGNORED 0 /* default */ #define SLSMG_NEWLINE_MOVES 1 /* moves to next line, column 0 */ #define SLSMG_NEWLINE_SCROLLS 2 /* moves but scrolls at bottom of screen */ @@ -1465,31 +1474,79 @@ # define SLSMG_BOARD_CHAR '#' # define SLSMG_BLOCK_CHAR '#' # else -# define SLSMG_HLINE_CHAR 'q' -# define SLSMG_VLINE_CHAR 'x' -# define SLSMG_ULCORN_CHAR 'l' -# define SLSMG_URCORN_CHAR 'k' -# define SLSMG_LLCORN_CHAR 'm' -# define SLSMG_LRCORN_CHAR 'j' -# define SLSMG_CKBRD_CHAR 'a' -# define SLSMG_RTEE_CHAR 'u' -# define SLSMG_LTEE_CHAR 't' -# define SLSMG_UTEE_CHAR 'w' -# define SLSMG_DTEE_CHAR 'v' -# define SLSMG_PLUS_CHAR 'n' -# define SLSMG_DIAMOND_CHAR '`' -# define SLSMG_DEGREE_CHAR 'f' -# define SLSMG_PLMINUS_CHAR 'g' -# define SLSMG_BULLET_CHAR '~' -# define SLSMG_LARROW_CHAR ',' -# define SLSMG_RARROW_CHAR '+' -# define SLSMG_DARROW_CHAR '.' -# define SLSMG_UARROW_CHAR '-' -# define SLSMG_BOARD_CHAR 'h' -# define SLSMG_BLOCK_CHAR '0' +# define SLSMG_HLINE_CHAR (acs_map['q']) +# define SLSMG_VLINE_CHAR (acs_map['x']) +# define SLSMG_ULCORN_CHAR (acs_map['l']) +# define SLSMG_URCORN_CHAR (acs_map['k']) +# define SLSMG_LLCORN_CHAR (acs_map['m']) +# define SLSMG_LRCORN_CHAR (acs_map['j']) +# define SLSMG_CKBRD_CHAR (acs_map['a']) +# define SLSMG_RTEE_CHAR (acs_map['u']) +# define SLSMG_LTEE_CHAR (acs_map['t']) +# define SLSMG_UTEE_CHAR (acs_map['v']) +# define SLSMG_DTEE_CHAR (acs_map['w']) +# define SLSMG_PLUS_CHAR (acs_map['n']) +# define SLSMG_DIAMOND_CHAR (acs_map['`']) +# define SLSMG_DEGREE_CHAR (acs_map['f']) +# define SLSMG_PLMINUS_CHAR (acs_map['g']) +# define SLSMG_BULLET_CHAR (acs_map['~']) +# define SLSMG_LARROW_CHAR (acs_map[',']) +# define SLSMG_RARROW_CHAR (acs_map['+']) +# define SLSMG_DARROW_CHAR (acs_map['.']) +# define SLSMG_UARROW_CHAR (acs_map['-']) +# define SLSMG_BOARD_CHAR (acs_map['h']) +# define SLSMG_BLOCK_CHAR (acs_map['0']) +# +# define SLSMG_HLINE_CHAR_TERM 'q' +# define SLSMG_VLINE_CHAR_TERM 'x' +# define SLSMG_ULCORN_CHAR_TERM 'l' +# define SLSMG_URCORN_CHAR_TERM 'k' +# define SLSMG_LLCORN_CHAR_TERM 'm' +# define SLSMG_LRCORN_CHAR_TERM 'j' +# define SLSMG_CKBRD_CHAR_TERM 'a' +# define SLSMG_RTEE_CHAR_TERM 'u' +# define SLSMG_LTEE_CHAR_TERM 't' +# define SLSMG_UTEE_CHAR_TERM 'v' +# define SLSMG_DTEE_CHAR_TERM 'w' +# define SLSMG_PLUS_CHAR_TERM 'n' +# define SLSMG_DIAMOND_CHAR_TERM '`' +# define SLSMG_DEGREE_CHAR_TERM 'f' +# define SLSMG_PLMINUS_CHAR_TERM 'g' +# define SLSMG_BULLET_CHAR_TERM '~' +# define SLSMG_LARROW_CHAR_TERM ',' +# define SLSMG_RARROW_CHAR_TERM '+' +# define SLSMG_DARROW_CHAR_TERM '.' +# define SLSMG_UARROW_CHAR_TERM '-' +# define SLSMG_BOARD_CHAR_TERM 'h' +# define SLSMG_BLOCK_CHAR_TERM '0' # endif /* AMIGA */ #endif /* IBMPC_SYSTEM */ +#ifdef UTF8 +# define SLSMG_HLINE_CHAR_UNICODE 0x2500 +# define SLSMG_VLINE_CHAR_UNICODE 0x2502 +# define SLSMG_ULCORN_CHAR_UNICODE 0x250c +# define SLSMG_URCORN_CHAR_UNICODE 0x2510 +# define SLSMG_LLCORN_CHAR_UNICODE 0x2514 +# define SLSMG_LRCORN_CHAR_UNICODE 0x2518 +# define SLSMG_RTEE_CHAR_UNICODE 0x2524 +# define SLSMG_LTEE_CHAR_UNICODE 0x251c +# define SLSMG_UTEE_CHAR_UNICODE 0x2534 +# define SLSMG_DTEE_CHAR_UNICODE 0x252c +# define SLSMG_PLUS_CHAR_UNICODE 0x253c +# define SLSMG_CKBRD_CHAR_UNICODE 0x2592 +# define SLSMG_DIAMOND_CHAR_UNICODE 0x25c6 +# define SLSMG_DEGREE_CHAR_UNICODE 0x00b0 +# define SLSMG_PLMINUS_CHAR_UNICODE 0x00b1 +# define SLSMG_BULLET_CHAR_UNICODE 0x00b7 +# define SLSMG_LARROW_CHAR_UNICODE 0x2190 +# define SLSMG_RARROW_CHAR_UNICODE 0x2192 +# define SLSMG_DARROW_CHAR_UNICODE 0x2193 +# define SLSMG_UARROW_CHAR_UNICODE 0x2191 +# define SLSMG_BOARD_CHAR_UNICODE 0x2592 +# define SLSMG_BLOCK_CHAR_UNICODE 0x25ae +#endif + #ifndef IBMPC_SYSTEM # define SLSMG_COLOR_BLACK 0x000000 # define SLSMG_COLOR_RED 0x000001 --- slang-1.4.5/src/slcurses.c.acs 2002-07-09 00:03:57.000000000 -0400 +++ slang-1.4.5/src/slcurses.c 2002-07-09 00:09:03.000000000 -0400 @@ -331,40 +331,63 @@ /* SLtt_set_mono (A_BLINK >> 8, NULL, SLTT_BLINK_MASK); */ SLtt_set_mono ((A_BOLD|A_UNDERLINE) >> 8, NULL, SLTT_ULINE_MASK|SLTT_BOLD_MASK); SLtt_set_mono ((A_REVERSE|A_UNDERLINE) >> 8, NULL, SLTT_ULINE_MASK|SLTT_REV_MASK); + + SLcurses_init_acs_map(); + + return SLcurses_Stdscr; +} +void SLcurses_init_acs_map() +{ if (SLtt_Has_Alt_Charset) { - SLcurses_Acs_Map[SLSMG_ULCORN_CHAR] = SLSMG_ULCORN_CHAR | A_ALTCHARSET; - SLcurses_Acs_Map[SLSMG_URCORN_CHAR] = SLSMG_URCORN_CHAR | A_ALTCHARSET; - SLcurses_Acs_Map[SLSMG_LLCORN_CHAR] = SLSMG_LLCORN_CHAR | A_ALTCHARSET; - SLcurses_Acs_Map[SLSMG_LRCORN_CHAR] = SLSMG_LRCORN_CHAR | A_ALTCHARSET; - SLcurses_Acs_Map[SLSMG_UTEE_CHAR] = SLSMG_UTEE_CHAR | A_ALTCHARSET; - SLcurses_Acs_Map[SLSMG_DTEE_CHAR] = SLSMG_DTEE_CHAR | A_ALTCHARSET; - SLcurses_Acs_Map[SLSMG_LTEE_CHAR] = SLSMG_LTEE_CHAR | A_ALTCHARSET; - SLcurses_Acs_Map[SLSMG_RTEE_CHAR] = SLSMG_RTEE_CHAR | A_ALTCHARSET; - SLcurses_Acs_Map[SLSMG_VLINE_CHAR] = SLSMG_VLINE_CHAR | A_ALTCHARSET; - SLcurses_Acs_Map[SLSMG_HLINE_CHAR] = SLSMG_HLINE_CHAR | A_ALTCHARSET; - SLcurses_Acs_Map[SLSMG_PLUS_CHAR] = SLSMG_PLUS_CHAR | A_ALTCHARSET; - SLcurses_Acs_Map[SLSMG_CKBRD_CHAR] = SLSMG_CKBRD_CHAR | A_ALTCHARSET; + if (SLsmg_Is_Unicode) + { + SLcurses_Acs_Map['l'] = SLSMG_ULCORN_CHAR_UNICODE; + SLcurses_Acs_Map['k'] = SLSMG_URCORN_CHAR_UNICODE; + SLcurses_Acs_Map['m'] = SLSMG_LLCORN_CHAR_UNICODE; + SLcurses_Acs_Map['j'] = SLSMG_LRCORN_CHAR_UNICODE; + SLcurses_Acs_Map['v'] = SLSMG_UTEE_CHAR_UNICODE; + SLcurses_Acs_Map['w'] = SLSMG_DTEE_CHAR_UNICODE; + SLcurses_Acs_Map['t'] = SLSMG_LTEE_CHAR_UNICODE; + SLcurses_Acs_Map['u'] = SLSMG_RTEE_CHAR_UNICODE; + SLcurses_Acs_Map['x'] = SLSMG_VLINE_CHAR_UNICODE; + SLcurses_Acs_Map['q'] = SLSMG_HLINE_CHAR_UNICODE; + SLcurses_Acs_Map['n'] = SLSMG_PLUS_CHAR_UNICODE; + SLcurses_Acs_Map['a'] = SLSMG_CKBRD_CHAR_UNICODE; + } + else + { + SLcurses_Acs_Map['l'] = SLSMG_ULCORN_CHAR_TERM | A_ALTCHARSET; + SLcurses_Acs_Map['k'] = SLSMG_URCORN_CHAR_TERM | A_ALTCHARSET; + SLcurses_Acs_Map['m'] = SLSMG_LLCORN_CHAR_TERM | A_ALTCHARSET; + SLcurses_Acs_Map['j'] = SLSMG_LRCORN_CHAR_TERM | A_ALTCHARSET; + SLcurses_Acs_Map['v'] = SLSMG_UTEE_CHAR_TERM | A_ALTCHARSET; + SLcurses_Acs_Map['w'] = SLSMG_DTEE_CHAR_TERM | A_ALTCHARSET; + SLcurses_Acs_Map['t'] = SLSMG_LTEE_CHAR_TERM | A_ALTCHARSET; + SLcurses_Acs_Map['u'] = SLSMG_RTEE_CHAR_TERM | A_ALTCHARSET; + SLcurses_Acs_Map['x'] = SLSMG_VLINE_CHAR_TERM | A_ALTCHARSET; + SLcurses_Acs_Map['q'] = SLSMG_HLINE_CHAR_TERM | A_ALTCHARSET; + SLcurses_Acs_Map['n'] = SLSMG_PLUS_CHAR_TERM | A_ALTCHARSET; + SLcurses_Acs_Map['a'] = SLSMG_CKBRD_CHAR_TERM | A_ALTCHARSET; + } } else { /* ugly defaults to use on terminals which don't support graphics */ - SLcurses_Acs_Map[SLSMG_ULCORN_CHAR] = '+'; - SLcurses_Acs_Map[SLSMG_URCORN_CHAR] = '+'; - SLcurses_Acs_Map[SLSMG_LLCORN_CHAR] = '+'; - SLcurses_Acs_Map[SLSMG_LRCORN_CHAR] = '+'; - SLcurses_Acs_Map[SLSMG_UTEE_CHAR] = '+'; - SLcurses_Acs_Map[SLSMG_DTEE_CHAR] = '+'; - SLcurses_Acs_Map[SLSMG_LTEE_CHAR] = '+'; - SLcurses_Acs_Map[SLSMG_RTEE_CHAR] = '+'; - SLcurses_Acs_Map[SLSMG_VLINE_CHAR] = '|'; - SLcurses_Acs_Map[SLSMG_HLINE_CHAR] = '-'; - SLcurses_Acs_Map[SLSMG_PLUS_CHAR] = '+'; - SLcurses_Acs_Map[SLSMG_CKBRD_CHAR] = '#'; + SLcurses_Acs_Map['l'] = '+'; + SLcurses_Acs_Map['k'] = '+'; + SLcurses_Acs_Map['m'] = '+'; + SLcurses_Acs_Map['j'] = '+'; + SLcurses_Acs_Map['v'] = '+'; + SLcurses_Acs_Map['w'] = '+'; + SLcurses_Acs_Map['t'] = '+'; + SLcurses_Acs_Map['u'] = '+'; + SLcurses_Acs_Map['x'] = '|'; + SLcurses_Acs_Map['q'] = '-'; + SLcurses_Acs_Map['n'] = '+'; + SLcurses_Acs_Map['a'] = '#'; } - - return SLcurses_Stdscr; } int SLcurses_wattrset (SLcurses_Window_Type *w, SLtt_Char_Type ch) --- slang-1.4.5/src/slcurses.h.acs 2002-02-10 02:39:19.000000000 -0500 +++ slang-1.4.5/src/slcurses.h 2002-07-09 00:03:57.000000000 -0400 @@ -141,6 +141,7 @@ extern int SLcurses_nodelay (SLcurses_Window_Type *, int); extern SLcurses_Window_Type *SLcurses_initscr (void); +extern void SLcurses_init_acs_map (void); #define initscr SLcurses_initscr extern int SLcurses_cbreak (void); @@ -222,21 +222,21 @@ extern SLtt_Char_Type SLcurses_Acs_Map [128]; #define acs_map SLcurses_Acs_Map -#define ACS_ULCORNER (acs_map[SLSMG_ULCORN_CHAR]) -#define ACS_URCORNER (acs_map[SLSMG_URCORN_CHAR]) -#define ACS_LRCORNER (acs_map[SLSMG_LRCORN_CHAR]) -#define ACS_LLCORNER (acs_map[SLSMG_LLCORN_CHAR]) -#define ACS_TTEE (acs_map[SLSMG_UTEE_CHAR]) -#define ACS_LTEE (acs_map[SLSMG_LTEE_CHAR]) -#define ACS_RTEE (acs_map[SLSMG_RTEE_CHAR]) -#define ACS_BTEE (acs_map[SLSMG_DTEE_CHAR]) -#define ACS_PLUS (acs_map[SLSMG_PLUS_CHAR]) -#define ACS_VLINE (acs_map[SLSMG_VLINE_CHAR]) -#define ACS_HLINE (acs_map[SLSMG_HLINE_CHAR]) +#define ACS_ULCORNER SLSMG_ULCORN_CHAR +#define ACS_URCORNER SLSMG_URCORN_CHAR +#define ACS_LRCORNER SLSMG_LRCORN_CHAR +#define ACS_LLCORNER SLSMG_LLCORN_CHAR +#define ACS_TTEE SLSMG_UTEE_CHAR +#define ACS_LTEE SLSMG_LTEE_CHAR +#define ACS_RTEE SLSMG_RTEE_CHAR +#define ACS_BTEE SLSMG_DTEE_CHAR +#define ACS_PLUS SLSMG_PLUS_CHAR +#define ACS_VLINE SLSMG_VLINE_CHAR +#define ACS_HLINE SLSMG_HLINE_CHAR #define ACS_S1 '-' #define ACS_S9 '-' #define ACS_DIAMOND '&' -#define ACS_CKBOARD (acs_map[SLSMG_CKBRD_CHAR]) +#define ACS_CKBOARD SLSMG_CKBRD_CHAR #define ACS_DEGREE 'o' #define ACS_PLMINUS '+' #define ACS_BULLET '*' --- slang-1.4.5/src/slsmg.c.acs 2002-07-09 00:03:57.000000000 -0400 +++ slang-1.4.5/src/slsmg.c 2002-07-09 00:03:57.000000000 -0400 @@ -10,6 +10,9 @@ #include "slang.h" #include "_slang.h" +#include "slcurses.h" + +#include typedef struct Screen_Type { @@ -44,9 +47,9 @@ */ #ifndef IBMPC_SYSTEM -#define ALT_CHAR_FLAG 0x80 +static int ALT_CHAR_FLAG=0x80; #else -#define ALT_CHAR_FLAG 0x00 +static int ALT_CHAR_FLAG=0x00; #endif #if SLTT_HAS_NON_BCE_SUPPORT && !defined(IBMPC_SYSTEM) @@ -54,6 +57,8 @@ static int Bce_Color_Offset; #endif +int SLsmg_Is_Unicode = 0; +int SLsmg_Setlocale = 1; int SLsmg_Newline_Behavior = 0; int SLsmg_Backspace_Moves = 0; /* Backward compatibility. Not used. */ @@ -184,6 +189,8 @@ return;/* alt chars not used and the alt bit * is used to indicate a blink. */ + if (SLsmg_Is_Unicode) + ALT_CHAR_FLAG=0x00; if (i) This_Alt_Char = ALT_CHAR_FLAG; else This_Alt_Char = 0; @@ -348,6 +355,8 @@ #ifndef IBMPC_SYSTEM int alt_char_set_flag; + if (SLsmg_Is_Unicode) + ALT_CHAR_FLAG = 0x00; alt_char_set_flag = ((This_Color & ALT_CHAR_FLAG) && ((tt_Use_Blink_For_ACS == NULL) || (*tt_Use_Blink_For_ACS == 0))); @@ -1221,6 +1230,20 @@ Smg_Inited = 0; } +static void SLsmg_check_unicode(void) +{ + char *s,*t; + + if (SLsmg_Setlocale) + s = setlocale(LC_ALL, ""); + else + s = setlocale(LC_ALL, NULL); + if (s && (strstr(s,"UTF-8") || strstr(s,"utf8"))) { + SLsmg_Is_Unicode = 1; + return; + } + SLsmg_Is_Unicode = 0; +} static int init_smg (void) { @@ -1242,6 +1265,8 @@ This_Col = This_Row = Start_Col = Start_Row = 0; This_Alt_Char = 0; + SLsmg_check_unicode (); + SLcurses_init_acs_map (); SLsmg_set_color (0); Cls_Flag = 1; #ifndef IBMPC_SYSTEM @@ -1386,7 +1411,11 @@ } } +#ifdef UTF8 +void SLsmg_draw_object (int r, int c, SLsmg_Char_Type object) +#else void SLsmg_draw_object (int r, int c, unsigned char object) +#endif { This_Row = r; This_Col = c; @@ -1405,7 +1434,7 @@ void SLsmg_draw_hline (unsigned int n) { - static unsigned char hbuf[16]; + SLsmg_Char_Type ch = SLSMG_HLINE_CHAR; int count; int cmin, cmax; int final_col = This_Col + (int) n; @@ -1421,11 +1450,6 @@ return; } - if (hbuf[0] == 0) - { - SLMEMSET ((char *) hbuf, SLSMG_HLINE_CHAR, 16); - } - n = (unsigned int)(cmax - cmin); count = n / 16; @@ -1433,10 +1457,10 @@ This_Color |= ALT_CHAR_FLAG; This_Col = cmin; - SLsmg_write_nchars ((char *) hbuf, n % 16); - while (count-- > 0) + SLsmg_draw_object(This_Row, This_Col, ch); + while (n-- > 0) { - SLsmg_write_nchars ((char *) hbuf, 16); + SLsmg_draw_object(This_Row, This_Col, ch); } This_Color = save_color; @@ -1445,7 +1469,7 @@ void SLsmg_draw_vline (int n) { - unsigned char ch = SLSMG_VLINE_CHAR; + SLsmg_Char_Type ch = SLSMG_VLINE_CHAR; int c = This_Col, rmin, rmax; int final_row = This_Row + n; int save_color; @@ -1466,7 +1490,7 @@ for (This_Row = rmin; This_Row < rmax; This_Row++) { This_Col = c; - SLsmg_write_nchars ((char *) &ch, 1); + SLsmg_draw_object (This_Row, This_Col, ch); } This_Col = c; This_Row = final_row;