diff --git a/include/input/gestures.h b/include/input/gestures.h new file mode 100644 index 00000000..2c161b7d --- /dev/null +++ b/include/input/gestures.h @@ -0,0 +1,10 @@ +/* SPDX-License-Identifier: GPL-2.0-only */ +#ifndef LABWC_GESTURES_H +#define LABWC_GESTURES_H + +struct seat; + +void gestures_init(struct seat *seat); +void gestures_finish(struct seat *seat); + +#endif /* LABWC_GESTURES_H */ diff --git a/include/labwc.h b/include/labwc.h index 9810ac1a..ebabb3c6 100644 --- a/include/labwc.h +++ b/include/labwc.h @@ -30,7 +30,6 @@ #include #include #include -#include #include #include #include diff --git a/src/input/cursor.c b/src/input/cursor.c index 5261fb30..c2275944 100644 --- a/src/input/cursor.c +++ b/src/input/cursor.c @@ -13,6 +13,7 @@ #include "config/mousebind.h" #include "dnd.h" #include "idle.h" +#include "input/gestures.h" #include "labwc.h" #include "menu/menu.h" #include "regions.h" @@ -1140,55 +1141,6 @@ cursor_frame(struct wl_listener *listener, void *data) wlr_seat_pointer_notify_frame(seat->seat); } -static void handle_pointer_pinch_begin(struct wl_listener *listener, void *data) -{ - struct seat *seat = wl_container_of(listener, seat, pinch_begin); - struct wlr_pointer_pinch_begin_event *event = data; - wlr_pointer_gestures_v1_send_pinch_begin(seat->pointer_gestures, - seat->seat, event->time_msec, event->fingers); -} - -static void handle_pointer_pinch_update(struct wl_listener *listener, void *data) -{ - struct seat *seat = wl_container_of(listener, seat, pinch_update); - struct wlr_pointer_pinch_update_event *event = data; - wlr_pointer_gestures_v1_send_pinch_update(seat->pointer_gestures, - seat->seat, event->time_msec, event->dx, event->dy, - event->scale, event->rotation); -} - -static void handle_pointer_pinch_end(struct wl_listener *listener, void *data) -{ - struct seat *seat = wl_container_of(listener, seat, pinch_end); - struct wlr_pointer_pinch_end_event *event = data; - wlr_pointer_gestures_v1_send_pinch_end(seat->pointer_gestures, - seat->seat, event->time_msec, event->cancelled); -} - -static void handle_pointer_swipe_begin(struct wl_listener *listener, void *data) -{ - struct seat *seat = wl_container_of(listener, seat, swipe_begin); - struct wlr_pointer_swipe_begin_event *event = data; - wlr_pointer_gestures_v1_send_swipe_begin(seat->pointer_gestures, - seat->seat, event->time_msec, event->fingers); -} - -static void handle_pointer_swipe_update(struct wl_listener *listener, void *data) -{ - struct seat *seat = wl_container_of(listener, seat, swipe_update); - struct wlr_pointer_swipe_update_event *event = data; - wlr_pointer_gestures_v1_send_swipe_update(seat->pointer_gestures, - seat->seat, event->time_msec, event->dx, event->dy); -} - -static void handle_pointer_swipe_end(struct wl_listener *listener, void *data) -{ - struct seat *seat = wl_container_of(listener, seat, swipe_end); - struct wlr_pointer_swipe_end_event *event = data; - wlr_pointer_gestures_v1_send_swipe_end(seat->pointer_gestures, - seat->seat, event->time_msec, event->cancelled); -} - void cursor_init(struct seat *seat) { @@ -1248,19 +1200,7 @@ cursor_init(struct seat *seat) seat->cursor_frame.notify = cursor_frame; wl_signal_add(&seat->cursor->events.frame, &seat->cursor_frame); - seat->pointer_gestures = wlr_pointer_gestures_v1_create(seat->server->wl_display); - seat->pinch_begin.notify = handle_pointer_pinch_begin; - wl_signal_add(&seat->cursor->events.pinch_begin, &seat->pinch_begin); - seat->pinch_update.notify = handle_pointer_pinch_update; - wl_signal_add(&seat->cursor->events.pinch_update, &seat->pinch_update); - seat->pinch_end.notify = handle_pointer_pinch_end; - wl_signal_add(&seat->cursor->events.pinch_end, &seat->pinch_end); - seat->swipe_begin.notify = handle_pointer_swipe_begin; - wl_signal_add(&seat->cursor->events.swipe_begin, &seat->swipe_begin); - seat->swipe_update.notify = handle_pointer_swipe_update; - wl_signal_add(&seat->cursor->events.swipe_update, &seat->swipe_update); - seat->swipe_end.notify = handle_pointer_swipe_end; - wl_signal_add(&seat->cursor->events.swipe_end, &seat->swipe_end); + gestures_init(seat); seat->request_cursor.notify = request_cursor_notify; wl_signal_add(&seat->seat->events.request_set_cursor, @@ -1285,12 +1225,7 @@ void cursor_finish(struct seat *seat) wl_list_remove(&seat->cursor_axis.link); wl_list_remove(&seat->cursor_frame.link); - wl_list_remove(&seat->pinch_begin.link); - wl_list_remove(&seat->pinch_update.link); - wl_list_remove(&seat->pinch_end.link); - wl_list_remove(&seat->swipe_begin.link); - wl_list_remove(&seat->swipe_update.link); - wl_list_remove(&seat->swipe_end.link); + gestures_finish(seat); wl_list_remove(&seat->request_cursor.link); wl_list_remove(&seat->request_set_selection.link); diff --git a/src/input/gestures.c b/src/input/gestures.c new file mode 100644 index 00000000..f0ea51b6 --- /dev/null +++ b/src/input/gestures.c @@ -0,0 +1,94 @@ +// SPDX-License-Identifier: GPL-2.0-only +#include +#include "input/gestures.h" +#include "labwc.h" + +static void +handle_pointer_pinch_begin(struct wl_listener *listener, void *data) +{ + struct seat *seat = wl_container_of(listener, seat, pinch_begin); + struct wlr_pointer_pinch_begin_event *event = data; + wlr_pointer_gestures_v1_send_pinch_begin(seat->pointer_gestures, + seat->seat, event->time_msec, event->fingers); +} + +static void +handle_pointer_pinch_update(struct wl_listener *listener, void *data) +{ + struct seat *seat = wl_container_of(listener, seat, pinch_update); + struct wlr_pointer_pinch_update_event *event = data; + wlr_pointer_gestures_v1_send_pinch_update(seat->pointer_gestures, + seat->seat, event->time_msec, event->dx, event->dy, + event->scale, event->rotation); +} + +static void +handle_pointer_pinch_end(struct wl_listener *listener, void *data) +{ + struct seat *seat = wl_container_of(listener, seat, pinch_end); + struct wlr_pointer_pinch_end_event *event = data; + wlr_pointer_gestures_v1_send_pinch_end(seat->pointer_gestures, + seat->seat, event->time_msec, event->cancelled); +} + +static void +handle_pointer_swipe_begin(struct wl_listener *listener, void *data) +{ + struct seat *seat = wl_container_of(listener, seat, swipe_begin); + struct wlr_pointer_swipe_begin_event *event = data; + wlr_pointer_gestures_v1_send_swipe_begin(seat->pointer_gestures, + seat->seat, event->time_msec, event->fingers); +} + +static void +handle_pointer_swipe_update(struct wl_listener *listener, void *data) +{ + struct seat *seat = wl_container_of(listener, seat, swipe_update); + struct wlr_pointer_swipe_update_event *event = data; + wlr_pointer_gestures_v1_send_swipe_update(seat->pointer_gestures, + seat->seat, event->time_msec, event->dx, event->dy); +} + +static void +handle_pointer_swipe_end(struct wl_listener *listener, void *data) +{ + struct seat *seat = wl_container_of(listener, seat, swipe_end); + struct wlr_pointer_swipe_end_event *event = data; + wlr_pointer_gestures_v1_send_swipe_end(seat->pointer_gestures, + seat->seat, event->time_msec, event->cancelled); +} + +void +gestures_init(struct seat *seat) +{ + seat->pointer_gestures = wlr_pointer_gestures_v1_create(seat->server->wl_display); + + seat->pinch_begin.notify = handle_pointer_pinch_begin; + wl_signal_add(&seat->cursor->events.pinch_begin, &seat->pinch_begin); + + seat->pinch_update.notify = handle_pointer_pinch_update; + wl_signal_add(&seat->cursor->events.pinch_update, &seat->pinch_update); + + seat->pinch_end.notify = handle_pointer_pinch_end; + wl_signal_add(&seat->cursor->events.pinch_end, &seat->pinch_end); + + seat->swipe_begin.notify = handle_pointer_swipe_begin; + wl_signal_add(&seat->cursor->events.swipe_begin, &seat->swipe_begin); + + seat->swipe_update.notify = handle_pointer_swipe_update; + wl_signal_add(&seat->cursor->events.swipe_update, &seat->swipe_update); + + seat->swipe_end.notify = handle_pointer_swipe_end; + wl_signal_add(&seat->cursor->events.swipe_end, &seat->swipe_end); +} + +void +gestures_finish(struct seat *seat) +{ + wl_list_remove(&seat->pinch_begin.link); + wl_list_remove(&seat->pinch_update.link); + wl_list_remove(&seat->pinch_end.link); + wl_list_remove(&seat->swipe_begin.link); + wl_list_remove(&seat->swipe_update.link); + wl_list_remove(&seat->swipe_end.link); +} diff --git a/src/input/meson.build b/src/input/meson.build index e83de9d0..8444656b 100644 --- a/src/input/meson.build +++ b/src/input/meson.build @@ -1,6 +1,7 @@ labwc_sources += files( + 'cursor.c', + 'gestures.c', 'keyboard.c', 'key-state.c', 'touch.c', - 'cursor.c', )