/****************************************************************************
- * 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 *
/****************************************************************************
* Author: Juergen Pfeifer *
- * *
****************************************************************************/
/*
*/
#include <curses.priv.h>
+#define CUR my_term.type.
-MODULE_ID("$Id: win_driver.c,v 1.6 2010/02/06 19:55:44 tom Exp $")
+MODULE_ID("$Id: win_driver.c,v 1.11 2012/02/18 20:28:25 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)
AssertTCB();
SetSP();
- p = PAIR_NUMBER(ch);
+ p = PairNumber(ch);
if (p > 0 && p < NUMPAIRS && TCB != 0 && sp != 0) {
WORD a;
a = PropOf(TCB)->pairs[p];
{
bool code = FALSE;
- T((T_CALLED("drv_CanHandle(%p)"), TCB));
+ T((T_CALLED("win32con::drv_CanHandle(%p)"), TCB));
assert(TCB != 0);
assert(tname != 0);
TCB->magic = WINMAGIC;
- if (*tname == 0 || *tname == 0 || strcmp(tname, "unknown") == 0) {
+ if (*tname == 0 || *tname == 0) {
code = TRUE;
+ } else {
+ TERMINAL my_term;
+ int status;
+
+ code = FALSE;
+#if (USE_DATABASE || USE_TERMCAP)
+ status = _nc_setup_tinfo(tname, &my_term.type);
+#else
+ status = TGETENT_NO;
+#endif
+ if (status != TGETENT_YES) {
+ const TERMTYPE *fallback = _nc_fallback(tname);
+
+ if (fallback) {
+ my_term.type = *fallback;
+ status = TGETENT_YES;
+ } else if (!strcmp(tname, "unknown")) {
+ code = TRUE;
+ }
+ }
+ if (status == TGETENT_YES) {
+ if (generic_type || hard_copy)
+ code = TRUE;
+ }
+ }
+
+ if (code) {
if ((TCB->term.type.Booleans) == 0) {
_nc_init_entry(&(TCB->term.type));
}
static int
drv_dobeepflash(TERMINAL_CONTROL_BLOCK * TCB,
- bool beepFlag GCC_UNUSED)
+ int beepFlag GCC_UNUSED)
{
SCREEN *sp;
int res = ERR;
static void
drv_setcolor(TERMINAL_CONTROL_BLOCK * TCB,
- bool fore,
+ int fore,
int color,
int (*outc) (SCREEN *, int) 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;
}
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;
static void
drv_release(TERMINAL_CONTROL_BLOCK * TCB)
{
- T((T_CALLED("drv_release(%p)"), TCB));
+ T((T_CALLED("win32con::drv_release(%p)"), TCB));
AssertTCB();
if (TCB->prop)
static void
drv_init(TERMINAL_CONTROL_BLOCK * TCB)
{
- T((T_CALLED("drv_init(%p)"), TCB));
+ DWORD num_buttons;
+
+ T((T_CALLED("win32con::drv_init(%p)"), TCB));
AssertTCB();
TCB->info.nocolorvideo = 1;
TCB->info.tabsize = 8;
+ if (GetNumberOfConsoleMouseButtons(&num_buttons)) {
+ T(("mouse has %ld buttons", num_buttons));
+ TCB->info.numbuttons = num_buttons;
+ } else {
+ TCB->info.numbuttons = 1;
+ }
+
TCB->info.defaultPalette = _nc_cga_palette;
for (i = 0; i < (N_INI + FKEYS); i++) {
static void
drv_initpair(TERMINAL_CONTROL_BLOCK * TCB,
- short pair,
- short f,
- short b)
+ int pair,
+ int f,
+ int b)
{
SCREEN *sp;
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;
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
)
{
sp->_mouse_type = M_TERM_DRIVER;
}
+static int
+drv_testmouse(TERMINAL_CONTROL_BLOCK * TCB, int delay)
+{
+ int rc = 0;
+ SCREEN *sp;
+
+ AssertTCB();
+ SetSP();
+
+ if (sp->_drv_mouse_head < sp->_drv_mouse_tail) {
+ rc = TW_MOUSE;
+ } else {
+ rc = TCBOf(sp)->drv->twait(TCBOf(sp),
+ TWAIT_MASK,
+ delay,
+ (int *) 0
+ EVENTLIST_2nd(evl));
+ }
+
+ return rc;
+}
+
static int
drv_mvcur(TERMINAL_CONTROL_BLOCK * TCB,
int yold GCC_UNUSED, int xold GCC_UNUSED,
static void
drv_hwlabelOnOff(TERMINAL_CONTROL_BLOCK * TCB,
- bool OnFlag GCC_UNUSED)
+ int OnFlag GCC_UNUSED)
{
SCREEN *sp;
return milliseconds;
}
+#define BUTTON_MASK (FROM_LEFT_1ST_BUTTON_PRESSED | \
+ FROM_LEFT_2ND_BUTTON_PRESSED | \
+ FROM_LEFT_3RD_BUTTON_PRESSED | \
+ FROM_LEFT_4TH_BUTTON_PRESSED | \
+ RIGHTMOST_BUTTON_PRESSED)
+
+static int
+decode_mouse(TERMINAL_CONTROL_BLOCK * TCB, int mask)
+{
+ SCREEN *sp;
+ int result = 0;
+
+ AssertTCB();
+ SetSP();
+
+ if (mask & FROM_LEFT_1ST_BUTTON_PRESSED)
+ result |= BUTTON1_PRESSED;
+ if (mask & FROM_LEFT_2ND_BUTTON_PRESSED)
+ result |= BUTTON2_PRESSED;
+ if (mask & FROM_LEFT_3RD_BUTTON_PRESSED)
+ result |= BUTTON3_PRESSED;
+ if (mask & FROM_LEFT_4TH_BUTTON_PRESSED)
+ result |= BUTTON4_PRESSED;
+
+ if (mask & RIGHTMOST_BUTTON_PRESSED) {
+ switch (TCB->info.numbuttons) {
+ case 1:
+ result |= BUTTON1_PRESSED;
+ break;
+ case 2:
+ result |= BUTTON2_PRESSED;
+ break;
+ case 3:
+ result |= BUTTON3_PRESSED;
+ break;
+ case 4:
+ result |= BUTTON4_PRESSED;
+ break;
+ }
+ }
+
+ return result;
+}
+
static int
drv_twait(TERMINAL_CONTROL_BLOCK * TCB,
int mode,
EVENTLIST_2nd(_nc_eventlist * evl))
{
SCREEN *sp;
- INPUT_RECORD inp;
+ INPUT_RECORD inp_rec;
BOOL b;
DWORD nRead = 0, rc = -1;
int code = 0;
int diff;
bool isImmed = (milliseconds == 0);
-#define CONSUME() ReadConsoleInput(TCB->inp,&inp,1,&nRead)
+#define CONSUME() ReadConsoleInput(TCB->inp,&inp_rec,1,&nRead)
AssertTCB();
SetSP();
+ TR(TRACE_IEVENT, ("start twait: %d milliseconds, mode: %d",
+ milliseconds, mode));
+
if (milliseconds < 0)
milliseconds = INFINITY;
- memset(&inp, 0, sizeof(inp));
+ memset(&inp_rec, 0, sizeof(inp_rec));
while (true) {
GetSystemTimeAsFileTime(&fstart);
if (mode) {
b = GetNumberOfConsoleInputEvents(TCB->inp, &nRead);
if (b && nRead > 0) {
- b = PeekConsoleInput(TCB->inp, &inp, 1, &nRead);
+ b = PeekConsoleInput(TCB->inp, &inp_rec, 1, &nRead);
if (b && nRead > 0) {
- switch (inp.EventType) {
+ switch (inp_rec.EventType) {
case KEY_EVENT:
if (mode & TW_INPUT) {
- WORD vk = inp.Event.KeyEvent.wVirtualKeyCode;
- char ch = inp.Event.KeyEvent.uChar.AsciiChar;
+ WORD vk = inp_rec.Event.KeyEvent.wVirtualKeyCode;
+ char ch = inp_rec.Event.KeyEvent.uChar.AsciiChar;
- if (inp.Event.KeyEvent.bKeyDown) {
+ if (inp_rec.Event.KeyEvent.bKeyDown) {
if (0 == ch) {
int nKey = MapKey(TCB, vk);
if ((nKey < 0) || FALSE == sp->_keypad_on) {
}
continue;
case MOUSE_EVENT:
- if (0 && mode & TW_MOUSE) {
+ if (decode_mouse(TCB,
+ (inp_rec.Event.MouseEvent.dwButtonState
+ & BUTTON_MASK)) == 0) {
+ CONSUME();
+ } else if (mode & TW_MOUSE) {
code = TW_MOUSE;
goto end;
- } else
- continue;
+ }
+ continue;
default:
SetConsoleActiveScreenBuffer(!PropOf(TCB)->progMode ?
TCB->hdl : TCB->out);
}
}
end:
+
+ TR(TRACE_IEVENT, ("end twait: returned %d (%d), remaining time %d msec",
+ code, errno, milliseconds));
+
if (timeleft)
*timeleft = milliseconds;
return code;
}
-#define BUTTON_MASK (FROM_LEFT_1ST_BUTTON_PRESSED | \
- FROM_LEFT_2ND_BUTTON_PRESSED | \
- FROM_LEFT_3RD_BUTTON_PRESSED)
-
static bool
-handle_mouse(SCREEN *sp, MOUSE_EVENT_RECORD mer)
+handle_mouse(TERMINAL_CONTROL_BLOCK * TCB, MOUSE_EVENT_RECORD mer)
{
+ SCREEN *sp;
MEVENT work;
bool result = FALSE;
+ AssertTCB();
+ SetSP();
+
sp->_drv_mouse_old_buttons = sp->_drv_mouse_new_buttons;
sp->_drv_mouse_new_buttons = mer.dwButtonState & BUTTON_MASK;
if (sp->_drv_mouse_new_buttons) {
- if (sp->_drv_mouse_new_buttons & FROM_LEFT_1ST_BUTTON_PRESSED)
- work.bstate |= BUTTON1_PRESSED;
- if (sp->_drv_mouse_new_buttons & FROM_LEFT_2ND_BUTTON_PRESSED)
- work.bstate |= BUTTON2_PRESSED;
- if (sp->_drv_mouse_new_buttons & FROM_LEFT_3RD_BUTTON_PRESSED)
- work.bstate |= BUTTON3_PRESSED;
- if (sp->_drv_mouse_new_buttons & FROM_LEFT_4TH_BUTTON_PRESSED)
- work.bstate |= BUTTON4_PRESSED;
+ work.bstate |= decode_mouse(TCB, sp->_drv_mouse_new_buttons);
} else {
- if (sp->_drv_mouse_old_buttons & FROM_LEFT_1ST_BUTTON_PRESSED)
- work.bstate |= BUTTON1_RELEASED;
- if (sp->_drv_mouse_old_buttons & FROM_LEFT_2ND_BUTTON_PRESSED)
- work.bstate |= BUTTON2_RELEASED;
- if (sp->_drv_mouse_old_buttons & FROM_LEFT_3RD_BUTTON_PRESSED)
- work.bstate |= BUTTON3_RELEASED;
- if (sp->_drv_mouse_old_buttons & FROM_LEFT_4TH_BUTTON_PRESSED)
- work.bstate |= BUTTON4_RELEASED;
+ /* cf: BUTTON_PRESSED, BUTTON_RELEASED */
+ work.bstate |= (decode_mouse(TCB, sp->_drv_mouse_old_buttons) >> 1);
result = TRUE;
}
{
SCREEN *sp;
int n = 1;
- INPUT_RECORD inp;
+ INPUT_RECORD inp_rec;
BOOL b;
DWORD nRead;
WORD vk;
- WORD sc;
AssertTCB();
assert(buf);
SetSP();
- memset(&inp, 0, sizeof(inp));
+ memset(&inp_rec, 0, sizeof(inp_rec));
- T((T_CALLED("drv_read(%p)"), TCB));
- while ((b = ReadConsoleInput(TCB->inp, &inp, 1, &nRead))) {
+ T((T_CALLED("win32con::drv_read(%p)"), TCB));
+ while ((b = ReadConsoleInput(TCB->inp, &inp_rec, 1, &nRead))) {
if (b && nRead > 0) {
- if (inp.EventType == KEY_EVENT) {
- if (!inp.Event.KeyEvent.bKeyDown)
+ if (inp_rec.EventType == KEY_EVENT) {
+ if (!inp_rec.Event.KeyEvent.bKeyDown)
continue;
- *buf = (int) inp.Event.KeyEvent.uChar.AsciiChar;
- vk = inp.Event.KeyEvent.wVirtualKeyCode;
- sc = inp.Event.KeyEvent.wVirtualScanCode;
+ *buf = (int) inp_rec.Event.KeyEvent.uChar.AsciiChar;
+ vk = inp_rec.Event.KeyEvent.wVirtualKeyCode;
if (*buf == 0) {
if (sp->_keypad_on) {
*buf = MapKey(TCB, vk);
} else { /* *buf != 0 */
break;
}
- } else if (inp.EventType == MOUSE_EVENT) {
- if (handle_mouse(sp, inp.Event.MouseEvent)) {
+ } else if (inp_rec.EventType == MOUSE_EVENT) {
+ if (handle_mouse(TCB, inp_rec.Event.MouseEvent)) {
*buf = KEY_MOUSE;
break;
}
}
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;
}
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;
drv_initcolor, /* initcolor */
drv_do_color, /* docolor */
drv_initmouse, /* initmouse */
+ drv_testmouse, /* testmouse */
drv_setfilter, /* setfilter */
drv_hwlabel, /* hwlabel */
drv_hwlabelOnOff, /* hwlabelOnOff */