]> git.eshelyaron.com Git - emacs.git/commitdiff
(sys_select): Call MsgWaitForMultipleObjects instead
authorAndrew Innes <andrewi@gnu.org>
Thu, 1 Jul 1999 19:47:32 +0000 (19:47 +0000)
committerAndrew Innes <andrewi@gnu.org>
Thu, 1 Jul 1999 19:47:32 +0000 (19:47 +0000)
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.

src/w32proc.c

index 8fcf3382da9861c5e6a1b09b977fbc645ba4de0a..97ab6fcc150a8bb8080d8ce8b947c75d06ca760e 100644 (file)
@@ -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];