diff options
author | Andrew Innes <andrewi@gnu.org> | 1999-07-01 19:47:32 +0000 |
---|---|---|
committer | Andrew Innes <andrewi@gnu.org> | 1999-07-01 19:47:32 +0000 |
commit | 58f99dfb24c03688ab7643a4ad474dcc5a80c2b7 (patch) | |
tree | fdc84d4b9796dec0fd98e520ba71cae80ba01bca /src/w32proc.c | |
parent | d14b2ee3a4117f1ee4003b66b944e817a503eae3 (diff) | |
download | emacs-58f99dfb24c03688ab7643a4ad474dcc5a80c2b7.tar.gz |
(sys_select): Call MsgWaitForMultipleObjects instead
of WaitForMultipleObjects when user input is allowed, so we can
handle incoming window messages. Call drain_message_queue when
there are messages waiting; this ensures that windows created
indirectly from the lisp thread get processed properly, and don't
hang other applications by failing to respond to broadcasts.
Diffstat (limited to 'src/w32proc.c')
-rw-r--r-- | src/w32proc.c | 31 |
1 files changed, 28 insertions, 3 deletions
diff --git a/src/w32proc.c b/src/w32proc.c index 8fcf3382da9..97ab6fcc150 100644 --- a/src/w32proc.c +++ b/src/w32proc.c @@ -1175,9 +1175,15 @@ count_children: return 0; } - /* Wait for input or child death to be signalled. */ start_time = GetTickCount (); - active = WaitForMultipleObjects (nh + nc, wait_hnd, FALSE, timeout_ms); + + /* Wait for input or child death to be signalled. If user input is + allowed, then also accept window messages. */ + if (FD_ISSET (0, &orfds)) + active = MsgWaitForMultipleObjects (nh + nc, wait_hnd, FALSE, timeout_ms, + QS_ALLINPUT); + else + active = WaitForMultipleObjects (nh + nc, wait_hnd, FALSE, timeout_ms); if (active == WAIT_FAILED) { @@ -1213,7 +1219,26 @@ count_children: processed - otherwise higher numbered channels could be starved. */ do { - if (active >= nh) + if (active == nh + nc) + { + /* There are messages in the lisp thread's queue; we must + drain the queue now to ensure they are processed promptly, + because if we don't do so, we will not be woken again until + further messages arrive. + + NB. If ever we allow window message procedures to callback + into lisp, we will need to ensure messages are dispatched + at a safe time for lisp code to be run (*), and we may also + want to provide some hooks in the dispatch loop to cater + for modeless dialogs created by lisp (ie. to register + window handles to pass to IsDialogMessage). + + (*) Note that MsgWaitForMultipleObjects above is an + internal dispatch point for messages that are sent to + windows created by this thread. */ + drain_message_queue (); + } + else if (active >= nh) { cp = cps[active - nh]; |