]> ncurses.scripts.mit.edu Git - ncurses.git/blobdiff - ncurses/win32con/win_driver.c
ncurses 5.7 - patch 20100410
[ncurses.git] / ncurses / win32con / win_driver.c
index 3beb0b379cacf668b50e9b2df75827de4223dd40..2b159b18316de98df9c7415c3c05b39d6413a65e 100644 (file)
@@ -38,7 +38,7 @@
 
 #include <curses.priv.h>
 
-MODULE_ID("$Id: win_driver.c,v 1.7 2010/03/31 23:21:39 tom Exp $")
+MODULE_ID("$Id: win_driver.c,v 1.8 2010/04/10 19:42:47 tom Exp $")
 
 #define WINMAGIC NCDRV_MAGIC(NCDRV_WINCONSOLE)
 
@@ -568,6 +568,8 @@ drv_release(TERMINAL_CONTROL_BLOCK * TCB)
 static void
 drv_init(TERMINAL_CONTROL_BLOCK * TCB)
 {
+    DWORD num_buttons;
+
     T((T_CALLED("drv_init(%p)"), TCB));
 
     AssertTCB();
@@ -610,6 +612,13 @@ drv_init(TERMINAL_CONTROL_BLOCK * TCB)
        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++) {
@@ -690,6 +699,28 @@ drv_initmouse(TERMINAL_CONTROL_BLOCK * TCB)
     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,
@@ -818,6 +849,50 @@ Adjust(int milliseconds, int diff)
     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,
@@ -840,6 +915,9 @@ drv_twait(TERMINAL_CONTROL_BLOCK * TCB,
     AssertTCB();
     SetSP();
 
+    TR(TRACE_IEVENT, ("start twait: %d milliseconds, mode: %d",
+                     milliseconds, mode));
+
     if (milliseconds < 0)
        milliseconds = INFINITY;
 
@@ -883,11 +961,15 @@ drv_twait(TERMINAL_CONTROL_BLOCK * TCB,
                            }
                            continue;
                        case MOUSE_EVENT:
-                           if (0 && mode & TW_MOUSE) {
+                           if (decode_mouse(TCB,
+                                            (inp.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);
@@ -908,22 +990,26 @@ drv_twait(TERMINAL_CONTROL_BLOCK * TCB,
        }
     }
   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;
 
@@ -937,25 +1023,12 @@ handle_mouse(SCREEN *sp, MOUSE_EVENT_RECORD mer)
 
        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;
        }
@@ -1009,7 +1082,7 @@ drv_read(TERMINAL_CONTROL_BLOCK * TCB, int *buf)
                    break;
                }
            } else if (inp.EventType == MOUSE_EVENT) {
-               if (handle_mouse(sp, inp.Event.MouseEvent)) {
+               if (handle_mouse(TCB, inp.Event.MouseEvent)) {
                    *buf = KEY_MOUSE;
                    break;
                }
@@ -1119,6 +1192,7 @@ NCURSES_EXPORT_VAR (TERM_DRIVER) _nc_WIN_DRIVER = {
        drv_initcolor,          /* initcolor */
        drv_do_color,           /* docolor */
        drv_initmouse,          /* initmouse */
+       drv_testmouse,          /* testmouse */
        drv_setfilter,          /* setfilter */
        drv_hwlabel,            /* hwlabel */
        drv_hwlabelOnOff,       /* hwlabelOnOff */