Take into account the event mask passed to MsgWaitForMultipleObjectsEx

to allow processing only a subset of the available X events.
This commit is contained in:
Alexandre Julliard 2005-03-08 19:20:14 +00:00
parent 72d6373743
commit 5beccd01ac
1 changed files with 38 additions and 6 deletions

View File

@ -197,20 +197,52 @@ done:
}
/***********************************************************************
* filter_event
*/
static Bool filter_event( Display *display, XEvent *event, char *arg )
{
DWORD mask = (ULONG_PTR)arg;
if ((mask & QS_ALLINPUT) == QS_ALLINPUT) return 1;
switch(event->type)
{
case KeyPress:
case KeyRelease:
case KeymapNotify:
return (mask & QS_KEY) != 0;
case ButtonPress:
case ButtonRelease:
return (mask & QS_MOUSEBUTTON) != 0;
case MotionNotify:
case EnterNotify:
case LeaveNotify:
return (mask & QS_MOUSEMOVE) != 0;
case Expose:
return (mask & QS_PAINT) != 0;
case ClientMessage:
return (mask & QS_POSTMESSAGE) != 0;
default:
return (mask & QS_SENDMESSAGE) != 0;
}
}
/***********************************************************************
* process_events
*/
static int process_events( Display *display )
static int process_events( Display *display, DWORD mask )
{
XEvent event;
HWND hwnd;
int count;
int count = 0;
x11drv_event_handler handler;
wine_tsx11_lock();
for (count = 0; XPending(display); count++)
while (XCheckIfEvent( display, &event, filter_event, (char *)mask ))
{
XNextEvent( display, &event );
count++;
if (XFilterEvent( &event, None )) continue; /* filtered, ignore it */
if (!(handler = find_handler( event.type )))
@ -261,12 +293,12 @@ DWORD X11DRV_MsgWaitForMultipleObjectsEx( DWORD count, const HANDLE *handles,
wine_tsx11_unlock();
data->process_event_count++;
if (process_events( data->display )) ret = count;
if (process_events( data->display, mask )) ret = count;
else
{
ret = WaitForMultipleObjectsEx( count+1, new_handles, flags & MWMO_WAITALL,
timeout, flags & MWMO_ALERTABLE );
if (ret == count) process_events( data->display );
if (ret == count) process_events( data->display, mask );
}
data->process_event_count--;
return ret;