diff --git a/winsup/cygwin/ChangeLog b/winsup/cygwin/ChangeLog index d28486f33..508f05d3d 100644 --- a/winsup/cygwin/ChangeLog +++ b/winsup/cygwin/ChangeLog @@ -1,3 +1,13 @@ +Thu Dec 14 23:37:51 2000 Christopher Faylor + + * fhandler.h (fhandler_console): Add additional argument to + char_command method. + * fhandler_console.cc (fhandler_console::read): Revert previously + misapplied patch. + (fhandler_console::char_command): Add a second argument. + (fhandler_console::write): Recognize when a '?' is found after a + [. + Tue Dec 5 17:06:00 2000 Corinna Vinschen * net.cc (cygwin_rexec): Eliminate superfluous call to diff --git a/winsup/cygwin/fhandler.h b/winsup/cygwin/fhandler.h index 9010a17a5..27a5cb942 100644 --- a/winsup/cygwin/fhandler.h +++ b/winsup/cygwin/fhandler.h @@ -595,7 +595,7 @@ private: void cursor_get (int *, int *); void cursor_rel (int, int); const unsigned char * write_normal (unsigned const char*, unsigned const char *); - void char_command (char); + void char_command (char, bool); int output_tcsetattr (int a, const struct termios *t); /* Input calls */ diff --git a/winsup/cygwin/fhandler_console.cc b/winsup/cygwin/fhandler_console.cc index 270e3856a..22a88ed95 100644 --- a/winsup/cygwin/fhandler_console.cc +++ b/winsup/cygwin/fhandler_console.cc @@ -193,139 +193,50 @@ fhandler_console::read (void *pv, size_t buflen) 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) - 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 && current_codepage == ansi_cp) - 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; + /* check if we're just disposing of this one */ - 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: + 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; - default: - 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 && current_codepage == ansi_cp) + 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++; + } } if (line_edit (toadd, nread)) break; +#undef ich } while (buflen) @@ -471,7 +382,7 @@ fhandler_console::open (const char *, int flags, mode_t) if (GetConsoleMode (get_io_handle (), &cflags)) { cflags |= ENABLE_PROCESSED_INPUT; - SetConsoleMode (get_io_handle (), ENABLE_WINDOW_INPUT | ENABLE_MOUSE_INPUT | cflags); + SetConsoleMode (get_io_handle (), ENABLE_WINDOW_INPUT | cflags); } TTYCLEARF (RSTCONS); @@ -634,7 +545,7 @@ fhandler_console::input_tcsetattr (int, struct termios const *t) tc->ti.c_lflag = 0; } - flags |= ENABLE_WINDOW_INPUT | ENABLE_MOUSE_INPUT; + flags |= ENABLE_WINDOW_INPUT; int res; if (flags == oflags) @@ -857,7 +768,7 @@ static const char base_chars[256] = static int savex, savey; /* for CSI s, CSI u */ void -fhandler_console::char_command (char c) +fhandler_console::char_command (char c, bool saw_question_mark) { // Keep the background intensity with the colr since there doesn't seem // to be a way to set this with termcap/terminfo. @@ -1235,6 +1146,7 @@ fhandler_console::write (const void *vsrc, size_t len) unsigned const char *end = src + len; static NO_COPY unsigned rarg; static NO_COPY char my_title_buf[TITLESIZE + 1]; + bool saw_question_mark = 0; debug_printf ("%x, %d", vsrc, len); @@ -1312,7 +1224,7 @@ fhandler_console::write (const void *vsrc, size_t len) } break; case gotcommand: - char_command (*src++); + char_command (*src++, saw_question_mark); state_ = normal; break; case gotrsquare: @@ -1359,6 +1271,8 @@ fhandler_console::write (const void *vsrc, size_t len) } else if (*src != '@' && !isalpha (*src) && !isdigit (*src)) { + if (*src == '?') + saw_question_mark = 1; /* ignore any extra chars between [ and first arg or command */ src++; }