[PATCH 09/21] Xi: split updating button count and state into helper functions

Chase Douglas chase.douglas at canonical.com
Sun Dec 11 21:27:25 PST 2011


On 12/08/2011 07:36 PM, Peter Hutterer wrote:
> Functional change: for a button mapped to 0, the motionHintWindow is not
> updated to the NullWindow anymore. Before it got updated unconditionally to
> the button mapping. I have no idea what the practical effect of this is, but
> I guess it's closer to the correct behaviour: pressing a button that's
> logically disabled now does not disrupt the motion hint delivery.
> 
> Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>
> ---
>  Xi/exevents.c |   41 +++++++++++++++++++++++++++++------------
>  1 files changed, 29 insertions(+), 12 deletions(-)
> 
> diff --git a/Xi/exevents.c b/Xi/exevents.c
> index 1140554..dab467c 100644
> --- a/Xi/exevents.c
> +++ b/Xi/exevents.c
> @@ -726,6 +726,32 @@ UpdateDeviceMotionMask(DeviceIntPtr device, unsigned short state,
>      SetMaskForEvent(device->id, mask, MotionNotify);
>  }
>  
> +static void
> +IncreaseButtonCount(DeviceIntPtr dev, int key, CARD8 *buttons_down,
> +                    Mask *motion_mask, unsigned short *state)
> +{
> +    if (dev->valuator)
> +        dev->valuator->motionHintWindow = NullWindow;
> +
> +    (*buttons_down)++;
> +    *motion_mask = DeviceButtonMotionMask;
> +    if (dev->button->map[key] <= 5)
> +        *state |= (Button1Mask >> 1) << dev->button->map[key];
> +}
> +
> +static void
> +DecreaseButtonCount(DeviceIntPtr dev, int key, CARD8 *buttons_down,
> +                    Mask *motion_mask, unsigned short *state)
> +{
> +    if (dev->valuator)
> +        dev->valuator->motionHintWindow = NullWindow;
> +
> +    if (*buttons_down >= 1 && !--(*buttons_down))
> +        *motion_mask = 0;
> +    if (dev->button->map[key] <= 5)
> +        *state &= ~((Button1Mask >> 1) << dev->button->map[key]);
> +}
> +
>  /**
>   * Update the device state according to the data in the event.
>   *
> @@ -831,15 +857,11 @@ UpdateDeviceState(DeviceIntPtr device, DeviceEvent* event)
>              return DONT_PROCESS;
>  
>          set_button_down(device, key, BUTTON_PROCESSED);
> -	if (device->valuator)
> -	    device->valuator->motionHintWindow = NullWindow;
> +
>          if (!b->map[key])
>              return DONT_PROCESS;
> -        b->buttonsDown++;
> -	b->motionMask = DeviceButtonMotionMask;
> -        if (b->map[key] <= 5)
> -	    b->state |= (Button1Mask >> 1) << b->map[key];
>  
> +        IncreaseButtonCount(device, key, &b->buttonsDown, &b->motionMask, &b->state);
>          UpdateDeviceMotionMask(device, b->state, b->motionMask);
>      } else if (event->type == ET_ButtonRelease) {
>          if (!b)
> @@ -867,15 +889,10 @@ UpdateDeviceState(DeviceIntPtr device, DeviceEvent* event)
>              }
>          }
>          set_button_up(device, key, BUTTON_PROCESSED);
> -	if (device->valuator)
> -	    device->valuator->motionHintWindow = NullWindow;
>          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]);
>  
> +        DecreaseButtonCount(device, key, &b->buttonsDown, &b->motionMask, &b->state);
>          UpdateDeviceMotionMask(device,  b->state, b->motionMask);
>      } else if (event->type == ET_ProximityIn)
>  	device->proximity->in_proximity = TRUE;

Why not just pass a pointer to the button class instead of pointers to
three fields of the button class?

-- Chase


More information about the xorg-devel mailing list