[Spice-devel] [PATCH xf86-video-qxl 04/11] spiceqxl_inputs: expose buttons & position api for agent usage

Alon Levy alevy at redhat.com
Mon Sep 2 08:02:45 PDT 2013


Signed-off-by: Alon Levy <alevy at redhat.com>
---
 src/spiceqxl_inputs.c | 41 +++++++++++++++++++++++++----------------
 src/spiceqxl_inputs.h |  2 ++
 2 files changed, 27 insertions(+), 16 deletions(-)

diff --git a/src/spiceqxl_inputs.c b/src/spiceqxl_inputs.c
index 2b8a15e..b39eeae 100644
--- a/src/spiceqxl_inputs.c
+++ b/src/spiceqxl_inputs.c
@@ -270,6 +270,8 @@ typedef struct XSpicePointer {
     InputInfoPtr     pInfo; /* xf86 device handle to post events */
 } XSpicePointer;
 
+static XSpicePointer *g_xspice_pointer;
+
 static void mouse_motion(SpiceMouseInstance *sin, int dx, int dy, int dz,
                          uint32_t buttons_state)
 {
@@ -304,22 +306,35 @@ static void tablet_set_logical_size(SpiceTabletInstance* sin, int width, int hei
     spice_pointer->height = height;
 }
 
+void spiceqxl_tablet_position(int x, int y, uint32_t buttons_state)
+{
+    // TODO: don't ignore buttons_state
+    xf86PostMotionEvent(g_xspice_pointer->pInfo->dev, 1, 0, 2, x, y);
+}
+
 static void tablet_position(SpiceTabletInstance* sin, int x, int y,
                             uint32_t buttons_state)
 {
-    XSpicePointer *spice_pointer = container_of(sin, XSpicePointer, tablet);
-
-    // TODO: don't ignore buttons_state
-    xf86PostMotionEvent(spice_pointer->pInfo->dev, 1, 0, 2, x, y);
+    spiceqxl_tablet_position(x, y, buttons_state);
 }
 
-static void tablet_buttons(SpiceTabletInstance *sin,
-                           uint32_t buttons_state)
+void spiceqxl_tablet_buttons(uint32_t buttons_state)
 {
-    XSpicePointer *spice_pointer = container_of(sin, XSpicePointer, tablet);
     static uint32_t old_buttons_state = 0;
     int i;
 
+    for (i = 0; i < BUTTONS; i++) {
+        if ((buttons_state ^ old_buttons_state) & (1 << i)) {
+            int action = (buttons_state & (1 << i));
+            xf86PostButtonEvent(g_xspice_pointer->pInfo->dev, 0, i + 1, action, 0, 0);
+        }
+    }
+    old_buttons_state = buttons_state;
+}
+
+static void tablet_buttons(SpiceTabletInstance *sin,
+                           uint32_t buttons_state)
+{
     // For some reason spice switches the second and third button, undo that.
     // basically undo RED_MOUSE_STATE_TO_LOCAL
     buttons_state = (buttons_state & SPICE_MOUSE_BUTTON_MASK_LEFT) |
@@ -327,14 +342,7 @@ static void tablet_buttons(SpiceTabletInstance *sin,
         ((buttons_state & SPICE_MOUSE_BUTTON_MASK_RIGHT) >> 1) |
         (buttons_state & ~(SPICE_MOUSE_BUTTON_MASK_LEFT | SPICE_MOUSE_BUTTON_MASK_MIDDLE
                           |SPICE_MOUSE_BUTTON_MASK_RIGHT));
-
-    for (i = 0; i < BUTTONS; i++) {
-        if ((buttons_state ^ old_buttons_state) & (1 << i)) {
-            int action = (buttons_state & (1 << i));
-            xf86PostButtonEvent(spice_pointer->pInfo->dev, 0, i + 1, action, 0, 0);
-        }
-    }
-    old_buttons_state = buttons_state;
+    spiceqxl_tablet_buttons(buttons_state);
 }
 
 static void tablet_wheel(SpiceTabletInstance* sin, int wheel,
@@ -358,6 +366,7 @@ static const SpiceTabletInterface tablet_interface = {
 };
 
 static char unknown_type_string[] = "UNKNOWN";
+
 static int
 XSpiceKeyboardPreInit(InputDriverPtr drv, InputInfoPtr pInfo, int flags)
 {
@@ -382,7 +391,7 @@ XSpicePointerPreInit(InputDriverPtr drv, InputInfoPtr pInfo, int flags)
 {
     XSpicePointer *spice_pointer;
 
-    spice_pointer = calloc(sizeof(*spice_pointer), 1);
+    g_xspice_pointer = spice_pointer = calloc(sizeof(*spice_pointer), 1);
     spice_pointer->mouse.base.sif  = &mouse_interface.base;
     spice_pointer->tablet.base.sif = &tablet_interface.base;
     spice_pointer->absolute = TRUE;
diff --git a/src/spiceqxl_inputs.h b/src/spiceqxl_inputs.h
index 8b2c815..9ff78cf 100644
--- a/src/spiceqxl_inputs.h
+++ b/src/spiceqxl_inputs.h
@@ -26,5 +26,7 @@
 #include "qxl.h"
 
 void xspice_add_input_drivers(pointer module);
+void spiceqxl_tablet_buttons(uint32_t buttons_state);
+void spiceqxl_tablet_position(int x, int y, uint32_t buttons_state);
 
 #endif // QXL_SPICE_INPUTS_H
-- 
1.8.3.1



More information about the Spice-devel mailing list