* fhandler.h (fhandler_console::send_winch_maybe): New method.

* fhandler_console.cc (set_console_state_for_spawn): Remove if 0'ed code.
(fhandler_console::send_winch_maybe): Define new method.
(fhandler_console::read): Use send_winch_maybe where appropriate.
(fhandler_console::init): Just call all tcsetattr rather than output_tcsetattr.
* select.cc (peek_console): Reorganize so that send_winch_maybe is called for
everything but keyboard input.
This commit is contained in:
Christopher Faylor 2002-08-19 04:43:58 +00:00
parent a94b60cea4
commit c060edba34
4 changed files with 45 additions and 25 deletions

View File

@ -1,3 +1,15 @@
2002-08-19 Christopher Faylor <cgf@redhat.com>
* fhandler.h (fhandler_console::send_winch_maybe): New method.
* fhandler_console.cc (set_console_state_for_spawn): Remove if 0'ed
code.
(fhandler_console::send_winch_maybe): Define new method.
(fhandler_console::read): Use send_winch_maybe where appropriate.
(fhandler_console::init): Just call all tcsetattr rather than
output_tcsetattr.
* select.cc (peek_console): Reorganize so that send_winch_maybe is
called for everything but keyboard input.
2002-08-18 Christopher Faylor <cgf@redhat.com> 2002-08-18 Christopher Faylor <cgf@redhat.com>
* perthread.h (vfork_save): Add ctty, sid, pgid, exitval fields. * perthread.h (vfork_save): Add ctty, sid, pgid, exitval fields.

View File

@ -826,6 +826,7 @@ class fhandler_console: public fhandler_termios
void set_close_on_exec (int val); void set_close_on_exec (int val);
void fixup_after_fork (HANDLE parent); void fixup_after_fork (HANDLE parent);
void set_input_state (); void set_input_state ();
void send_winch_maybe ();
}; };
class fhandler_tty_common: public fhandler_termios class fhandler_tty_common: public fhandler_termios

View File

@ -147,13 +147,6 @@ set_console_state_for_spawn ()
# define tc shared_console_info /* ACK. Temporarily define for use in TTYSETF macro */ # define tc shared_console_info /* ACK. Temporarily define for use in TTYSETF macro */
SetConsoleMode (h, ENABLE_LINE_INPUT | ENABLE_ECHO_INPUT | ENABLE_PROCESSED_INPUT); SetConsoleMode (h, ENABLE_LINE_INPUT | ENABLE_ECHO_INPUT | ENABLE_PROCESSED_INPUT);
TTYSETF (RSTCONS); TTYSETF (RSTCONS);
#if 0
char ch;
DWORD n;
/* NOTE -- This ReadFile is apparently necessary for correct functioning on
Windows NT 4.0. Without this, the next ReadFile returns garbage. */
(void) ReadFile (h, &ch, 0, &n, NULL);
#endif
# undef tc # undef tc
} }
@ -186,6 +179,17 @@ fhandler_console::set_cursor_maybe ()
} }
} }
void
fhandler_console::send_winch_maybe ()
{
SHORT y = info.dwWinSize.Y;
SHORT x = info.dwWinSize.X;
fillin_info ();
if (y != info.dwWinSize.Y || x != info.dwWinSize.X)
tc->kill_pgrp (SIGWINCH);
}
int __stdcall int __stdcall
fhandler_console::read (void *pv, size_t buflen) fhandler_console::read (void *pv, size_t buflen)
{ {
@ -332,9 +336,10 @@ fhandler_console::read (void *pv, size_t buflen)
break; break;
case MOUSE_EVENT: case MOUSE_EVENT:
send_winch_maybe ();
if (use_mouse) if (use_mouse)
{ {
MOUSE_EVENT_RECORD & mouse_event = input_rec.Event.MouseEvent; MOUSE_EVENT_RECORD& mouse_event = input_rec.Event.MouseEvent;
/* Treat the double-click event like a regular button press */ /* Treat the double-click event like a regular button press */
if (mouse_event.dwEventFlags == DOUBLE_CLICK) if (mouse_event.dwEventFlags == DOUBLE_CLICK)
@ -416,10 +421,10 @@ fhandler_console::read (void *pv, size_t buflen)
} }
break; break;
case FOCUS_EVENT:
case WINDOW_BUFFER_SIZE_EVENT: case WINDOW_BUFFER_SIZE_EVENT:
tc->kill_pgrp (SIGWINCH); send_winch_maybe ();
continue; /* fall through */
default: default:
continue; continue;
} }
@ -493,7 +498,7 @@ fhandler_console::scroll_screen (int x1, int y1, int x2, int y2, int xn, int yn)
CHAR_INFO fill; CHAR_INFO fill;
COORD dest; COORD dest;
(void)fillin_info (); (void) fillin_info ();
sr1.Left = x1 >= 0 ? x1 : info.dwWinSize.X - 1; sr1.Left = x1 >= 0 ? x1 : info.dwWinSize.X - 1;
if (y1 == 0) if (y1 == 0)
sr1.Top = info.winTop; sr1.Top = info.winTop;
@ -761,8 +766,6 @@ fhandler_console::input_tcsetattr (int, struct termios const *t)
{ {
flags |= ENABLE_PROCESSED_INPUT; flags |= ENABLE_PROCESSED_INPUT;
} }
/* What about ENABLE_WINDOW_INPUT
and ENABLE_MOUSE_INPUT ? */
if (use_tty) if (use_tty)
{ {
@ -956,7 +959,7 @@ fhandler_console::cursor_set (BOOL rel_to_top, int x, int y)
{ {
COORD pos; COORD pos;
(void)fillin_info (); (void) fillin_info ();
if (y > info.winBottom) if (y > info.winBottom)
y = info.winBottom; y = info.winBottom;
else if (y < 0) else if (y < 0)
@ -1692,7 +1695,7 @@ fhandler_console::init (HANDLE f, DWORD a, mode_t bin)
if (f != INVALID_HANDLE_VALUE) if (f != INVALID_HANDLE_VALUE)
CloseHandle (f); /* Reopened by open */ CloseHandle (f); /* Reopened by open */
output_tcsetattr (0, &tc->ti); this->tcsetattr (0, &tc->ti);
} }
int int

View File

@ -661,18 +661,22 @@ peek_console (select_record *me, bool)
break; break;
else else
{ {
if (irec.EventType == WINDOW_BUFFER_SIZE_EVENT) if (irec.EventType == KEY_EVENT)
fh->tc->kill_pgrp (SIGWINCH);
else if (irec.EventType == MOUSE_EVENT &&
(irec.Event.MouseEvent.dwEventFlags == 0 ||
irec.Event.MouseEvent.dwEventFlags == DOUBLE_CLICK))
{ {
if (fh->mouse_aware ()) if (irec.Event.KeyEvent.bKeyDown
&& (irec.Event.KeyEvent.uChar.AsciiChar
|| get_nonascii_key (irec, tmpbuf)))
return me->read_ready = true; return me->read_ready = true;
} }
else if (irec.EventType == KEY_EVENT && irec.Event.KeyEvent.bKeyDown == true && else
(irec.Event.KeyEvent.uChar.AsciiChar || get_nonascii_key (irec, tmpbuf))) {
return me->read_ready = true; fh->send_winch_maybe ();
if (irec.EventType == MOUSE_EVENT
&& fh->mouse_aware ()
&& (irec.Event.MouseEvent.dwEventFlags == 0
|| irec.Event.MouseEvent.dwEventFlags == DOUBLE_CLICK))
return me->read_ready = true;
}
/* Read and discard the event */ /* Read and discard the event */
ReadConsoleInput (h, &irec, 1, &events_read); ReadConsoleInput (h, &irec, 1, &events_read);