On Thu, Sep 18, 2014 at 01:11:03PM +0200, Hans de Goede wrote:
> For features like e.g. disable-touchpad-while-typing, it is necessary for one
> device to be able to listen into another device's events.
> 
> It is tempting to use the existing device_added / device_removed mechanism
> to give e.g. the keyboard a link to the touchpad, and make the keyboard code
> disable / re-enable the touchpad but this wrong. This needs to be a setting
> of the touchpad, and the policy for things like which events to count as
> activity, and what sort of timeout to use to consider the device idle, belongs
> in the touchpad code not in the keyboard code.
> 
> Add an event listeners mechanism so that the touchpad can listen for (e.g.)
> keyboard events, and respond to these itself.
> 
> Signed-off-by: Hans de Goede <[email protected]>
> ---
>  src/libinput-private.h | 18 ++++++++++++++++++
>  src/libinput.c         | 27 +++++++++++++++++++++++++++
>  2 files changed, 45 insertions(+)
> 
> diff --git a/src/libinput-private.h b/src/libinput-private.h
> index cf03c03..94d6580 100644
> --- a/src/libinput-private.h
> +++ b/src/libinput-private.h
> @@ -118,12 +118,19 @@ struct libinput_device_config {
>  struct libinput_device {
>       struct libinput_seat *seat;
>       struct list link;
> +     struct list event_listeners;
>       void *user_data;
>       int terminated;
>       int refcount;
>       struct libinput_device_config config;
>  };
>  
> +struct libinput_event_listener {
> +     struct list link;
> +     void (*notify_func)(struct libinput_event *ev, void *notify_func_data);
> +     void *notify_func_data;
> +};
> +
>  typedef void (*libinput_source_dispatch_t)(void *data);
>  
>  
> @@ -180,6 +187,17 @@ libinput_device_init(struct libinput_device *device,
>                    struct libinput_seat *seat);
>  
>  void
> +libinput_device_add_eventlistener(struct libinput_device *device,

event_listener vs eventlistener here, please use the former. otherwise:
Reviewed-by: Peter Hutterer <[email protected]>

Cheers,
   Peter


> +                               struct libinput_event_listener *listener,
> +                               void (*notify_func)(
> +                                     struct libinput_event *event,
> +                                     void *notify_func_data),
> +                               void *notify_func_data);
> +
> +void
> +libinput_device_remove_eventlistener(struct libinput_event_listener 
> *listener);
> +
> +void
>  notify_added_device(struct libinput_device *device);
>  
>  void
> diff --git a/src/libinput.c b/src/libinput.c
> index 14f0257..79ae90a 100644
> --- a/src/libinput.c
> +++ b/src/libinput.c
> @@ -674,6 +674,7 @@ libinput_device_init(struct libinput_device *device,
>  {
>       device->seat = seat;
>       device->refcount = 1;
> +     list_init(&device->event_listeners);
>  }
>  
>  LIBINPUT_EXPORT struct libinput_device *
> @@ -686,6 +687,7 @@ libinput_device_ref(struct libinput_device *device)
>  static void
>  libinput_device_destroy(struct libinput_device *device)
>  {
> +     assert(list_empty(&device->event_listeners));
>       evdev_device_destroy((struct evdev_device *) device);
>  }
>  
> @@ -732,6 +734,25 @@ libinput_dispatch(struct libinput *libinput)
>       return 0;
>  }
>  
> +void
> +libinput_device_add_eventlistener(struct libinput_device *device,
> +                               struct libinput_event_listener *listener,
> +                               void (*notify_func)(
> +                                     struct libinput_event *event,
> +                                     void *notify_func_data),
> +                               void *notify_func_data)
> +{
> +     listener->notify_func = notify_func;
> +     listener->notify_func_data = notify_func_data;
> +     list_insert(&device->event_listeners, &listener->link);
> +}
> +
> +void
> +libinput_device_remove_eventlistener(struct libinput_event_listener 
> *listener)
> +{
> +     list_remove(&listener->link);
> +}
> +
>  static uint32_t
>  update_seat_key_count(struct libinput_seat *seat,
>                     int32_t key,
> @@ -798,7 +819,13 @@ post_device_event(struct libinput_device *device,
>                 enum libinput_event_type type,
>                 struct libinput_event *event)
>  {
> +     struct libinput_event_listener *listener, *tmp;
> +
>       init_event_base(event, device, type);
> +
> +     list_for_each_safe(listener, tmp, &device->event_listeners, link)
> +             listener->notify_func(event, listener->notify_func_data);
> +
>       libinput_post_event(device->seat->libinput, event);
>  }
>  
> -- 
> 2.1.0
> 
> _______________________________________________
> wayland-devel mailing list
> [email protected]
> http://lists.freedesktop.org/mailman/listinfo/wayland-devel
> 
_______________________________________________
wayland-devel mailing list
[email protected]
http://lists.freedesktop.org/mailman/listinfo/wayland-devel

Reply via email to