From: Rémi Bernon rbernon@codeweavers.com
--- dlls/winex11.drv/event.c | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-)
diff --git a/dlls/winex11.drv/event.c b/dlls/winex11.drv/event.c index bd917ae49c9..5018a8f8223 100644 --- a/dlls/winex11.drv/event.c +++ b/dlls/winex11.drv/event.c @@ -289,6 +289,16 @@ static inline BOOL call_event_handler( Display *display, XEvent *event ) return ret; }
+static BOOL handle_delayed_event( Display *display, XEvent *event ) +{ + BOOL queued = FALSE; + if (!event->type) return FALSE; + TRACE( "Handling delayed %s event for window %lx\n", dbgstr_event(event->type), event->xany.window ); + queued |= call_event_handler( display, event ); + free_event_data( event ); + event->type = 0; + return queued; +}
enum event_merge_action { @@ -453,8 +463,9 @@ BOOL X11DRV_ProcessEvents( DWORD mask ) switch( action ) { case MERGE_HANDLE: /* handle prev, keep new */ - queued |= call_event_handler( display, &prev_event ); - /* fall through */ + queued |= handle_delayed_event( display, &prev_event ); + prev_event = event; + break; case MERGE_DISCARD: /* discard prev, keep new */ free_event_data( &prev_event ); prev_event = event; @@ -467,8 +478,7 @@ BOOL X11DRV_ProcessEvents( DWORD mask ) break; } } - if (prev_event.type) queued |= call_event_handler( display, &prev_event ); - free_event_data( &prev_event ); + queued |= handle_delayed_event( display, &prev_event ); XFlush( gdi_display ); if (count) TRACE( "processed %d events, returning %d\n", count, queued ); return queued;