]> Pileus Git - ~andy/gtk/commitdiff
win32: Call GetQueueStatus instead of PeekMessage PM_NOREMOVE
authorDieter Verfaillie <dieterv@optionexplicit.be>
Fri, 21 Oct 2011 09:38:31 +0000 (11:38 +0200)
committerAlexander Larsson <alexl@redhat.com>
Thu, 10 Nov 2011 16:40:55 +0000 (17:40 +0100)
Calling PeekMessage can cause reentrant calls into the window procedure
for sent (as opposed to posted) messages, so its not safe to call
when we're not expecting reentrancy. Instead we call GetQueueStatus
when we're just looking for availible messages.

Fixes https://bugzilla.gnome.org/show_bug.cgi?id=552041

gdk/win32/gdkevents-win32.c

index 5ea42453da20161d5d3762fc3937d730a7da29c2..f62727d269822ffc6063a0ff7fc4571f31c3c5ef 100644 (file)
@@ -395,10 +395,9 @@ _gdk_events_init (void)
 gboolean
 _gdk_win32_display_has_pending (GdkDisplay *display)
 {
-  MSG msg;
   return (_gdk_event_queue_find_first (display) ||
          (modal_win32_dialog == NULL &&
-          PeekMessageW (&msg, NULL, 0, 0, PM_NOREMOVE)));
+          GetQueueStatus (QS_ALLINPUT) != 0));
 }
 
 #if 0 /* Unused, but might be useful to re-introduce in some debugging output? */
@@ -3367,7 +3366,6 @@ static gboolean
 gdk_event_prepare (GSource *source,
                   gint    *timeout)
 {
-  MSG msg;
   gboolean retval;
 
   GDK_THREADS_ENTER ();
@@ -3376,7 +3374,7 @@ gdk_event_prepare (GSource *source,
 
   retval = (_gdk_event_queue_find_first (_gdk_display) != NULL ||
            (modal_win32_dialog == NULL &&
-            PeekMessageW (&msg, NULL, 0, 0, PM_NOREMOVE)));
+            GetQueueStatus (QS_ALLINPUT) != 0));
 
   GDK_THREADS_LEAVE ();
 
@@ -3386,7 +3384,6 @@ gdk_event_prepare (GSource *source,
 static gboolean
 gdk_event_check (GSource *source)
 {
-  MSG msg;
   gboolean retval;
   
   GDK_THREADS_ENTER ();
@@ -3395,7 +3392,7 @@ gdk_event_check (GSource *source)
     {
       retval = (_gdk_event_queue_find_first (_gdk_display) != NULL ||
                (modal_win32_dialog == NULL &&
-                PeekMessageW (&msg, NULL, 0, 0, PM_NOREMOVE)));
+                GetQueueStatus (QS_ALLINPUT) != 0));
     }
   else
     {