[gtk+] win32: Call GetQueueStatus instead of PeekMessage PM_NOREMOVE



commit 1df95b4c0aac1194e0b84ab31fb3bafdadd7aaf8
Author: Dieter Verfaillie <dieterv optionexplicit be>
Date:   Fri Oct 21 11:38:31 2011 +0200

    win32: Call GetQueueStatus instead of PeekMessage PM_NOREMOVE
    
    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 |    9 +++------
 1 files changed, 3 insertions(+), 6 deletions(-)
---
diff --git a/gdk/win32/gdkevents-win32.c b/gdk/win32/gdkevents-win32.c
index 5ea4245..f62727d 100644
--- a/gdk/win32/gdkevents-win32.c
+++ b/gdk/win32/gdkevents-win32.c
@@ -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
     {



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]