Alexandre Julliard : winex11: Ignore MotionNotify events if we have pending RawMotion events.
Alexandre Julliard
julliard at winehq.org
Wed Apr 27 12:47:27 CDT 2011
Module: wine
Branch: master
Commit: da9922b40da5bc581815a4357340f3f128e8c5cb
URL: http://source.winehq.org/git/wine.git/?a=commit;h=da9922b40da5bc581815a4357340f3f128e8c5cb
Author: Alexandre Julliard <julliard at winehq.org>
Date: Wed Apr 27 16:00:02 2011 +0200
winex11: Ignore MotionNotify events if we have pending RawMotion events.
---
dlls/winex11.drv/event.c | 26 +++++++++++++++++++++++++-
dlls/winex11.drv/mouse.c | 1 -
dlls/winex11.drv/x11drv.h | 1 +
3 files changed, 26 insertions(+), 2 deletions(-)
diff --git a/dlls/winex11.drv/event.c b/dlls/winex11.drv/event.c
index 0233a61..30d8553 100644
--- a/dlls/winex11.drv/event.c
+++ b/dlls/winex11.drv/event.c
@@ -32,6 +32,9 @@
#include <X11/Xlib.h>
#include <X11/Xresource.h>
#include <X11/Xutil.h>
+#ifdef HAVE_X11_EXTENSIONS_XINPUT2_H
+#include <X11/extensions/XInput2.h>
+#endif
#include <assert.h>
#include <stdarg.h>
@@ -154,6 +157,8 @@ static const char * event_names[MAX_EVENT_HANDLERS] =
"SelectionNotify", "ColormapNotify", "ClientMessage", "MappingNotify", "GenericEvent"
};
+int xinput2_opcode = 0;
+
/* return the name of an X event */
static const char *dbgstr_event( int type )
{
@@ -236,7 +241,8 @@ enum event_merge_action
{
MERGE_DISCARD, /* discard the old event */
MERGE_HANDLE, /* handle the old event */
- MERGE_KEEP /* keep the old event for future merging */
+ MERGE_KEEP, /* keep the old event for future merging */
+ MERGE_IGNORE /* ignore the new event, keep the old one */
};
/***********************************************************************
@@ -270,6 +276,22 @@ static enum event_merge_action merge_events( XEvent *prev, XEvent *next )
return MERGE_DISCARD;
}
break;
+#ifdef HAVE_X11_EXTENSIONS_XINPUT2_H
+ case GenericEvent:
+ if (prev->xcookie.extension != xinput2_opcode) break;
+ if (prev->xcookie.evtype != XI_RawMotion) break;
+ switch (next->type)
+ {
+ case MotionNotify:
+ if (next->xany.window == x11drv_thread_data()->clip_window)
+ {
+ TRACE( "ignoring MotionNotify for clip window\n" );
+ return MERGE_IGNORE;
+ }
+ break;
+ }
+ break;
+#endif
}
return MERGE_HANDLE;
}
@@ -363,6 +385,8 @@ static int process_events( Display *display, Bool (*filter)(Display*, XEvent*,XP
break;
case MERGE_KEEP: /* handle new, keep prev for future merging */
call_event_handler( display, &event );
+ /* fall through */
+ case MERGE_IGNORE: /* ignore new, keep prev for future merging */
free_event_data( &event );
break;
}
diff --git a/dlls/winex11.drv/mouse.c b/dlls/winex11.drv/mouse.c
index c4e0b59..7f45a2a 100644
--- a/dlls/winex11.drv/mouse.c
+++ b/dlls/winex11.drv/mouse.c
@@ -130,7 +130,6 @@ static Cursor create_cursor( HANDLE handle );
#ifdef HAVE_X11_EXTENSIONS_XINPUT2_H
static BOOL xinput2_available;
-static int xinput2_opcode;
static int xinput2_core_pointer;
#define MAKE_FUNCPTR(f) static typeof(f) * p##f
MAKE_FUNCPTR(XIFreeDeviceInfo);
diff --git a/dlls/winex11.drv/x11drv.h b/dlls/winex11.drv/x11drv.h
index cfe2509..7113a02 100644
--- a/dlls/winex11.drv/x11drv.h
+++ b/dlls/winex11.drv/x11drv.h
@@ -733,6 +733,7 @@ extern void X11DRV_SelectionClear( HWND hWnd, XEvent *event );
extern void X11DRV_MappingNotify( HWND hWnd, XEvent *event );
extern void X11DRV_GenericEvent( HWND hwnd, XEvent *event );
+extern int xinput2_opcode;
extern Bool (*pXGetEventData)( Display *display, XEvent /*XGenericEventCookie*/ *event );
extern void (*pXFreeEventData)( Display *display, XEvent /*XGenericEventCookie*/ *event );
More information about the wine-cvs
mailing list