Welcome to mirror list, hosted at ThFree Co, Russian Federation.

cygwin.com/git/newlib-cygwin.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChristopher Faylor <me@cgf.cx>2000-12-15 07:42:20 +0300
committerChristopher Faylor <me@cgf.cx>2000-12-15 07:42:20 +0300
commit80d0051c3714bed2c2c922f23b907d6ba11b19da (patch)
tree815778816e716b5532f2287bea47aa32a8005f26 /winsup/cygwin/fhandler_console.cc
parent9c2b8183424dad2579bebcd818ecd60d6c08832f (diff)
* 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 <esc>[.
Diffstat (limited to 'winsup/cygwin/fhandler_console.cc')
-rw-r--r--winsup/cygwin/fhandler_console.cc166
1 files changed, 40 insertions, 126 deletions
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;
-
- 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;
+ /* check if we're just disposing of this one */
- 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++;
}