diff --git a/include/input/tablet.h b/include/input/tablet.h index 4d6c50ba..df8537d5 100644 --- a/include/input/tablet.h +++ b/include/input/tablet.h @@ -20,6 +20,7 @@ struct drawing_tablet { } handlers; }; -void tablet_setup_handlers(struct seat *seat, struct wlr_input_device *wlr_input_device); +uint32_t tablet_get_mapped_button(uint32_t src_button); +void tablet_init(struct seat *seat, struct wlr_input_device *wlr_input_device); #endif /* LABWC_TABLET_H */ diff --git a/include/input/tablet_pad.h b/include/input/tablet_pad.h new file mode 100644 index 00000000..144bec7d --- /dev/null +++ b/include/input/tablet_pad.h @@ -0,0 +1,21 @@ +/* SPDX-License-Identifier: GPL-2.0-only */ +#ifndef LABWC_TABLET_PAD_H +#define LABWC_TABLET_PAD_H + +#include +struct seat; +struct wlr_device; +struct wlr_input_device; + +struct drawing_tablet_pad { + struct seat *seat; + struct wlr_tablet_pad *tablet; + struct { + struct wl_listener button; + struct wl_listener destroy; + } handlers; +}; + +void tablet_pad_init(struct seat *seat, struct wlr_input_device *wlr_input_device); + +#endif /* LABWC_TABLET_PAD_H */ diff --git a/src/input/meson.build b/src/input/meson.build index 9b8b9a20..c8b7717c 100644 --- a/src/input/meson.build +++ b/src/input/meson.build @@ -1,6 +1,7 @@ labwc_sources += files( 'cursor.c', 'tablet.c', + 'tablet_pad.c', 'gestures.c', 'input.c', 'keyboard.c', diff --git a/src/input/tablet.c b/src/input/tablet.c index 662ce0c7..0a24d619 100644 --- a/src/input/tablet.c +++ b/src/input/tablet.c @@ -86,8 +86,8 @@ handle_axis(struct wl_listener *listener, void *data) // Ignore other events } -static uint32_t -get_mapped_button(uint32_t src_button) +uint32_t +tablet_get_mapped_button(uint32_t src_button) { struct button_map_entry *map_entry; for (size_t i = 0; i < rc.tablet.button_map_count; i++) { @@ -106,7 +106,7 @@ handle_tip(struct wl_listener *listener, void *data) struct wlr_tablet_tool_tip_event *ev = data; struct drawing_tablet *tablet = ev->tablet->data; - uint32_t button = get_mapped_button(BTN_TOOL_PEN); + uint32_t button = tablet_get_mapped_button(BTN_TOOL_PEN); if (!button) { return; } @@ -125,7 +125,7 @@ handle_button(struct wl_listener *listener, void *data) struct wlr_tablet_tool_button_event *ev = data; struct drawing_tablet *tablet = ev->tablet->data; - uint32_t button = get_mapped_button(ev->button); + uint32_t button = tablet_get_mapped_button(ev->button); if (!button) { return; } @@ -141,14 +141,8 @@ handle_destroy(struct wl_listener *listener, void *data) free(tablet); } -static void -setup_pad(struct seat *seat, struct wlr_input_device *wlr_device) -{ - wlr_log(WLR_INFO, "not setting up pad"); -} - -static void -setup_pen(struct seat *seat, struct wlr_input_device *wlr_device) +void +tablet_init(struct seat *seat, struct wlr_input_device *wlr_device) { wlr_log(WLR_DEBUG, "setting up tablet"); struct drawing_tablet *tablet = znew(*tablet); @@ -164,18 +158,3 @@ setup_pen(struct seat *seat, struct wlr_input_device *wlr_device) CONNECT_SIGNAL(tablet->tablet, &tablet->handlers, button); CONNECT_SIGNAL(wlr_device, &tablet->handlers, destroy); } - -void -tablet_setup_handlers(struct seat *seat, struct wlr_input_device *device) -{ - switch (device->type) { - case WLR_INPUT_DEVICE_TABLET_PAD: - setup_pad(seat, device); - break; - case WLR_INPUT_DEVICE_TABLET_TOOL: - setup_pen(seat, device); - break; - default: - assert(false && "tried to add non-tablet as tablet"); - } -} diff --git a/src/input/tablet_pad.c b/src/input/tablet_pad.c new file mode 100644 index 00000000..3c1b2a9b --- /dev/null +++ b/src/input/tablet_pad.c @@ -0,0 +1,46 @@ +// SPDX-License-Identifier: GPL-2.0-only +#include +#include +#include +#include +#include "common/macros.h" +#include "common/mem.h" +#include "config/rcxml.h" +#include "input/cursor.h" +#include "input/tablet.h" +#include "input/tablet_pad.h" + +static void +handle_button(struct wl_listener *listener, void *data) +{ + struct drawing_tablet_pad *tablet_pad = + wl_container_of(listener, tablet_pad, handlers.button); + struct wlr_tablet_pad_button_event *ev = data; + + uint32_t button = tablet_get_mapped_button(ev->button); + if (!button) { + return; + } + + cursor_emulate_button(tablet_pad->seat, button, ev->state, ev->time_msec); +} + +static void +handle_destroy(struct wl_listener *listener, void *data) +{ + struct drawing_tablet_pad *tablet = + wl_container_of(listener, tablet, handlers.destroy); + free(tablet); +} + +void +tablet_pad_init(struct seat *seat, struct wlr_input_device *wlr_device) +{ + wlr_log(WLR_DEBUG, "setting up tablet pad"); + struct drawing_tablet_pad *tablet = znew(*tablet); + tablet->seat = seat; + tablet->tablet = wlr_tablet_pad_from_input_device(wlr_device); + tablet->tablet->data = tablet; + CONNECT_SIGNAL(tablet->tablet, &tablet->handlers, button); + CONNECT_SIGNAL(wlr_device, &tablet->handlers, destroy); +} diff --git a/src/seat.c b/src/seat.c index 2f207a90..b8fb636d 100644 --- a/src/seat.c +++ b/src/seat.c @@ -10,6 +10,7 @@ #include #include "common/mem.h" #include "input/tablet.h" +#include "input/tablet_pad.h" #include "input/input.h" #include "input/keyboard.h" #include "input/key-state.h" @@ -283,7 +284,17 @@ new_tablet(struct seat *seat, struct wlr_input_device *dev) { struct input *input = znew(*input); input->wlr_input_device = dev; - tablet_setup_handlers(seat, dev); + tablet_init(seat, dev); + + return input; +} + +static struct input * +new_tablet_pad(struct seat *seat, struct wlr_input_device *dev) +{ + struct input *input = znew(*input); + input->wlr_input_device = dev; + tablet_pad_init(seat, dev); return input; } @@ -341,6 +352,8 @@ new_input_notify(struct wl_listener *listener, void *data) input = new_touch(seat, device); break; case WLR_INPUT_DEVICE_TABLET_PAD: + input = new_tablet_pad(seat, device); + break; case WLR_INPUT_DEVICE_TABLET_TOOL: input = new_tablet(seat, device); break;