X-Git-Url: https://ncurses.scripts.mit.edu/?p=ncurses.git;a=blobdiff_plain;f=ncurses%2Fwin32con%2Fwin_driver.c;h=afc1a16815b7ccb83a4bbb8f4ba3bd0650271ba4;hp=c214639cd4df29e8025646f9af44a276a54ee39b;hb=cdbe3d3df7ca08989c4aaead5164309466e519eb;hpb=f79b52fddd95c7a6f1ead29ef9c39eb8cdf60795 diff --git a/ncurses/win32con/win_driver.c b/ncurses/win32con/win_driver.c index c214639c..afc1a168 100644 --- a/ncurses/win32con/win_driver.c +++ b/ncurses/win32con/win_driver.c @@ -1,5 +1,5 @@ /**************************************************************************** - * Copyright (c) 1998-2009,2010 Free Software Foundation, Inc. * + * Copyright (c) 1998-2010,2012 Free Software Foundation, Inc. * * * * Permission is hereby granted, free of charge, to any person obtaining a * * copy of this software and associated documentation files (the * @@ -28,7 +28,6 @@ /**************************************************************************** * Author: Juergen Pfeifer * - * * ****************************************************************************/ /* @@ -39,12 +38,12 @@ #include #define CUR my_term.type. -MODULE_ID("$Id: win_driver.c,v 1.10 2010/12/25 19:28:21 tom Exp $") +MODULE_ID("$Id: win_driver.c,v 1.13 2012/09/03 16:20:24 tom Exp $") #define WINMAGIC NCDRV_MAGIC(NCDRV_WINCONSOLE) #define AssertTCB() assert(TCB!=0 && TCB->magic==WINMAGIC) -#define SetSP() assert(TCB->csp!=0); sp = TCB->csp +#define SetSP() assert(TCB->csp!=0); sp = TCB->csp; (void) sp #define GenMap(vKey,key) MAKELONG(key, vKey) @@ -103,7 +102,7 @@ MapColor(bool fore, int color) } static WORD -MapAttr(TERMINAL_CONTROL_BLOCK * TCB, WORD res, chtype ch) +MapAttr(TERMINAL_CONTROL_BLOCK * TCB, WORD res, attr_t ch) { if (ch & A_COLOR) { int p; @@ -135,8 +134,67 @@ MapAttr(TERMINAL_CONTROL_BLOCK * TCB, WORD res, chtype ch) return res; } +#if USE_WIDEC_SUPPORT +/* + * TODO: support surrogate pairs + * TODO: support combining characters + * TODO: support acsc + * TODO: check wcwidth of base character, fill if needed for double-width + * TODO: _nc_wacs should be part of sp. + */ +static BOOL +con_write16(TERMINAL_CONTROL_BLOCK * TCB, int y, int x, cchar_t *str, int n) +{ + CHAR_INFO ci[n]; + COORD loc, siz; + SMALL_RECT rec; + int i; + cchar_t ch; + SCREEN *sp; + + AssertTCB(); + + if (TCB == 0 || InvalidConsoleHandle(TCB->hdl)) + return FALSE; + + SetSP(); + + for (i = 0; i < n; i++) { + ch = str[i]; + ci[i].Char.UnicodeChar = CharOf(ch); + ci[i].Attributes = MapAttr(TCB, + PropOf(TCB)->SBI.wAttributes, + AttrOf(ch)); + if (AttrOf(ch) & A_ALTCHARSET) { + if (_nc_wacs) { + int which = CharOf(ch); + if (which > 0 + && which < ACS_LEN + && CharOf(_nc_wacs[which]) != 0) { + ci[i].Char.UnicodeChar = CharOf(_nc_wacs[which]); + } else { + ci[i].Char.UnicodeChar = ' '; + } + } + } + } + + loc.X = (short) 0; + loc.Y = (short) 0; + siz.X = (short) n; + siz.Y = 1; + + rec.Left = (short) x; + rec.Top = (short) y; + rec.Right = (short) (x + n - 1); + rec.Bottom = rec.Top; + + return WriteConsoleOutputW(TCB->hdl, ci, siz, loc, &rec); +} +#define con_write(tcb, y, x, str, n) con_write16(tcb, y, x, str, n) +#else static BOOL -con_write(TERMINAL_CONTROL_BLOCK * TCB, int y, int x, chtype *str, int n) +con_write8(TERMINAL_CONTROL_BLOCK * TCB, int y, int x, chtype *str, int n) { CHAR_INFO ci[n]; COORD loc, siz; @@ -177,6 +235,8 @@ con_write(TERMINAL_CONTROL_BLOCK * TCB, int y, int x, chtype *str, int n) return WriteConsoleOutput(TCB->hdl, ci, siz, loc, &rec); } +#define con_write(tcb, y, x, str, n) con_write8(tcb, y, x, str, n) +#endif #define MARK_NOCHANGE(win,row) \ win->_line[row].firstchar = _NOCHANGE; \ @@ -197,16 +257,27 @@ drv_doupdate(TERMINAL_CONTROL_BLOCK * TCB) if ((CurScreen(sp)->_clear || NewScreen(sp)->_clear)) { int x; +#if USE_WIDEC_SUPPORT + cchar_t empty[Width]; + wchar_t blank[2] = + { + L' ', L'\0' + }; + + for (x = 0; x < Width; x++) + setcchar(&empty[x], blank, 0, 0, 0); +#else chtype empty[Width]; for (x = 0; x < Width; x++) empty[x] = ' '; +#endif for (y = 0; y < nonempty; y++) { con_write(TCB, y, 0, empty, Width); memcpy(empty, CurScreen(sp)->_line[y].text, - Width * sizeof(chtype)); + Width * sizeof(empty[0])); } CurScreen(sp)->_clear = FALSE; NewScreen(sp)->_clear = FALSE; @@ -219,13 +290,13 @@ drv_doupdate(TERMINAL_CONTROL_BLOCK * TCB) x1 = NewScreen(sp)->_line[y].lastchar; n = x1 - x0 + 1; if (n > 0) { - memcpy(CurScreen(sp)->_line[y].text + x0, - NewScreen(sp)->_line[y].text + x0, - n * sizeof(chtype)); + memcpy(&CurScreen(sp)->_line[y].text[x0], + &NewScreen(sp)->_line[y].text[x0], + n * sizeof(CurScreen(sp)->_line[y].text[x0])); con_write(TCB, y, x0, - ((chtype *) CurScreen(sp)->_line[y].text) + x0, n); + &CurScreen(sp)->_line[y].text[x0], n); /* mark line changed successfully */ if (y <= NewScreen(sp)->_maxy) { @@ -308,7 +379,7 @@ drv_CanHandle(TERMINAL_CONTROL_BLOCK * TCB, static int drv_dobeepflash(TERMINAL_CONTROL_BLOCK * TCB, - bool beepFlag GCC_UNUSED) + int beepFlag GCC_UNUSED) { SCREEN *sp; int res = ERR; @@ -348,7 +419,7 @@ drv_defaultcolors(TERMINAL_CONTROL_BLOCK * TCB, static void drv_setcolor(TERMINAL_CONTROL_BLOCK * TCB, - bool fore, + int fore, int color, int (*outc) (SCREEN *, int) GCC_UNUSED) { @@ -412,7 +483,7 @@ drv_setsize(TERMINAL_CONTROL_BLOCK * TCB GCC_UNUSED, } static int -drv_sgmode(TERMINAL_CONTROL_BLOCK * TCB, bool setFlag, TTY * buf) +drv_sgmode(TERMINAL_CONTROL_BLOCK * TCB, int setFlag, TTY * buf) { DWORD dwFlag = 0; tcflag_t iflag; @@ -479,7 +550,7 @@ drv_sgmode(TERMINAL_CONTROL_BLOCK * TCB, bool setFlag, TTY * buf) } static int -drv_mode(TERMINAL_CONTROL_BLOCK * TCB, bool progFlag, bool defFlag) +drv_mode(TERMINAL_CONTROL_BLOCK * TCB, int progFlag, int defFlag) { SCREEN *sp; TERMINAL *_term = (TERMINAL *) TCB; @@ -674,9 +745,9 @@ drv_init(TERMINAL_CONTROL_BLOCK * TCB) static void drv_initpair(TERMINAL_CONTROL_BLOCK * TCB, - short pair, - short f, - short b) + int pair, + int f, + int b) { SCREEN *sp; @@ -691,10 +762,10 @@ drv_initpair(TERMINAL_CONTROL_BLOCK * TCB, static void drv_initcolor(TERMINAL_CONTROL_BLOCK * TCB, - short color GCC_UNUSED, - short r GCC_UNUSED, - short g GCC_UNUSED, - short b GCC_UNUSED) + int color GCC_UNUSED, + int r GCC_UNUSED, + int g GCC_UNUSED, + int b GCC_UNUSED) { SCREEN *sp; @@ -704,9 +775,9 @@ drv_initcolor(TERMINAL_CONTROL_BLOCK * TCB, static void drv_do_color(TERMINAL_CONTROL_BLOCK * TCB, - short old_pair GCC_UNUSED, - short pair GCC_UNUSED, - bool reverse GCC_UNUSED, + int old_pair GCC_UNUSED, + int pair GCC_UNUSED, + int reverse GCC_UNUSED, int (*outc) (SCREEN *, int) GCC_UNUSED ) { @@ -778,7 +849,7 @@ drv_hwlabel(TERMINAL_CONTROL_BLOCK * TCB, static void drv_hwlabelOnOff(TERMINAL_CONTROL_BLOCK * TCB, - bool OnFlag GCC_UNUSED) + int OnFlag GCC_UNUSED) { SCREEN *sp; @@ -1080,7 +1151,6 @@ drv_read(TERMINAL_CONTROL_BLOCK * TCB, int *buf) BOOL b; DWORD nRead; WORD vk; - WORD sc; AssertTCB(); assert(buf); @@ -1096,7 +1166,6 @@ drv_read(TERMINAL_CONTROL_BLOCK * TCB, int *buf) continue; *buf = (int) inp_rec.Event.KeyEvent.uChar.AsciiChar; vk = inp_rec.Event.KeyEvent.wVirtualKeyCode; - sc = inp_rec.Event.KeyEvent.wVirtualScanCode; if (*buf == 0) { if (sp->_keypad_on) { *buf = MapKey(TCB, vk); @@ -1157,7 +1226,7 @@ drv_kyExist(TERMINAL_CONTROL_BLOCK * TCB, int keycode) } static int -drv_kpad(TERMINAL_CONTROL_BLOCK * TCB, bool flag GCC_UNUSED) +drv_kpad(TERMINAL_CONTROL_BLOCK * TCB, int flag GCC_UNUSED) { SCREEN *sp; int code = ERR; @@ -1172,7 +1241,7 @@ drv_kpad(TERMINAL_CONTROL_BLOCK * TCB, bool flag GCC_UNUSED) } static int -drv_keyok(TERMINAL_CONTROL_BLOCK * TCB, int keycode, bool flag) +drv_keyok(TERMINAL_CONTROL_BLOCK * TCB, int keycode, int flag) { int code = ERR; SCREEN *sp;