[PATCH libinput 16/26] tablet: add support for libinput_tool_has_button
Lyude
thatslyude at gmail.com
Thu Feb 26 06:23:14 PST 2015
On Tue, 2015-02-24 at 16:21 +1000, Peter Hutterer wrote:
> libwacom can tell us how many buttons we have per stylus, so we map those into
> BTN_STYLUS and BTN_STYLUS2.
> BTN_TOUCH is set on all styli.
>
> Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>
> ---
> src/evdev-tablet.c | 73 ++++++++++++++++++++++++++++++++++++++++++++++++++
> src/libinput-private.h | 1 +
> src/libinput.c | 10 +++++++
> src/libinput.h | 15 +++++++++++
> src/libinput.sym | 1 +
> 5 files changed, 100 insertions(+)
>
> diff --git a/src/evdev-tablet.c b/src/evdev-tablet.c
> index 85bdcd7..ced9207 100644
> --- a/src/evdev-tablet.c
> +++ b/src/evdev-tablet.c
> @@ -382,6 +382,51 @@ copy_axis_cap(const struct tablet_dispatch *tablet,
> set_bit(tool->axis_caps, axis);
> }
>
> +static inline void
> +copy_button_cap(const struct tablet_dispatch *tablet,
> + struct libinput_tool *tool,
> + uint32_t button)
> +{
> + struct libevdev *evdev = tablet->device->evdev;
> + if (libevdev_has_event_code(evdev, EV_KEY, button))
> + set_bit(tool->buttons, button);
> +}
> +
> +static void
> +tool_set_bits_from_libwacom(const struct tablet_dispatch *tablet,
> + struct libinput_tool *tool)
> +{
> +#if HAVE_LIBWACOM
> + WacomDeviceDatabase *db;
> + const WacomStylus *s = NULL;
> + int code;
> +
> + db = libwacom_database_new();
> + if (!db)
> + goto out;
> + s = libwacom_stylus_get_for_id(db, tool->tool_id);
> + if (!s)
> + goto out;
> +
> + if (libwacom_stylus_get_type(s) == WSTYLUS_PUCK) {
> + for (code = BTN_LEFT;
> + code < BTN_LEFT + libwacom_stylus_get_num_buttons(s);
> + code++)
> + copy_button_cap(tablet, tool, code);
> + } else {
> + if (libwacom_stylus_get_num_buttons(s) >= 2)
> + copy_button_cap(tablet, tool, BTN_STYLUS2);
> + if (libwacom_stylus_get_num_buttons(s) >= 1)
> + copy_button_cap(tablet, tool, BTN_STYLUS);
> + copy_button_cap(tablet, tool, BTN_TOUCH);
> + }
> +
> +out:
> + if (db)
> + libwacom_database_destroy(db);
Maybe it's just me, but shouldn't we say something with log_info() here
in the event that libwacom doesn't get initialized properly? Other then
that, everything looks good.
> +#endif
> +}
> +
> static void
> tool_set_bits(const struct tablet_dispatch *tablet,
> struct libinput_tool *tool)
> @@ -413,6 +458,34 @@ tool_set_bits(const struct tablet_dispatch *tablet,
> default:
> break;
> }
> +
> +#if HAVE_LIBWACOM
> + tool_set_bits_from_libwacom(tablet, tool);
> +#else
> + /* If we don't have libwacom, copy all pen-related ones from the
> + tablet vs all mouse-related ones */
> + switch (type) {
> + case LIBINPUT_TOOL_PEN:
> + case LIBINPUT_TOOL_BRUSH:
> + case LIBINPUT_TOOL_AIRBRUSH:
> + case LIBINPUT_TOOL_PENCIL:
> + case LIBINPUT_TOOL_ERASER:
> + copy_button_cap(tablet, tool, BTN_STYLUS);
> + copy_button_cap(tablet, tool, BTN_STYLUS2);
> + copy_button_cap(tablet, tool, BTN_TOUCH);
> + break;
> + case LIBINPUT_TOOL_MOUSE:
> + case LIBINPUT_TOOL_LENS:
> + copy_button_cap(tablet, tool, BTN_LEFT);
> + copy_button_cap(tablet, tool, BTN_MIDDLE);
> + copy_button_cap(tablet, tool, BTN_RIGHT);
> + copy_button_cap(tablet, tool, BTN_SIDE);
> + copy_button_cap(tablet, tool, BTN_EXTRA);
> + break;
> + default:
> + break;
> + }
> +#endif
> }
>
> static struct libinput_tool *
> diff --git a/src/libinput-private.h b/src/libinput-private.h
> index b2dc406..9f32655 100644
> --- a/src/libinput-private.h
> +++ b/src/libinput-private.h
> @@ -191,6 +191,7 @@ struct libinput_tool {
> uint32_t tool_id;
> enum libinput_tool_type type;
> unsigned char axis_caps[NCHARS(LIBINPUT_TABLET_AXIS_MAX + 1)];
> + unsigned char buttons[NCHARS(KEY_MAX) + 1];
> int refcount;
> void *user_data;
> };
> diff --git a/src/libinput.c b/src/libinput.c
> index b165c59..5ed3ffc 100644
> --- a/src/libinput.c
> +++ b/src/libinput.c
> @@ -681,6 +681,16 @@ libinput_tool_has_axis(struct libinput_tool *tool,
> return bit_is_set(tool->axis_caps, axis);
> }
>
> +LIBINPUT_EXPORT int
> +libinput_tool_has_button(struct libinput_tool *tool,
> + uint32_t code)
> +{
> + if (NCHARS(code) > sizeof(tool->buttons))
> + return 0;
> +
> + return bit_is_set(tool->buttons, code);
> +}
> +
> LIBINPUT_EXPORT void
> libinput_tool_set_user_data(struct libinput_tool *tool,
> void *user_data)
> diff --git a/src/libinput.h b/src/libinput.h
> index f746671..02b2c11 100644
> --- a/src/libinput.h
> +++ b/src/libinput.h
> @@ -1244,6 +1244,21 @@ libinput_tool_has_axis(struct libinput_tool *tool,
> /**
> * @ingroup event_tablet
> *
> + * Check if a tablet tool has a button with the
> + * passed-in code (see linux/input.h).
> + *
> + * @param tool A tablet tool
> + * @param code button code to check for
> + *
> + * @return 1 if the tool supports this button code, 0 if it does not
> + */
> +int
> +libinput_tool_has_button(struct libinput_tool *tool,
> + uint32_t code);
> +
> +/**
> + * @ingroup event_tablet
> + *
> * Decrement the ref count of tool by one. When the ref count of tool reaches 0,
> * the memory allocated for tool will be freed.
> *
> diff --git a/src/libinput.sym b/src/libinput.sym
> index 5561478..e674226 100644
> --- a/src/libinput.sym
> +++ b/src/libinput.sym
> @@ -159,6 +159,7 @@ LIBINPUT_TABLET_SUPPORT {
> libinput_tool_get_tool_id;
> libinput_tool_get_type;
> libinput_tool_get_user_data;
> + libinput_tool_has_button;
> libinput_tool_has_axis;
> libinput_tool_ref;
> libinput_tool_set_user_data;
More information about the wayland-devel
mailing list