* 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>[.
This commit is contained in:
Christopher Faylor 2000-12-15 04:42:20 +00:00
parent 9c2b818342
commit 80d0051c37
3 changed files with 51 additions and 127 deletions

View File

@ -1,3 +1,13 @@
Thu Dec 14 23:37:51 2000 Christopher Faylor <cgf@cygnus.com>
* 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>[.
Tue Dec 5 17:06:00 2000 Corinna Vinschen <corinna@vinschen.de>
* net.cc (cygwin_rexec): Eliminate superfluous call to

View File

@ -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 */

View File

@ -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++;
}