From: Rémi Bernon rbernon@codeweavers.com
--- dlls/wineandroid.drv/window.c | 11 +++++++--- dlls/winemac.drv/event.c | 34 ++++++++++++++--------------- dlls/winex11.drv/event.c | 40 ++++++++++++++++------------------- 3 files changed, 43 insertions(+), 42 deletions(-)
diff --git a/dlls/wineandroid.drv/window.c b/dlls/wineandroid.drv/window.c index 9c0dc8d6115..81be65a065c 100644 --- a/dlls/wineandroid.drv/window.c +++ b/dlls/wineandroid.drv/window.c @@ -391,13 +391,19 @@ static void pull_events(void) }
+static int check_fd_events( int fd, int events ) +{ + struct pollfd pfd = {.fd = fd, .events = events}; + if (poll( &pfd, 1, 0 ) <= 0) return 0; + return pfd.revents; +} + /*********************************************************************** * process_events */ static int process_events( DWORD mask ) { struct java_event *event, *next, *previous; - unsigned int count = 0;
assert( GetCurrentThreadId() == desktop_tid );
@@ -505,12 +511,11 @@ static int process_events( DWORD mask ) FIXME( "got event %u\n", event->data.type ); } free( event ); - count++; /* next may have been removed by a recursive call, so reset it to the beginning of the list */ next = LIST_ENTRY( event_queue.next, struct java_event, entry ); } current_event = previous; - return count; + return !check_fd_events( event_pipe[0], POLLIN ); }
diff --git a/dlls/winemac.drv/event.c b/dlls/winemac.drv/event.c index f86716c7942..b97b876cb70 100644 --- a/dlls/winemac.drv/event.c +++ b/dlls/winemac.drv/event.c @@ -26,6 +26,8 @@
#include "config.h"
+#include <poll.h> + #include "ntstatus.h" #define WIN32_NO_STATUS #include "macdrv.h" @@ -526,25 +528,13 @@ void macdrv_handle_event(const macdrv_event *event) }
-/*********************************************************************** - * process_events - */ -static int process_events(macdrv_event_queue queue, macdrv_event_mask mask) +static int check_fd_events( int fd, int events ) { - macdrv_event *event; - int count = 0; - - while (macdrv_copy_event_from_queue(queue, mask, &event)) - { - count++; - macdrv_handle_event(event); - macdrv_release_event(event); - } - if (count) TRACE("processed %d events\n", count); - return count; + struct pollfd pfd = {.fd = fd, .events = events}; + if (poll( &pfd, 1, 0 ) <= 0) return 0; + return pfd.revents; }
- /*********************************************************************** * ProcessEvents (MACDRV.@) */ @@ -552,6 +542,8 @@ BOOL macdrv_ProcessEvents(DWORD mask) { struct macdrv_thread_data *data = macdrv_thread_data(); macdrv_event_mask event_mask = get_event_mask(mask); + macdrv_event *event; + int count = 0;
TRACE("mask %x\n", mask);
@@ -563,5 +555,13 @@ BOOL macdrv_ProcessEvents(DWORD mask) data->current_event->type != WINDOW_DRAG_BEGIN) event_mask = 0; /* don't process nested events */
- return process_events(data->queue, event_mask); + while (macdrv_copy_event_from_queue(data->queue, event_mask, &event)) + { + count++; + macdrv_handle_event(event); + macdrv_release_event(event); + } + + if (count) TRACE("processed %d events\n", count); + return !check_fd_events(macdrv_get_event_queue_fd(data->queue), POLLIN); } diff --git a/dlls/winex11.drv/event.c b/dlls/winex11.drv/event.c index d2cf9e55977..ca261b7bf3b 100644 --- a/dlls/winex11.drv/event.c +++ b/dlls/winex11.drv/event.c @@ -464,19 +464,28 @@ static inline BOOL call_event_handler( Display *display, XEvent *event ) return ret; }
+static int check_fd_events( int fd, int events ) +{ + struct pollfd pfd = {.fd = fd, .events = events}; + if (poll( &pfd, 1, 0 ) <= 0) return 0; + return pfd.revents; +}
/*********************************************************************** - * process_events + * ProcessEvents (X11DRV.@) */ -static BOOL process_events( Display *display, Bool (*filter)(Display*, XEvent*,XPointer), ULONG_PTR arg ) +BOOL X11DRV_ProcessEvents( DWORD mask ) { + struct x11drv_thread_data *data = x11drv_thread_data(); XEvent event, prev_event; int count = 0; - BOOL queued = FALSE; enum event_merge_action action = MERGE_DISCARD;
+ if (!data) return FALSE; + if (data->current_event) mask = 0; /* don't process nested events */ + prev_event.type = 0; - while (XCheckIfEvent( display, &event, filter, (char *)arg )) + while (XCheckIfEvent( data->display, &event, filter_event, (XPointer)(UINT_PTR)mask )) { count++; if (XFilterEvent( &event, None )) @@ -517,41 +526,28 @@ static BOOL process_events( Display *display, Bool (*filter)(Display*, XEvent*,X switch( action ) { case MERGE_HANDLE: /* handle prev, keep new */ - queued |= call_event_handler( display, &prev_event ); + call_event_handler( data->display, &prev_event ); /* fall through */ case MERGE_DISCARD: /* discard prev, keep new */ free_event_data( &prev_event ); prev_event = event; break; case MERGE_KEEP: /* handle new, keep prev for future merging */ - queued |= call_event_handler( display, &event ); + call_event_handler( data->display, &event ); /* fall through */ case MERGE_IGNORE: /* ignore new, keep prev for future merging */ free_event_data( &event ); break; } } - if (prev_event.type) queued |= call_event_handler( display, &prev_event ); + if (prev_event.type) call_event_handler( data->display, &prev_event ); free_event_data( &prev_event ); XFlush( gdi_display ); - if (count) TRACE( "processed %d events, returning %d\n", count, queued ); - return queued; + if (count) TRACE( "processed %d events\n", count ); + return !check_fd_events( ConnectionNumber( data->display ), POLLIN ); }
-/*********************************************************************** - * ProcessEvents (X11DRV.@) - */ -BOOL X11DRV_ProcessEvents( DWORD mask ) -{ - struct x11drv_thread_data *data = x11drv_thread_data(); - - if (!data) return FALSE; - if (data->current_event) mask = 0; /* don't process nested events */ - - return process_events( data->display, filter_event, mask ); -} - /*********************************************************************** * EVENT_x11_time_to_win32_time *