[PATCH 1/2] mi: fix cursor warping screens

Peter Hutterer peter.hutterer at who-t.net
Thu Aug 6 16:58:41 PDT 2009


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 <tiago.vignatti at nokia.com>
> 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 <tiago.vignatti at nokia.com>
> ---
>  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
-------------- next part --------------



More information about the xorg-devel mailing list