Alexandre Julliard : winex11: Add handlers for the XInput2 raw mouse events .

Alexandre Julliard julliard at winehq.org
Thu Apr 14 11:58:19 CDT 2011


Module: wine
Branch: master
Commit: 338fe8b9acf5085172662e9cf3109370dad77a4a
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=338fe8b9acf5085172662e9cf3109370dad77a4a

Author: Alexandre Julliard <julliard at winehq.org>
Date:   Wed Apr 13 18:56:37 2011 +0200

winex11: Add handlers for the XInput2 raw mouse events.

---

 dlls/winex11.drv/event.c  |    2 +-
 dlls/winex11.drv/mouse.c  |  115 +++++++++++++++++++++++++++++++++++++++++++++
 dlls/winex11.drv/x11drv.h |    1 +
 3 files changed, 117 insertions(+), 1 deletions(-)

diff --git a/dlls/winex11.drv/event.c b/dlls/winex11.drv/event.c
index a05e906..d3ed4b0 100644
--- a/dlls/winex11.drv/event.c
+++ b/dlls/winex11.drv/event.c
@@ -140,7 +140,7 @@ static x11drv_event_handler handlers[MAX_EVENT_HANDLERS] =
     NULL,                     /* 32 ColormapNotify */
     X11DRV_ClientMessage,     /* 33 ClientMessage */
     X11DRV_MappingNotify,     /* 34 MappingNotify */
-    NULL                      /* 35 GenericEvent */
+    X11DRV_GenericEvent       /* 35 GenericEvent */
 };
 
 static const char * event_names[MAX_EVENT_HANDLERS] =
diff --git a/dlls/winex11.drv/mouse.c b/dlls/winex11.drv/mouse.c
index 1716916..e3774dc 100644
--- a/dlls/winex11.drv/mouse.c
+++ b/dlls/winex11.drv/mouse.c
@@ -25,6 +25,9 @@
 #include <X11/Xlib.h>
 #include <X11/cursorfont.h>
 #include <stdarg.h>
+#ifdef HAVE_X11_EXTENSIONS_XINPUT2_H
+#include <X11/extensions/XInput2.h>
+#endif
 
 #ifdef SONAME_LIBXCURSOR
 # include <X11/Xcursor/Xcursor.h>
@@ -1089,3 +1092,115 @@ void X11DRV_EnterNotify( HWND hwnd, XEvent *xev )
 
     send_mouse_input( hwnd, event->window, event->state, &input );
 }
+
+#ifdef HAVE_X11_EXTENSIONS_XINPUT2_H
+
+/***********************************************************************
+ *           X11DRV_RawButtonPress
+ */
+static void X11DRV_RawButtonPress( XIRawEvent *event )
+{
+    int button = event->detail - 1;
+    INPUT input;
+
+    if (button >= NB_BUTTONS) return;
+
+    TRACE( "button %u\n", button );
+
+    input.type             = INPUT_MOUSE;
+    input.u.mi.dx          = 0;
+    input.u.mi.dy          = 0;
+    input.u.mi.mouseData   = button_down_data[button];
+    input.u.mi.dwFlags     = button_down_flags[button];
+    input.u.mi.time        = EVENT_x11_time_to_win32_time( event->time );
+    input.u.mi.dwExtraInfo = 0;
+
+    update_user_time( event->time );
+    input.type = INPUT_MOUSE;
+    __wine_send_input( 0, &input );
+}
+
+
+/***********************************************************************
+ *           X11DRV_RawButtonRelease
+ */
+static void X11DRV_RawButtonRelease( XIRawEvent *event )
+{
+    int button = event->detail - 1;
+    INPUT input;
+
+    if (button >= NB_BUTTONS) return;
+
+    TRACE( "button %u\n", button );
+
+    input.u.mi.dx          = 0;
+    input.u.mi.dy          = 0;
+    input.u.mi.mouseData   = button_up_data[button];
+    input.u.mi.dwFlags     = button_up_flags[button];
+    input.u.mi.time        = EVENT_x11_time_to_win32_time( event->time );
+    input.u.mi.dwExtraInfo = 0;
+
+    input.type = INPUT_MOUSE;
+    __wine_send_input( 0, &input );
+}
+
+
+/***********************************************************************
+ *           X11DRV_RawMotion
+ */
+static void X11DRV_RawMotion( XIRawEvent *event )
+{
+    const double *values = event->valuators.values;
+    INPUT input;
+
+    if (!event->valuators.mask_len) return;
+
+    input.u.mi.dx          = 0;
+    input.u.mi.dy          = 0;
+    input.u.mi.mouseData   = 0;
+    input.u.mi.dwFlags     = MOUSEEVENTF_MOVE;
+    input.u.mi.time        = EVENT_x11_time_to_win32_time( event->time );
+    input.u.mi.dwExtraInfo = 0;
+
+    if (XIMaskIsSet( event->valuators.mask, 0 )) input.u.mi.dx = *values++;
+    if (XIMaskIsSet( event->valuators.mask, 1 )) input.u.mi.dy = *values++;
+
+    TRACE( "pos %d,%d\n", input.u.mi.dx, input.u.mi.dy );
+
+    input.type = INPUT_MOUSE;
+    __wine_send_input( 0, &input );
+}
+
+#endif /* HAVE_X11_EXTENSIONS_XINPUT2_H */
+
+
+/***********************************************************************
+ *           X11DRV_GenericEvent
+ */
+void X11DRV_GenericEvent( HWND hwnd, XEvent *xev )
+{
+#ifdef HAVE_X11_EXTENSIONS_XINPUT2_H
+    XGenericEventCookie *event = &xev->xcookie;
+
+    if (!event->data) return;
+
+    switch (event->evtype)
+    {
+    case XI_RawButtonPress:
+        X11DRV_RawButtonPress( event->data );
+        break;
+
+    case XI_RawButtonRelease:
+        X11DRV_RawButtonRelease( event->data );
+        break;
+
+    case XI_RawMotion:
+        X11DRV_RawMotion( event->data );
+        break;
+
+    default:
+        TRACE( "Unhandled event %#x\n", event->evtype );
+        break;
+    }
+#endif
+}
diff --git a/dlls/winex11.drv/x11drv.h b/dlls/winex11.drv/x11drv.h
index 5f6c5cf..ae91fc9 100644
--- a/dlls/winex11.drv/x11drv.h
+++ b/dlls/winex11.drv/x11drv.h
@@ -728,6 +728,7 @@ extern void X11DRV_DestroyNotify( HWND hwnd, XEvent *event );
 extern void X11DRV_SelectionRequest( HWND hWnd, XEvent *event );
 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 Bool (*pXGetEventData)( Display *display, XEvent /*XGenericEventCookie*/ *event );
 extern void (*pXFreeEventData)( Display *display, XEvent /*XGenericEventCookie*/ *event );




More information about the wine-cvs mailing list