On Thu, Aug 06, 2009 at 07:36:13PM +0300, Vignatti Tiago (Nokia-D/Helsinki) 
wrote:
> From 537a0a954dea9d2dd8260090822acc1010070326 Mon Sep 17 00:00:00 2001
> From: Tiago Vignatti <[email protected]>
> Date: Wed, 5 Aug 2009 21:02:29 +0300
> Subject: [PATCH] mi: fix cursor warping screens
> 
> The server was processing ET_RawMotion type when the cursor was wrapping to
> another screen and getting wrong valuator values. This fix such issue
> considering only ET_Motion, ET_KeyPress, ET_KeyRelease, ET_ButtonPress and
> ET_ButtonRelease types when the cursor detects a new screen, keeping the
> "normal" processing of device events.
> 
> Signed-off-by: Tiago Vignatti <[email protected]>
> ---
>  mi/mieq.c |   24 ++++++++++++++++--------
>  1 files changed, 16 insertions(+), 8 deletions(-)
> 
> diff --git a/mi/mieq.c b/mi/mieq.c
> index 6ec2dba..da110c3 100644
> --- a/mi/mieq.c
> +++ b/mi/mieq.c
> @@ -367,14 +367,22 @@ mieqProcessDeviceEvent(DeviceIntPtr dev,
>      /* Custom event handler */
>      handler = miEventQueue.handlers[event->any.type];
>  
> -    if (dev && screen && screen != DequeueScreen(dev) && !handler) {
> -        /* Assumption - screen switching can only occur on motion events. */
> -        DequeueScreen(dev) = screen;
> -        x = event->device.root_x;
> -        y = event->device.root_y;
> -        NewCurrentScreen (dev, DequeueScreen(dev), x, y);
> -    }
> -    else {
> +    switch (event->any.type) {
> +        /* Catch events that include valuator information and check if they
> +         * are changing the screen */
> +        case ET_Motion:
> +        case ET_KeyPress:
> +        case ET_KeyRelease:
> +        case ET_ButtonPress:
> +        case ET_ButtonRelease:
> +            if (dev && screen && screen != DequeueScreen(dev) && !handler) {
> +                DequeueScreen(dev) = screen;
> +                x = event->device.root_x;
> +                y = event->device.root_y;
> +                NewCurrentScreen (dev, DequeueScreen(dev), x, y);
> +            }
> +        /* No break here. Intentional fallthrough */
> +        default:
>          master = CopyGetMasterEvent(dev, event, &mevent);
>  
>          if (master)
> -- 
> 1.5.6.3

How about the patch attached. It ends up being the same logic but the code
looks nicer (even though the patch doesn't). Instead of the fallthrough into
the default statement, the default block is moved out of the switch.

This leaves one remaining issue though. Previously, the code would not
process motion events if a screen switch takes place. I've already explained
why we can't drop button and key events but - should we still drop motion
events?
i.e. do we need a if (type == motion) return; after the NewCurrentScreen?

Cheers,
  Peter
>From 8fa7ba401cd257508d3b7db286dc87d3cf070b82 Mon Sep 17 00:00:00 2001
From: Tiago Vignatti <[email protected]>
Date: Wed, 5 Aug 2009 21:02:29 +0300
Subject: [PATCH] mi: fix cursor warping screens

The server was processing ET_RawMotion type when the cursor was wrapping to
another screen and getting wrong valuator values. This fix such issue
considering only ET_Motion, ET_KeyPress, ET_KeyRelease, ET_ButtonPress and
ET_ButtonRelease types when the cursor detects a new screen, keeping the
"normal" processing of device events.

Signed-off-by: Tiago Vignatti <[email protected]>
Signed-off-by: Peter Hutterer <[email protected]>
---
 mi/mieq.c |   67 ++++++++++++++++++++++++++++++++++--------------------------
 1 files changed, 38 insertions(+), 29 deletions(-)

diff --git a/mi/mieq.c b/mi/mieq.c
index 6ec2dba..b27e9da 100644
--- a/mi/mieq.c
+++ b/mi/mieq.c
@@ -367,39 +367,48 @@ mieqProcessDeviceEvent(DeviceIntPtr dev,
     /* Custom event handler */
     handler = miEventQueue.handlers[event->any.type];
 
-    if (dev && screen && screen != DequeueScreen(dev) && !handler) {
-        /* Assumption - screen switching can only occur on motion events. */
-        DequeueScreen(dev) = screen;
-        x = event->device.root_x;
-        y = event->device.root_y;
-        NewCurrentScreen (dev, DequeueScreen(dev), x, y);
+    switch (event->any.type) {
+        /* Catch events that include valuator information and check if they
+         * are changing the screen */
+        case ET_Motion:
+        case ET_KeyPress:
+        case ET_KeyRelease:
+        case ET_ButtonPress:
+        case ET_ButtonRelease:
+            if (dev && screen && screen != DequeueScreen(dev) && !handler) {
+                DequeueScreen(dev) = screen;
+                x = event->device.root_x;
+                y = event->device.root_y;
+                NewCurrentScreen (dev, DequeueScreen(dev), x, y);
+            }
+            break;
+        default:
+            break;
     }
-    else {
-        master = CopyGetMasterEvent(dev, event, &mevent);
+    master = CopyGetMasterEvent(dev, event, &mevent);
 
-        if (master)
-            master->u.lastSlave = dev;
+    if (master)
+        master->u.lastSlave = dev;
 
-        /* If someone's registered a custom event handler, let them
-         * steal it. */
-        if (handler)
-        {
-            int screenNum = dev && DequeueScreen(dev) ? 
DequeueScreen(dev)->myNum : (screen ? screen->myNum : 0);
-            handler(screenNum, event, dev);
-            /* Check for the SD's master in case the device got detached
-             * during event processing */
-            if (master && dev->u.master)
-                handler(screenNum, &mevent, master);
-        } else
-        {
-            /* process slave first, then master */
-            dev->public.processInputProc(event, dev);
+    /* If someone's registered a custom event handler, let them
+     * steal it. */
+    if (handler)
+    {
+        int screenNum = dev && DequeueScreen(dev) ? DequeueScreen(dev)->myNum 
: (screen ? screen->myNum : 0);
+        handler(screenNum, event, dev);
+        /* Check for the SD's master in case the device got detached
+         * during event processing */
+        if (master && dev->u.master)
+            handler(screenNum, &mevent, master);
+    } else
+    {
+        /* process slave first, then master */
+        dev->public.processInputProc(event, dev);
 
-            /* Check for the SD's master in case the device got detached
-             * during event processing */
-            if (master && dev->u.master)
-                master->public.processInputProc(&mevent, master);
-        }
+        /* Check for the SD's master in case the device got detached
+         * during event processing */
+        if (master && dev->u.master)
+            master->public.processInputProc(&mevent, master);
     }
 }
 
-- 
1.6.3.rc1.2.g0164.dirty

_______________________________________________
xorg-devel mailing list
[email protected]
http://lists.x.org/mailman/listinfo/xorg-devel

Reply via email to