--- fhandler_console.cc.orig Thu Nov 30 16:00:31 2000 +++ fhandler_console.cc Thu Nov 30 16:01:33 2000 @@ -193,50 +193,139 @@ fhandler_console::read (void *pv, size_t return -1; /* seems to be failure */ } + /* check the event that occurred */ + switch (input_rec.EventType) + { + case KEY_EVENT: + if (!input_rec.Event.KeyEvent.bKeyDown) + continue; + #define ich (input_rec.Event.KeyEvent.uChar.AsciiChar) #define wch (input_rec.Event.KeyEvent.uChar.UnicodeChar) - /* check if we're just disposing of this one */ - - if (input_rec.EventType == WINDOW_BUFFER_SIZE_EVENT) - { - kill_pgrp (tc->getpgid (), SIGWINCH); - continue; - } - if (input_rec.EventType != KEY_EVENT || - !input_rec.Event.KeyEvent.bKeyDown) - continue; - - if (wch == 0 || - /* arrow/function keys */ - (input_rec.Event.KeyEvent.dwControlKeyState & ENHANCED_KEY)) - { - toadd = get_nonascii_key (input_rec, tmp); - if (!toadd) - continue; - nread = strlen (toadd); - } - else - { - tmp[1] = ich; - /* Need this check since US code page seems to have a bug when - converting a CTRL-U. */ - if ((unsigned char)ich > 0x7f) - OemToCharBuff (tmp + 1, tmp + 1, 1); - if (!(input_rec.Event.KeyEvent.dwControlKeyState & LEFT_ALT_PRESSED)) - toadd = tmp + 1; + if (wch == 0 || + /* arrow/function keys */ + (input_rec.Event.KeyEvent.dwControlKeyState & ENHANCED_KEY)) + { + toadd = get_nonascii_key (input_rec, tmp); + if (!toadd) + continue; + nread = strlen (toadd); + } else { - tmp[0] = '\033'; - tmp[1] = cyg_tolower (tmp[1]); - toadd = tmp; - nread++; + tmp[1] = ich; + /* Need this check since US code page seems to have a bug when + converting a CTRL-U. */ + if ((unsigned char)ich > 0x7f) + OemToCharBuff (tmp + 1, tmp + 1, 1); + if (!(input_rec.Event.KeyEvent.dwControlKeyState & LEFT_ALT_PRESSED)) + toadd = tmp + 1; + else + { + tmp[0] = '\033'; + tmp[1] = cyg_tolower (tmp[1]); + toadd = tmp; + nread++; + } } +#undef ich +#undef wch + break; + + case MOUSE_EVENT: + { + MOUSE_EVENT_RECORD & mouse_event = input_rec.Event.MouseEvent; + + /* Treat the double-click event like a regular button press */ + if (mouse_event.dwEventFlags == DOUBLE_CLICK) + { + syscall_printf("mouse: double-click -> click"); + mouse_event.dwEventFlags = 0; + } + + /* Did something other than a click occur? */ + if (mouse_event.dwEventFlags) + continue; + + /* If the mouse event occurred out of the area we can handle, + ignore it. */ + int x = mouse_event.dwMousePosition.X; + int y = mouse_event.dwMousePosition.Y; + if ((x + ' ' + 1 > 0xFF) || (y + ' ' + 1 > 0xFF)) + { + syscall_printf("mouse: position out of range"); + continue; + } + + /* Ignore unimportant mouse buttons */ + mouse_event.dwButtonState &= 0x7; + + /* This code assumes Windows never reports multiple button + events at the same time. */ + static DWORD dwLastButtonState = 0; + int b = 0; + char sz[32]; + if (mouse_event.dwButtonState == dwLastButtonState) + { + syscall_printf("mouse: button state unchanged"); + continue; + } + else if (mouse_event.dwButtonState < dwLastButtonState) + { + b = 3; + strcpy(sz, "btn up"); + } + else if ((mouse_event.dwButtonState & 1) != (dwLastButtonState & 1)) + { + b = 0; + strcpy(sz, "btn1 down"); + } + else if ((mouse_event.dwButtonState & 2) != (dwLastButtonState & 2)) + { + b = 1; + strcpy(sz, "btn2 down"); + } + else if ((mouse_event.dwButtonState & 4) != (dwLastButtonState & 4)) + { + b = 2; + strcpy(sz, "btn3 down"); + } + + /* Remember the current button state */ + dwLastButtonState = mouse_event.dwButtonState; + + static int nModifiers = 0; + /* If a button was pressed, remember the modifiers */ + if (b != 3) + { + nModifiers = 0; + if (mouse_event.dwControlKeyState & SHIFT_PRESSED) + nModifiers |= 0x4; + if (mouse_event.dwControlKeyState & (RIGHT_ALT_PRESSED|LEFT_ALT_PRESSED)) + nModifiers |= 0x8; + if (mouse_event.dwControlKeyState & (RIGHT_CTRL_PRESSED|LEFT_CTRL_PRESSED)) + nModifiers |= 0x10; + } + + b |= nModifiers; + + /* We can now create the code. */ + sprintf(tmp, "\033[M%c%c%c", b + ' ', x + ' ' + 1, y + ' ' + 1); + syscall_printf("mouse: %s at (%d,%d)", sz, x, y); + } + break; + + case WINDOW_BUFFER_SIZE_EVENT: + kill_pgrp (tc->getpgid (), SIGWINCH); + continue; + + default: + continue; } if (line_edit (toadd, nread)) break; -#undef ich } while (buflen) @@ -382,7 +471,7 @@ fhandler_console::open (const char *, in if (GetConsoleMode (get_io_handle (), &cflags)) { cflags |= ENABLE_PROCESSED_INPUT; - SetConsoleMode (get_io_handle (), ENABLE_WINDOW_INPUT | cflags); + SetConsoleMode (get_io_handle (), ENABLE_WINDOW_INPUT | ENABLE_MOUSE_INPUT | cflags); } TTYCLEARF (RSTCONS); @@ -545,7 +634,7 @@ fhandler_console::input_tcsetattr (int, tc->ti.c_lflag = 0; } - flags |= ENABLE_WINDOW_INPUT; + flags |= ENABLE_WINDOW_INPUT | ENABLE_MOUSE_INPUT; int res; if (flags == oflags)