diff options
author | nyorain <nyorain@gmail.com> | 2017-06-19 21:22:42 +0200 |
---|---|---|
committer | nyorain <nyorain@gmail.com> | 2017-06-19 21:22:42 +0200 |
commit | e65ca967f9f025748ce0710a09450ce05c5a36dd (patch) | |
tree | 79a78aadee4de5e16f9e4d67510463e628a95909 /backend/libinput | |
parent | 10526de444b58ab4959d086538845303a06acfc1 (diff) | |
parent | 41b5294013cdf054e9dd49ef83ca6fee74f769a4 (diff) |
Merge branch 'master' into wayland-backend
Diffstat (limited to 'backend/libinput')
-rw-r--r-- | backend/libinput/events.c | 14 | ||||
-rw-r--r-- | backend/libinput/keyboard.c | 23 | ||||
-rw-r--r-- | backend/libinput/tablet_pad.c | 95 |
3 files changed, 130 insertions, 2 deletions
diff --git a/backend/libinput/events.c b/backend/libinput/events.c index 8ebec63b..2e7cc541 100644 --- a/backend/libinput/events.c +++ b/backend/libinput/events.c @@ -91,7 +91,10 @@ static void handle_device_added(struct wlr_backend_state *state, wl_signal_emit(&state->backend->events.input_add, wlr_device); } if (libinput_device_has_capability(device, LIBINPUT_DEVICE_CAP_TABLET_PAD)) { - // TODO + struct wlr_input_device *wlr_device = allocate_device(state, + device, devices, WLR_INPUT_DEVICE_TABLET_PAD); + wlr_device->tablet_pad = wlr_libinput_tablet_pad_create(device); + wl_signal_emit(&state->backend->events.input_add, wlr_device); } if (libinput_device_has_capability(device, LIBINPUT_DEVICE_CAP_GESTURE)) { // TODO @@ -169,6 +172,15 @@ void wlr_libinput_event(struct wlr_backend_state *state, case LIBINPUT_EVENT_TABLET_TOOL_BUTTON: handle_tablet_tool_button(event, device); break; + case LIBINPUT_EVENT_TABLET_PAD_BUTTON: + handle_tablet_pad_button(event, device); + break; + case LIBINPUT_EVENT_TABLET_PAD_RING: + handle_tablet_pad_ring(event, device); + break; + case LIBINPUT_EVENT_TABLET_PAD_STRIP: + handle_tablet_pad_strip(event, device); + break; default: wlr_log(L_DEBUG, "Unknown libinput event %d", event_type); break; diff --git a/backend/libinput/keyboard.c b/backend/libinput/keyboard.c index 9ad41a78..f94f0103 100644 --- a/backend/libinput/keyboard.c +++ b/backend/libinput/keyboard.c @@ -8,11 +8,32 @@ #include "common/log.h" #include "types.h" +struct wlr_keyboard_state { + struct libinput_device *device; +}; + +static void wlr_libinput_keyboard_set_leds(struct wlr_keyboard_state *kbstate, uint32_t leds) { + libinput_device_led_update(kbstate->device, leds); +} + +static void wlr_libinput_keyboard_destroy(struct wlr_keyboard_state *kbstate) { + libinput_device_unref(kbstate->device); + free(kbstate); +} + +struct wlr_keyboard_impl impl = { + .destroy = wlr_libinput_keyboard_destroy, + .led_update = wlr_libinput_keyboard_set_leds +}; + struct wlr_keyboard *wlr_libinput_keyboard_create( struct libinput_device *device) { assert(device); + struct wlr_keyboard_state *kbstate = calloc(1, sizeof(struct wlr_keyboard_state)); + kbstate->device = device; + libinput_device_ref(device); libinput_device_led_update(device, 0); - return wlr_keyboard_create(NULL, NULL); + return wlr_keyboard_create(&impl, kbstate); } void handle_keyboard_key(struct libinput_event *event, diff --git a/backend/libinput/tablet_pad.c b/backend/libinput/tablet_pad.c new file mode 100644 index 00000000..ee7c82f8 --- /dev/null +++ b/backend/libinput/tablet_pad.c @@ -0,0 +1,95 @@ +#include <stdlib.h> +#include <assert.h> +#include <libinput.h> +#include <wlr/session.h> +#include <wlr/types.h> +#include <wlr/common/list.h> +#include "backend/libinput.h" +#include "common/log.h" +#include "types.h" + +struct wlr_tablet_pad *wlr_libinput_tablet_pad_create( + struct libinput_device *device) { + assert(device); + return wlr_tablet_pad_create(NULL, NULL); +} + +void handle_tablet_pad_button(struct libinput_event *event, + struct libinput_device *device) { + struct wlr_input_device *dev = + get_appropriate_device(WLR_INPUT_DEVICE_TABLET_PAD, device); + if (!dev) { + wlr_log(L_DEBUG, "Got a tablet pad event for a device with no tablet pad?"); + return; + } + struct libinput_event_tablet_pad *pevent = + libinput_event_get_tablet_pad_event(event); + struct wlr_tablet_pad_button *wlr_event = + calloc(1, sizeof(struct wlr_tablet_pad_button)); + wlr_event->time_sec = libinput_event_tablet_pad_get_time(pevent); + wlr_event->time_usec = libinput_event_tablet_pad_get_time_usec(pevent); + wlr_event->button = libinput_event_tablet_pad_get_button_number(pevent); + switch (libinput_event_tablet_pad_get_button_state(pevent)) { + case LIBINPUT_BUTTON_STATE_PRESSED: + wlr_event->state = WLR_BUTTON_PRESSED; + break; + case LIBINPUT_BUTTON_STATE_RELEASED: + wlr_event->state = WLR_BUTTON_RELEASED; + break; + } + wl_signal_emit(&dev->tablet_pad->events.button, wlr_event); +} + +void handle_tablet_pad_ring(struct libinput_event *event, + struct libinput_device *device) { + struct wlr_input_device *dev = + get_appropriate_device(WLR_INPUT_DEVICE_TABLET_PAD, device); + if (!dev) { + wlr_log(L_DEBUG, "Got a tablet pad event for a device with no tablet pad?"); + return; + } + struct libinput_event_tablet_pad *pevent = + libinput_event_get_tablet_pad_event(event); + struct wlr_tablet_pad_ring *wlr_event = + calloc(1, sizeof(struct wlr_tablet_pad_ring)); + wlr_event->time_sec = libinput_event_tablet_pad_get_time(pevent); + wlr_event->time_usec = libinput_event_tablet_pad_get_time_usec(pevent); + wlr_event->ring = libinput_event_tablet_pad_get_ring_number(pevent); + wlr_event->position = libinput_event_tablet_pad_get_ring_position(pevent); + switch (libinput_event_tablet_pad_get_ring_source(pevent)) { + case LIBINPUT_TABLET_PAD_RING_SOURCE_UNKNOWN: + wlr_event->source = WLR_TABLET_PAD_RING_SOURCE_UNKNOWN; + break; + case LIBINPUT_TABLET_PAD_RING_SOURCE_FINGER: + wlr_event->source = WLR_TABLET_PAD_RING_SOURCE_FINGER; + break; + } + wl_signal_emit(&dev->tablet_pad->events.ring, wlr_event); +} + +void handle_tablet_pad_strip(struct libinput_event *event, + struct libinput_device *device) { + struct wlr_input_device *dev = + get_appropriate_device(WLR_INPUT_DEVICE_TABLET_PAD, device); + if (!dev) { + wlr_log(L_DEBUG, "Got a tablet pad event for a device with no tablet pad?"); + return; + } + struct libinput_event_tablet_pad *pevent = + libinput_event_get_tablet_pad_event(event); + struct wlr_tablet_pad_strip *wlr_event = + calloc(1, sizeof(struct wlr_tablet_pad_strip)); + wlr_event->time_sec = libinput_event_tablet_pad_get_time(pevent); + wlr_event->time_usec = libinput_event_tablet_pad_get_time_usec(pevent); + wlr_event->strip = libinput_event_tablet_pad_get_strip_number(pevent); + wlr_event->position = libinput_event_tablet_pad_get_strip_position(pevent); + switch (libinput_event_tablet_pad_get_strip_source(pevent)) { + case LIBINPUT_TABLET_PAD_STRIP_SOURCE_UNKNOWN: + wlr_event->source = WLR_TABLET_PAD_STRIP_SOURCE_UNKNOWN; + break; + case LIBINPUT_TABLET_PAD_STRIP_SOURCE_FINGER: + wlr_event->source = WLR_TABLET_PAD_STRIP_SOURCE_FINGER; + break; + } + wl_signal_emit(&dev->tablet_pad->events.strip, wlr_event); +} |