# Report bugs and new terminal descriptions to
# bug-ncurses@gnu.org
#
-# $Revision: 1.821 $
-# $Date: 2020/09/30 00:00:44 $
+# $Revision: 1.825 $
+# $Date: 2020/10/11 00:01:33 $
#
# The original header is preserved below for reference. It is noted that there
# is a "newer" version which differs in some cosmetic details (but actually
blink=\E[5;7m, bold=\E[1;7m, invis=\E[7;8m,
is1=\E[7m\E7\E[H\E9\E8, rev=\E[m, rmso=\E[7m, rmul=\E[7m,
rs1=\E[H\E[7m\E[J$<156>,
- sgr=\E[%?%p2%t4;%;%?%p4%t5;%;%?%p6%t1;%;%?%p1%p2%|%p3%!%t7;
- %;%?%p7%t8;%;m\016,
+ sgr=\E[%?%p2%t4;%;%?%p4%t5;%;%?%p6%t1;%;%?%p1%p2%|%p3%!%|%t7
+ ;%;%?%p7%t8;%;m\016,
sgr0=\E[7m\016, smso=\E[m, smul=\E[4;7m,
# Ambassador with the DEC option, for partial vt100 compatibility.
aaa+dec|ann arbor ambassador in dec vt100 mode,
d230c|d230|Data General DASHER D230C,
blink=\E[5;50m, bold=\E[4;7;50m, dim=\E[2;50m, nel=\r\n,
rev=\E[7;50m, rmkx=\E[2;1v, rmso=\E[50m, rmul=\E[50m,
- sgr=\E[50%?%p1%p3%|%p6%|%t;7%{1}%e%{0}%;%PR%?%p4%t;5%{1}%e
- %{0}%;%PB%?%p2%p6%|%t;4%{1}%e%{0}%;%PU%?%p1%p5%|%t;2%{1}
- %e%{0}%;%PDm\E)%?%p9%t6\016%e4\017%;,
+ sgr=\E[%?%p1%p3%|%p6%|%t7;%{1}%e%{0}%;%PR%?%p4%t5;%{1}%e%{0}
+ %;%PB%?%p2%p6%|%t4;%{1}%e%{0}%;%PU%?%p1%p5%|%t2;%{1}%e
+ %{0}%;%PD50m\E)%?%p9%t6\016%e4\017%;,
sgr0=\E[50m\E)4\017, smkx=\E[2;0v, smso=\E[2;7;50m,
smul=\E[4;50m, use=dgkeys+7b, use=d220,
use=ibmega-c,
ibm6154|IBM 6154 Color displays,
blink@, bold=\E[12m, s0ds=\E[10m, s1ds=\E[11m, s2ds=\E[12m,
- sgr=\E[%?%p1%t;7%;%?%p2%t;4%;%?%p3%t;7%;%?%p4%t;5%;%?%p6%t;1
+ sgr=\E[%?%p1%t;7%;%?%p2%t;4%;%?%p3%t;7%;%?%p7%t;8%;%?%p6%t;1
2%;m,
sgr0=\E[0;10m, use=ibm5154,
ibm6153|IBM 6153 Black & White display,
blink@, bold=\E[12m, s0ds=\E[10m, s1ds=\E[11m, s2ds=\E[12m,
- sgr=\E[%?%p1%t;7%;%?%p2%t;4%;%?%p3%t;7%;%?%p4%t;5%;%?%p6%t;1
+ sgr=\E[%?%p1%t;7%;%?%p2%t;4%;%?%p3%t;7%;%?%p7%t;8%;%?%p6%t;1
2%;m,
sgr0=\E[0;10m, use=ibm5151,
ibm6153-90|IBM 6153 Black & White display,
B\E)0\E%/0n\E[P\031$<200>,
sc=\E7,
sgr=%?%p9%t\016%e\017%;\E[0%?%p1%p6%|%t;1%;%?%p2%t;4%;%?%p1
- %p3%|%t;7%;%?%p4%t;5%;m$<100>,
+ %p3%|%t;7%;%?%p4%t;5%;m$<120>,
sgr0=\017\E[0m$<120>, smacs=\016$<90>, smir=\E[4h$<80>,
smso=\E[7m$<30>, smul=\E[4m$<30>, tbc=\E[3g$<40>,
tsl=\E[>+1$<70>,
# + simplify mlterm initialization with DECSTR -TD
# + change tmux's kbs to ^? (report by Premysl Eric Janouch)
#
+# 2020-10-10
+# + correct sgr in aaa+rv (report by Florian Weimer) -TD
+# + fix some sgr inconsistencies in d230c, ibm6153, ibm6154,
+# ncrvt100an -TD
+#
######## SHANTIH! SHANTIH! SHANTIH!
#include <curses.priv.h>
-MODULE_ID("$Id: lib_win32con.c,v 1.2 2020/08/29 16:22:03 juergen Exp $")
+MODULE_ID("$Id: lib_win32con.c,v 1.3 2020/10/10 19:07:10 tom Exp $")
#ifdef _NC_WINDOWS
static int AnsiKey(WORD vKey);
static ULONGLONG tdiff(FILETIME fstart, FILETIME fend);
-\f
+
#define GenMap(vKey,key) MAKELONG(key, vKey)
static const LONG keylist[] =
{
_nc_console_vt_supported(void) {
OSVERSIONINFO osvi;
int res = 0;
-
+
T((T_CALLED("lib_win32con::_nc_console_vt_supported")));
ZeroMemory(&osvi, sizeof(OSVERSIONINFO));
osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
T((T_CALLED("lib_win32con::IsConsoleHandle(HANDLE=%p"),hdl));
EnsureInit();
-
+
if (!GetConsoleMode(hdl, &dwFlag)) {
T(("GetConsoleMode failed"));
} else {
result = TRUE;
}
-
+
returnBool(result);
}
}
NCURSES_EXPORT(int)
- _nc_console_setmode(HANDLE hdl, const TTY *arg)
+_nc_console_setmode(HANDLE hdl, const TTY *arg)
{
DWORD dwFlag = 0;
int code = ERR;
HANDLE alt;
-
+
if (arg) {
#ifdef TRACE
TTY TRCTTY;
#define TRCTTYIN(flag) TRCTTY.dwFlagIn=flag
#else
#define TRCTTYOUT(flag)
-#define TRCTTYIN(flag)
+#define TRCTTYIN(flag)
#endif
T(("lib_win32con:_nc_console_setmode %s", _nc_trace_ttymode(arg)));
if (hdl==WINCONSOLE.inp) {
dwFlag &= ~(VT_FLAG_IN);
TRCTTYIN(dwFlag);
SetConsoleMode(hdl, dwFlag);
-
+
alt = OutHandle();
dwFlag = arg->dwFlagOut;
if (WINCONSOLE.isTermInfoConsole)
dwFlag |= (VT_FLAG_OUT);
TRCTTYOUT(dwFlag);
SetConsoleMode(hdl, dwFlag);
-
+
alt=WINCONSOLE.inp;
dwFlag = arg->dwFlagIn | ENABLE_MOUSE_INPUT;
if (WINCONSOLE.isTermInfoConsole)
if (arg) {
DWORD dwFlag = 0;
HANDLE alt;
-
+
if (hdl==WINCONSOLE.inp) {
if(GetConsoleMode(hdl,&dwFlag)) {
arg->dwFlagIn = dwFlag;
}
NCURSES_EXPORT(int)
- _nc_console_flush(HANDLE hdl)
+_nc_console_flush(HANDLE hdl)
{
int code=OK;
-
+
T((T_CALLED("lib_win32con::_nc_console_flush(hdl=%p"),hdl));
-
+
if (hdl != INVALID_HANDLE_VALUE) {
if (hdl == WINCONSOLE.hdl ||
hdl == WINCONSOLE.inp ||
}
returnCode(code);
}
-\f
+
NCURSES_EXPORT(WORD)
_nc_console_MapColor(bool fore, int color)
{
save_original_screen(void)
{
bool result = FALSE;
-
+
WINCONSOLE.save_region.Top = 0;
WINCONSOLE.save_region.Left = 0;
WINCONSOLE.save_region.Bottom = (SHORT) (WINCONSOLE.SBI.dwSize.Y - 1);
WINCONSOLE.save_region.Right = (SHORT) (WINCONSOLE.SBI.dwSize.X - 1);
-
+
if (read_screen_data()) {
result = TRUE;
} else {
-
+
WINCONSOLE.save_region.Top = WINCONSOLE.SBI.srWindow.Top;
WINCONSOLE.save_region.Left = WINCONSOLE.SBI.srWindow.Left;
WINCONSOLE.save_region.Bottom = WINCONSOLE.SBI.srWindow.Bottom;
WINCONSOLE.save_region.Right = WINCONSOLE.SBI.srWindow.Right;
-
+
WINCONSOLE.window_only = TRUE;
-
+
if (read_screen_data()) {
result = TRUE;
}
}
-
+
T(("... save original screen contents %s", result ? "ok" : "err"));
return result;
}
COORD bufferCoord;
bool result = FALSE;
SMALL_RECT save_region = WINCONSOLE.save_region;
-
+
T(("... restoring %s",
WINCONSOLE.window_only ? "window" : "entire buffer"));
if (write_screen(WINCONSOLE.hdl,
WINCONSOLE.save_screen,
- WINCONSOLE.save_size,
+ WINCONSOLE.save_size,
bufferCoord,
&save_region)) {
result = TRUE;
bool result = FALSE;
COORD bufferCoord;
size_t want;
-
+
WINCONSOLE.save_size.X = (SHORT) (WINCONSOLE.save_region.Right
- WINCONSOLE.save_region.Left + 1);
WINCONSOLE.save_size.Y = (SHORT) (WINCONSOLE.save_region.Bottom
- WINCONSOLE.save_region.Top + 1);
-
+
want = (size_t) (WINCONSOLE.save_size.X * WINCONSOLE.save_size.Y);
-
+
if ((WINCONSOLE.save_screen = malloc(want * sizeof(CHAR_INFO))) != 0) {
bufferCoord.X = (SHORT) (WINCONSOLE.window_only ?
WINCONSOLE.SBI.srWindow.Left : 0);
bufferCoord.Y = (SHORT) (WINCONSOLE.window_only ?
WINCONSOLE.SBI.srWindow.Top : 0);
-
+
T(("... reading console %s %dx%d into %d,%d - %d,%d at %d,%d",
WINCONSOLE.window_only ? "window" : "buffer",
WINCONSOLE.save_size.Y, WINCONSOLE.save_size.X,
WINCONSOLE.save_region.Right,
bufferCoord.Y,
bufferCoord.X));
-
+
if (read_screen(WINCONSOLE.hdl,
WINCONSOLE.save_screen,
WINCONSOLE.save_size,
FreeAndNull(WINCONSOLE.save_screen);
}
}
-
+
return result;
}
SMALL_RECT rect;
COORD coord;
bool changed = FALSE;
-
+
T((T_CALLED("lib_win32con::_nc_console_set_scrollback(%s)"),
(normal
? "normal"
: "application")));
-
+
T(("... SBI.srWindow %d,%d .. %d,%d",
info->srWindow.Top,
info->srWindow.Left,
T(("... SBI.dwSize %dx%d",
info->dwSize.Y,
info->dwSize.X));
-
+
if (normal) {
rect = info->srWindow;
coord = info->dwSize;
} else {
int high = info->srWindow.Bottom - info->srWindow.Top + 1;
int wide = info->srWindow.Right - info->srWindow.Left + 1;
-
+
if (high < MIN_HIGH) {
T(("... height %d < %d", high, MIN_HIGH));
high = MIN_HIGH;
wide = MIN_WIDE;
changed = TRUE;
}
-
+
rect.Left =
rect.Top = 0;
rect.Right = (SHORT) (wide - 1);
rect.Bottom = (SHORT) (high - 1);
-
+
coord.X = (SHORT) wide;
coord.Y = (SHORT) high;
-
+
if (info->dwSize.Y != high ||
info->dwSize.X != wide ||
info->srWindow.Top != 0 ||
info->srWindow.Left != 0) {
changed = TRUE;
}
-
+
}
-
+
if (changed) {
T(("... coord %d,%d", coord.Y, coord.X));
T(("... rect %d,%d - %d,%d",
rect.Top, rect.Left,
rect.Bottom, rect.Right));
- SetConsoleScreenBufferSize(WINCONSOLE.hdl, coord); /* dwSize */
- SetConsoleWindowInfo(WINCONSOLE.hdl, TRUE, &rect); /* srWindow */
+ SetConsoleScreenBufferSize(WINCONSOLE.hdl, coord); /* dwSize */
+ SetConsoleWindowInfo(WINCONSOLE.hdl, TRUE, &rect); /* srWindow */
_nc_console_get_SBI();
}
returnVoid;
ustart.HighPart = fstart.dwHighDateTime;
uend.LowPart = fend.dwLowDateTime;
uend.HighPart = fend.dwHighDateTime;
-
+
diff = (uend.QuadPart - ustart.QuadPart) / 10000;
return diff;
}
decode_mouse(SCREEN *sp, int mask)
{
int result = 0;
-
+
(void) sp;
assert(sp && console_initialized);
-
+
if (mask & FROM_LEFT_1ST_BUTTON_PRESSED)
result |= BUTTON1_PRESSED;
if (mask & FROM_LEFT_2ND_BUTTON_PRESSED)
result |= BUTTON3_PRESSED;
if (mask & FROM_LEFT_4TH_BUTTON_PRESSED)
result |= BUTTON4_PRESSED;
-
+
if (mask & RIGHTMOST_BUTTON_PRESSED) {
switch (WINCONSOLE.numButtons) {
case 1:
result |= BUTTON3_PRESSED;
break;
case 4:
- result |= BUTTON4_PRESSED;
+ result |= BUTTON4_PRESSED;
break;
}
}
-
+
return result;
}
{
MEVENT work;
bool result = FALSE;
-
+
assert(sp);
-
+
sp->_drv_mouse_old_buttons = sp->_drv_mouse_new_buttons;
sp->_drv_mouse_new_buttons = mer.dwButtonState & BUTTON_MASK;
-
+
/*
* We're only interested if the button is pressed or released.
* FIXME: implement continuous event-tracking.
*/
if (sp->_drv_mouse_new_buttons != sp->_drv_mouse_old_buttons) {
memset(&work, 0, sizeof(work));
-
+
if (sp->_drv_mouse_new_buttons) {
work.bstate |=
(mmask_t) decode_mouse(sp,
>> 1);
result = TRUE;
}
-
+
work.x = mer.dwMousePosition.X;
work.y = mer.dwMousePosition.Y - AdjustY();
-
+
sp->_drv_mouse_fifo[sp->_drv_mouse_tail] = work;
sp->_drv_mouse_tail += 1;
}
{
WORD key1 = (LOWORD((*((const LONG *) el1)))) & 0x7fff;
WORD key2 = (LOWORD((*((const LONG *) el2)))) & 0x7fff;
-
+
return ((key1 < key2) ? -1 : ((key1 == key2) ? 0 : 1));
}
{
WORD key1 = HIWORD((*((const LONG *) el1)));
WORD key2 = HIWORD((*((const LONG *) el2)));
-
+
return ((key1 < key2) ? -1 : ((key1 == key2) ? 0 : 1));
}
MapKey(WORD vKey)
{
int code = -1;
-
+
if (!WINCONSOLE.isTermInfoConsole) {
WORD nKey = 0;
void *res;
LONG key = GenMap(vKey, 0);
-
+
res = bsearch(&key,
WINCONSOLE.map,
(size_t) (N_INI + FKEYS),
AnsiKey(WORD vKey)
{
int code = -1;
-
+
if (!WINCONSOLE.isTermInfoConsole) {
WORD nKey = 0;
void *res;
LONG key = GenMap(vKey, 0);
-
+
res = bsearch(&key,
WINCONSOLE.ansi_map,
(size_t) (N_INI + FKEYS),
WORD vKey;
void *res;
LONG key = GenMap(0, (WORD) keycode);
-
+
T((T_CALLED("lib_win32con::_nc_console_keyok(%d, %d)"), keycode, flag));
-
+
res = bsearch(&key,
WINCONSOLE.rmap,
(size_t) (N_INI + FKEYS),
void *res;
bool found = FALSE;
LONG key = GenMap(0, (WORD) keycode);
-
+
T((T_CALLED("lib_win32con::_nc_console_keyExist(%d)"), keycode));
res = bsearch(&key,
WINCONSOLE.rmap,
FILETIME fend;
int diff;
bool isNoDelay = (milliseconds == 0);
-
+
#ifdef NCURSES_WGETCH_EVENTS
- (void) evl; /* TODO: implement wgetch-events */
+ (void) evl; /* TODO: implement wgetch-events */
#endif
-
+
#define IGNORE_CTRL_KEYS (SHIFT_PRESSED|LEFT_ALT_PRESSED|RIGHT_ALT_PRESSED| \
LEFT_CTRL_PRESSED|RIGHT_CTRL_PRESSED)
#define CONSUME() ReadConsoleInput(hdl,&inp_rec,1,&nRead)
-
+
assert(sp);
-
+
TR(TRACE_IEVENT, ("start twait: hdl=%p, %d milliseconds, mode: %d",
hdl, milliseconds, mode));
-
+
if (milliseconds < 0)
milliseconds = INFINITY;
-
+
memset(&inp_rec, 0, sizeof(inp_rec));
-
+
while (true) {
if (!isNoDelay) {
GetSystemTimeAsFileTime(&fstart);
if (milliseconds< 0)
break;
}
-
+
if (isNoDelay || (rc == WAIT_OBJECT_0)) {
if (mode) {
nRead = 0;
b = GetNumberOfConsoleInputEvents(hdl, &nRead);
if (!b) {
T(("twait:err GetNumberOfConsoleInputEvents"));
- }
+ }
if (isNoDelay && b) {
T(("twait: Events Available: %d",nRead));
if (nRead==0) {
if (inp_rec.Event.KeyEvent.bKeyDown) {
T(("twait:event KeyDown"));
if (!WINCONSOLE.isTermInfoConsole &&
- (0 == ch)) {
+ (0 == ch)) {
int nKey = MapKey(vk);
if (nKey < 0) {
CONSUME();
}
}
end:
-
+
TR(TRACE_IEVENT, ("end twait: returned %d (%d), remaining time %d msec",
code, GetLastError(), milliseconds));
-
+
if (timeleft)
*timeleft = milliseconds;
-
+
return code;
}
NCURSES_EXPORT(int)
_nc_console_testmouse(
- SCREEN *sp,
- HANDLE hdl,
- int delay
- EVENTLIST_2nd(_nc_eventlist * evl))
+ SCREEN *sp,
+ HANDLE hdl,
+ int delay
+ EVENTLIST_2nd(_nc_eventlist * evl))
{
int rc = 0;
-
+
assert(sp);
-
+
if (sp->_drv_mouse_head < sp->_drv_mouse_tail) {
rc = TW_MOUSE;
} else {
NCURSES_EXPORT(int)
_nc_console_read(
- SCREEN *sp,
- HANDLE hdl,
- int *buf)
+ SCREEN *sp,
+ HANDLE hdl,
+ int *buf)
{
int rc = -1;
INPUT_RECORD inp_rec;
BOOL b;
DWORD nRead;
WORD vk;
-
+
assert(sp);
assert(buf);
-
+
memset(&inp_rec, 0, sizeof(inp_rec));
-
+
T((T_CALLED("lib_win32con::_nc_console_read(%p)"), sp));
-
+
while ((b = ReadConsoleInput(hdl, &inp_rec, 1, &nRead))) {
if (b && nRead > 0) {
if (rc < 0)
/* Our replacement for the systems _isatty to include also
a test for mintty. This is called from the NC_ISATTY macro
defined in curses.priv.h
-
- Return codes:
+
+ Return codes:
- 0 : Not a TTY
- 1 : A Windows character device detected by _isatty
- 2 : A future implementation may return 2 for mintty
{
int result = 0;
T((T_CALLED("lib_win32con::_nc_console_isatty(%d"),fd));
-
+
if (_isatty(fd))
result = 1;
#ifdef _NC_CHECK_MINTTY
_nc_console_checkinit(bool initFlag, bool assumeTermInfo)
{
bool res = FALSE;
-
+
T((T_CALLED("lib_win32con::_nc_console_checkinit(initFlag=%d, assumeTermInfo=%d)"),
initFlag,assumeTermInfo));
WORD a;
BOOL buffered = FALSE;
BOOL b;
-
+
START_TRACE();
WINCONSOLE.isTermInfoConsole = assumeTermInfo;
-
+
WINCONSOLE.map = (LPDWORD)malloc(sizeof(DWORD)*MAPSIZE);
WINCONSOLE.rmap = (LPDWORD)malloc(sizeof(DWORD)*MAPSIZE);
WINCONSOLE.ansi_map = (LPDWORD)malloc(sizeof(DWORD)*MAPSIZE);
-
+
for (i = 0; i < (N_INI + FKEYS); i++) {
if (i < N_INI) {
WINCONSOLE.rmap[i] = WINCONSOLE.map[i] =
(size_t) (MAPSIZE),
sizeof(keylist[0]),
rkeycompare);
-
+
if (GetNumberOfConsoleMouseButtons(&num_buttons)) {
WINCONSOLE.numButtons = (int) num_buttons;
} else {
WINCONSOLE.numButtons = 1;
}
-
+
a = _nc_console_MapColor(true, COLOR_WHITE) |
_nc_console_MapColor(false, COLOR_BLACK);
for (i = 0; i < CON_NUMPAIRS; i++)
WINCONSOLE.pairs[i] = a;
-
+
WINCONSOLE.inp = GetStdHandle(STD_INPUT_HANDLE);
WINCONSOLE.out = GetStdHandle(STD_OUTPUT_HANDLE);
WINCONSOLE.hdl = WINCONSOLE.out;
-
+
GetConsoleMode(WINCONSOLE.inp,&WINCONSOLE.originalMode.dwFlagIn);
GetConsoleMode(WINCONSOLE.out,&WINCONSOLE.originalMode.dwFlagOut);
-
+
if (!WINCONSOLE.isTermInfoConsole) {
b = AllocConsole();
-
+
if (!b)
b = AttachConsole(ATTACH_PARENT_PROCESS);
-
+
if (getenv("NCGDB") || getenv("NCURSES_CONSOLE2")) {
T(("... will not buffer console"));
} else {
TERM variable is set to #win32con, but actually
Windows supports virtual terminal processing.
So if terminfo functions are used in this setup,
- they actually may work.
+ they actually may work.
*/
_setmode(fileno(stdin) ,_O_BINARY);
_setmode(fileno(stdout),_O_BINARY);
-
+
if (WINCONSOLE.hdl != INVALID_HANDLE_VALUE) {
WINCONSOLE.buffered = buffered;
_nc_console_get_SBI();
(WINCONSOLE.save_CI.bVisible ? "" : "not-"),
(int) WINCONSOLE.save_CI.dwSize));
}
-
+
WINCONSOLE.initialized = TRUE;
console_initialized = TRUE;
}