[PATCH] Count the number of logically down buttons in buttonsDown

Peter Hutterer peter.hutterer at who-t.net
Thu Jan 15 17:04:04 PST 2009


On Mon, Jan 05, 2009 at 11:55:40AM -0500, Thomas Jaeger wrote:
> From 3f8ba578ad18b7135031197f6ec5145afcd1479a Mon Sep 17 00:00:00 2001
> From: Thomas Jaeger <ThJaeger at gmail.com>
> Date: Mon, 22 Dec 2008 00:55:09 +0100
> Subject: [PATCH] Count the number of logically down buttons in buttonsDown
> 
> This fixes the following bug.  Assuming your window manager grabs
> Alt+Button1 to move windows, map Button3 to 0 via XSetPointerMapping,
> then press the physical button 3 (this shouldn't have any effect), press
> Alt and then button 1.  The press event is delivered to the application
> instead of firing the grab.

Signed off and pushed (finally). Thanks for the patch.
Can you send me the updated version of the other patch please, AFAICT there
was a minor change missing.

Cheers,
  Peter

> ---
>  Xi/exevents.c      |    8 ++++----
>  include/inputstr.h |    6 +++++-
>  2 files changed, 9 insertions(+), 5 deletions(-)
> 
> diff --git a/Xi/exevents.c b/Xi/exevents.c
> index 2aa3161..b4359a8 100644
> --- a/Xi/exevents.c
> +++ b/Xi/exevents.c
> @@ -895,10 +895,10 @@ UpdateDeviceState(DeviceIntPtr device, xEvent* xE, int count)
>          *kptr |= bit;
>  	if (device->valuator)
>  	    device->valuator->motionHintWindow = NullWindow;
> -        b->buttonsDown++;
> -	b->motionMask = DeviceButtonMotionMask;
>          if (!b->map[key])
>              return DONT_PROCESS;
> +        b->buttonsDown++;
> +	b->motionMask = DeviceButtonMotionMask;
>          if (b->map[key] <= 5)
>  	    b->state |= (Button1Mask >> 1) << b->map[key];
>  	SetMaskForEvent(device->id, Motion_Filter(b), DeviceMotionNotify);
> @@ -927,10 +927,10 @@ UpdateDeviceState(DeviceIntPtr device, xEvent* xE, int count)
>          *kptr &= ~bit;
>  	if (device->valuator)
>  	    device->valuator->motionHintWindow = NullWindow;
> -        if (b->buttonsDown >= 1 && !--b->buttonsDown)
> -	    b->motionMask = 0;
>          if (!b->map[key])
>              return DONT_PROCESS;
> +        if (b->buttonsDown >= 1 && !--b->buttonsDown)
> +	    b->motionMask = 0;
>  	if (b->map[key] <= 5)
>  	    b->state &= ~((Button1Mask >> 1) << b->map[key]);
>  	SetMaskForEvent(device->id, Motion_Filter(b), DeviceMotionNotify);
> diff --git a/include/inputstr.h b/include/inputstr.h
> index 4719d37..515b6aa 100644
> --- a/include/inputstr.h
> +++ b/include/inputstr.h
> @@ -185,7 +185,11 @@ typedef struct _ValuatorClassRec {
>  
>  typedef struct _ButtonClassRec {
>      CARD8		numButtons;
> -    CARD8		buttonsDown;	/* number of buttons currently down */
> +    CARD8		buttonsDown;	/* number of buttons currently down
> +                                           This counts logical buttons, not 
> +					   physical ones, i.e if some buttons
> +					   are mapped to 0, they're not counted
> +					   here */
>      unsigned short	state;
>      Mask		motionMask;
>      CARD8		down[DOWN_LENGTH];
> -- 
> 1.6.0.4
> 




More information about the xorg mailing list