diff --git a/winsup/cygwin/ChangeLog b/winsup/cygwin/ChangeLog index d4efcd112..c81194ac8 100644 --- a/winsup/cygwin/ChangeLog +++ b/winsup/cygwin/ChangeLog @@ -1,3 +1,18 @@ +2006-04-21 Christopher Faylor + + * tty.h (tty::hwnd): Move to tty_min. + (tty::gethwnd): Ditto. + (tty::sethwnd): Ditto. + (tty_min::hwnd): Receive variable from tty class. + (tty_min::gethwnd): Receive function from tty classs. + (tty_min::sethwnd): Ditto. + * dtable.cc (dtable::stdio_init): Only call init_console_handler when + we actually own the console. + * fhandler_console.cc (fhandler_console::get_tty_stuff): Set tty's hwnd + to non-zero value. + * fhandler_termios.cc (fhandler_termios::tcsetpgrp): Semi-reinstate + handling of console when pgrp is set. + 2006-04-21 Pierre Humblet Corinna Vinschen diff --git a/winsup/cygwin/dtable.cc b/winsup/cygwin/dtable.cc index 74ce74b67..f22be554e 100644 --- a/winsup/cygwin/dtable.cc +++ b/winsup/cygwin/dtable.cc @@ -32,7 +32,7 @@ details. */ #include "dtable.h" #include "cygheap.h" #include "ntdll.h" -#include "tty.h" +#include "shared_info.h" static const char NO_COPY unknown_file[] = "some disk file"; @@ -135,7 +135,9 @@ dtable::stdio_init () if (myself->cygstarted || ISSTATE (myself, PID_CYGPARENT)) { - init_console_handler (myself->ctty >= 0); + tty_min *t = cygwin_shared->tty.get_tty (myself->ctty); + if (t && t->getpgid () == myself->pid && t->gethwnd ()) + init_console_handler (true); return; } diff --git a/winsup/cygwin/fhandler_console.cc b/winsup/cygwin/fhandler_console.cc index 801ab5a6a..64a83ce66 100644 --- a/winsup/cygwin/fhandler_console.cc +++ b/winsup/cygwin/fhandler_console.cc @@ -115,6 +115,7 @@ fhandler_console::get_tty_stuff (int flags = 0) if (PRIMARYLANGID (LOWORD (GetKeyboardLayout (0))) == LANG_ENGLISH) dev_state->meta_mask |= RIGHT_ALT_PRESSED; dev_state->set_default_attr (); + shared_console_info->tty_min_state.sethwnd ((HWND) INVALID_HANDLE_VALUE); } return &shared_console_info->tty_min_state; diff --git a/winsup/cygwin/fhandler_termios.cc b/winsup/cygwin/fhandler_termios.cc index 3475f5ed5..9b8d3597e 100644 --- a/winsup/cygwin/fhandler_termios.cc +++ b/winsup/cygwin/fhandler_termios.cc @@ -82,6 +82,7 @@ fhandler_termios::tcsetpgrp (const pid_t pgid) { case bg_ok: tc->setpgid (pgid); + init_console_handler (tc->gethwnd ()); res = 0; break; case bg_signalled: diff --git a/winsup/cygwin/tty.h b/winsup/cygwin/tty.h index c8a266e91..27e517d9c 100644 --- a/winsup/cygwin/tty.h +++ b/winsup/cygwin/tty.h @@ -46,18 +46,12 @@ public: pid_t pgid; int output_stopped; int ntty; - DWORD last_ctrl_c; // tick count of last ctrl-c + DWORD last_ctrl_c; /* tick count of last ctrl-c */ + HWND hwnd; /* Console window handle tty belongs to */ IMPLEMENT_STATUS_FLAG (bool, initialized) IMPLEMENT_STATUS_FLAG (bool, rstcons) - tty_min (int t = -1, pid_t s = -1) : sid (s), ntty (t) {} - void setntty (int n) {ntty = n;} - pid_t getpgid () {return pgid;} - void setpgid (int pid) {pgid = pid;} - int getsid () {return sid;} - void setsid (pid_t tsid) {sid = tsid;} - void kill_pgrp (int sig); struct termios ti; struct winsize winsize; @@ -74,8 +68,17 @@ public: * -ERRNO */ int ioctl_retval; - int write_error; + + tty_min (int t = -1, pid_t s = -1) : sid (s), ntty (t) {} + void setntty (int n) {ntty = n;} + pid_t getpgid () {return pgid;} + void setpgid (int pid) {pgid = pid;} + int getsid () {return sid;} + void setsid (pid_t tsid) {sid = tsid;} + void kill_pgrp (int sig); + HWND gethwnd () {return hwnd;} + void sethwnd (HWND wnd) {hwnd = wnd;} }; class fhandler_pty_master; @@ -85,8 +88,6 @@ class tty: public tty_min HANDLE get_event (const char *fmt, BOOL manual_reset = FALSE) __attribute__ ((regparm (3))); public: - HWND hwnd; /* Console window handle tty belongs to */ - DWORD master_pid; /* Win32 PID of tty master process */ HANDLE from_master, to_slave; @@ -101,8 +102,6 @@ public: bool alive (const char *fmt); bool slave_alive (); bool master_alive (); - HWND gethwnd () {return hwnd;} - void sethwnd (HWND wnd) {hwnd = wnd;} bool make_pipes (fhandler_pty_master *ptym); HANDLE open_mutex (const char *mutex); HANDLE open_output_mutex ();