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
This commit is contained in:
Dieter Verfaillie 2011-10-21 11:38:31 +02:00 committed by Alexander Larsson
parent d66ad8c39d
commit 1df95b4c0a

View File

@ -395,10 +395,9 @@ _gdk_events_init (void)
gboolean gboolean
_gdk_win32_display_has_pending (GdkDisplay *display) _gdk_win32_display_has_pending (GdkDisplay *display)
{ {
MSG msg;
return (_gdk_event_queue_find_first (display) || return (_gdk_event_queue_find_first (display) ||
(modal_win32_dialog == NULL && (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? */ #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, gdk_event_prepare (GSource *source,
gint *timeout) gint *timeout)
{ {
MSG msg;
gboolean retval; gboolean retval;
GDK_THREADS_ENTER (); GDK_THREADS_ENTER ();
@ -3376,7 +3374,7 @@ gdk_event_prepare (GSource *source,
retval = (_gdk_event_queue_find_first (_gdk_display) != NULL || retval = (_gdk_event_queue_find_first (_gdk_display) != NULL ||
(modal_win32_dialog == NULL && (modal_win32_dialog == NULL &&
PeekMessageW (&msg, NULL, 0, 0, PM_NOREMOVE))); GetQueueStatus (QS_ALLINPUT) != 0));
GDK_THREADS_LEAVE (); GDK_THREADS_LEAVE ();
@ -3386,7 +3384,6 @@ gdk_event_prepare (GSource *source,
static gboolean static gboolean
gdk_event_check (GSource *source) gdk_event_check (GSource *source)
{ {
MSG msg;
gboolean retval; gboolean retval;
GDK_THREADS_ENTER (); GDK_THREADS_ENTER ();
@ -3395,7 +3392,7 @@ gdk_event_check (GSource *source)
{ {
retval = (_gdk_event_queue_find_first (_gdk_display) != NULL || retval = (_gdk_event_queue_find_first (_gdk_display) != NULL ||
(modal_win32_dialog == NULL && (modal_win32_dialog == NULL &&
PeekMessageW (&msg, NULL, 0, 0, PM_NOREMOVE))); GetQueueStatus (QS_ALLINPUT) != 0));
} }
else else
{ {