On Sun, Jul 27, 2014 at 11:28:29PM +0200, Jonas Ådahl wrote:
> Keep track of the number of times a given button or key is pressed on a
> device. For regular mouse devices or keyboard devices, such a count will
> never exceed 1, but counting button presses could help when button
> presses with the same code can originate from different sources. One could
> for example implement overlapping tap-drags with button presses by
> having them deal with their own life-time independently, sorting out
> when the user should receive button presses or not depending on the
> pressed count.
> 
> Signed-off-by: Jonas Ådahl <jad...@gmail.com>
> ---
>  src/evdev-mt-touchpad-buttons.c | 30 +++++++++++++------------
>  src/evdev-mt-touchpad-tap.c     |  8 +++----
>  src/evdev.c                     | 49 
> +++++++++++++++++++++++++++++++++++++----
>  src/evdev.h                     | 13 +++++++++++
>  4 files changed, 78 insertions(+), 22 deletions(-)
> 
> diff --git a/src/evdev-mt-touchpad-buttons.c b/src/evdev-mt-touchpad-buttons.c
> index fe33d0b..8a28054 100644
> --- a/src/evdev-mt-touchpad-buttons.c
> +++ b/src/evdev-mt-touchpad-buttons.c
> @@ -606,11 +606,12 @@ tp_post_clickfinger_buttons(struct tp_dispatch *tp, 
> uint64_t time)
>               state = LIBINPUT_BUTTON_STATE_RELEASED;
>       }
>  
> -     if (button)
> -             pointer_notify_button(&tp->device->base,
> -                                   time,
> -                                   button,
> -                                   state);
> +     if (button) {
> +             evdev_pointer_notify_button(tp->device,
> +                                         time,
> +                                         button,
> +                                         state);
> +     }
>       return 1;
>  }
>  
> @@ -632,10 +633,10 @@ tp_post_physical_buttons(struct tp_dispatch *tp, 
> uint64_t time)
>                       else
>                               state = LIBINPUT_BUTTON_STATE_RELEASED;
>  
> -                     pointer_notify_button(&tp->device->base,
> -                                           time,
> -                                           button,
> -                                           state);
> +                     evdev_pointer_notify_button(tp->device,
> +                                                 time,
> +                                                 button,
> +                                                 state);
>               }
>  
>               button++;
> @@ -707,11 +708,12 @@ tp_post_softbutton_buttons(struct tp_dispatch *tp, 
> uint64_t time)
>  
>       tp->buttons.click_pending = false;
>  
> -     if (button)
> -             pointer_notify_button(&tp->device->base,
> -                                   time,
> -                                   button,
> -                                   state);
> +     if (button) {
> +             evdev_pointer_notify_button(tp->device,
> +                                         time,
> +                                         button,
> +                                         state);
> +     }
>       return 1;
>  }
>  
> diff --git a/src/evdev-mt-touchpad-tap.c b/src/evdev-mt-touchpad-tap.c
> index 6008507..64801a8 100644
> --- a/src/evdev-mt-touchpad-tap.c
> +++ b/src/evdev-mt-touchpad-tap.c
> @@ -113,10 +113,10 @@ tp_tap_notify(struct tp_dispatch *tp,
>               return;
>       }
>  
> -     pointer_notify_button(&tp->device->base,
> -                           time,
> -                           button,
> -                           state);
> +     evdev_pointer_notify_button(tp->device,
> +                                 time,
> +                                 button,
> +                                 state);
>  }
>  
>  static void
> diff --git a/src/evdev.c b/src/evdev.c
> index 0f4874c..f656a5e 100644
> --- a/src/evdev.c
> +++ b/src/evdev.c
> @@ -59,6 +59,47 @@ is_key_pressed(struct evdev_device *device, int code)
>       return long_bit_is_set(device->key_mask, code);
>  }
>  
> +static int
> +update_key_pressed_count(struct evdev_device *device, int code, int pressed)

see my "pressed" vs "down" comment in the previous email, update if you
updated the other one

> +{
> +     assert(code >= 0 && code < KEY_CNT);
> +
> +     if (pressed) {
> +             return ++device->key_count[code];

want to add checks for == 255? or tbh, a log_bug for something like 32 or 64
seems a sensible thing to do too.

> +     } else {
> +             assert(device->key_count[code] > 0);
> +             return --device->key_count[code];
> +     }
> +}
> +
> +void
> +evdev_keyboard_notify_key(struct evdev_device *device,
> +                       uint32_t time,
> +                       int key,
> +                       enum libinput_key_state state)
> +{
> +     int pressed_count;
> +
> +     pressed_count = update_key_pressed_count(device, key, state);
> +
> +     if ((state && pressed_count == 1) || (!state && pressed_count == 0))

please use the enum symbolic names LIBINPUT_KEY_STATE_PRESSED etc. for the
states.

> +             keyboard_notify_key(&device->base, time, key, state);
> +}
> +
> +void
> +evdev_pointer_notify_button(struct evdev_device *device,
> +                         uint32_t time,
> +                         int button,
> +                         enum libinput_button_state state)
> +{
> +     int pressed_count;
> +
> +     pressed_count = update_key_pressed_count(device, button, state);
> +
> +     if ((state && pressed_count == 1) || (!state && pressed_count == 0))
> +             pointer_notify_button(&device->base, time, button, state);

here too, with that Reviewed-by: Peter Hutterer <peter.hutte...@who-t.net>

Cheers,
   Peter

> +}
> +
>  void
>  evdev_device_led_update(struct evdev_device *device, enum libinput_led leds)
>  {
> @@ -341,16 +382,16 @@ evdev_process_key(struct evdev_device *device,
>       case EVDEV_KEY_TYPE_NONE:
>               break;
>       case EVDEV_KEY_TYPE_KEY:
> -             keyboard_notify_key(
> -                     &device->base,
> +             evdev_keyboard_notify_key(
> +                     device,
>                       time,
>                       e->code,
>                       e->value ? LIBINPUT_KEY_STATE_PRESSED :
>                                  LIBINPUT_KEY_STATE_RELEASED);
>               break;
>       case EVDEV_KEY_TYPE_BUTTON:
> -             pointer_notify_button(
> -                     &device->base,
> +             evdev_pointer_notify_button(
> +                     device,
>                       time,
>                       e->code,
>                       e->value ? LIBINPUT_BUTTON_STATE_PRESSED :
> diff --git a/src/evdev.h b/src/evdev.h
> index f71d387..1819ae8 100644
> --- a/src/evdev.h
> +++ b/src/evdev.h
> @@ -96,6 +96,7 @@ struct evdev_device {
>       } pointer;
>  
>       unsigned long key_mask[NLONGS(KEY_CNT)];
> +     uint8_t key_count[KEY_CNT];
>  };
>  
>  #define EVDEV_UNHANDLED_DEVICE ((struct evdev_device *) 1)
> @@ -175,6 +176,18 @@ evdev_device_transform_y(struct evdev_device *device,
>                        uint32_t height);
>  
>  void
> +evdev_keyboard_notify_key(struct evdev_device *device,
> +                       uint32_t time,
> +                       int key,
> +                       enum libinput_key_state state);
> +
> +void
> +evdev_pointer_notify_button(struct evdev_device *device,
> +                         uint32_t time,
> +                         int button,
> +                         enum libinput_button_state state);
> +
> +void
>  evdev_device_remove(struct evdev_device *device);
>  
>  void
> -- 
> 1.8.5.1
> 
> _______________________________________________
> wayland-devel mailing list
> wayland-devel@lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/wayland-devel
> 
_______________________________________________
wayland-devel mailing list
wayland-devel@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/wayland-devel

Reply via email to