From 9d2c6c869e09659a3c4f272fbf7ba151dcdf3b58 Mon Sep 17 00:00:00 2001 From: Seunghun Lee Date: Tue, 16 Aug 2022 19:10:54 +0900 Subject: [PATCH] seat: Add APIs needed by data_device Change-Id: I879fccd534aec397fcca2e41a9cc9ac4169d0eba --- src/seat.h | 11 +++++++++++ src/seat/seat.c | 38 ++++++++++++++++++++++++++++++++++++++ src/seat/seat_pointer.c | 12 ++++++++++++ src/seat/seat_private.h | 4 ++++ 4 files changed, 65 insertions(+) diff --git a/src/seat.h b/src/seat.h index 59a1d10..a5b3e59 100644 --- a/src/seat.h +++ b/src/seat.h @@ -3,6 +3,7 @@ #include "libds/keyboard.h" #include "libds/seat.h" +#include "data_device.h" struct ds_pointer_grab_interface; @@ -36,11 +37,17 @@ void ds_seat_add_set_selection_listener(struct ds_seat *seat, struct ds_data_source *ds_seat_get_selection(struct ds_seat *seat); +void ds_seat_start_drag(struct ds_seat *seat, + struct ds_data_source *drag_source, uint32_t serial); + struct ds_seat_client *ds_seat_client_from_resource( struct wl_resource *resource); struct ds_seat *ds_seat_client_get_seat(struct ds_seat_client *seat_client); +struct wl_client *ds_seat_client_get_wl_client( + struct ds_seat_client *seat_client); + void ds_seat_pointer_enter(struct ds_seat *seat, struct ds_surface *surface, double sx, double sy); @@ -58,6 +65,10 @@ void ds_seat_pointer_send_axis(struct ds_seat *seat, uint32_t time_msec, void ds_seat_pointer_send_frame(struct ds_seat *seat); +uint32_t ds_seat_pointer_get_grab_button(struct ds_seat *seat); + +size_t ds_seat_pointer_get_grab_button_count(struct ds_seat *seat); + void ds_seat_keyboard_enter(struct ds_seat *seat, struct ds_surface *surface, uint32_t keycodes[], size_t num_keycodes, struct ds_keyboard_modifiers *modifiers); diff --git a/src/seat/seat.c b/src/seat/seat.c index 09fbb51..174f672 100644 --- a/src/seat/seat.c +++ b/src/seat/seat.c @@ -20,6 +20,8 @@ static void seat_handle_display_destroy(struct wl_listener *listener, void *data); static void seat_handle_selection_source_destroy(struct wl_listener *listener, void *data); +static void seat_handle_drag_source_destroy(struct wl_listener *listener, + void *data); static void seat_destroy(struct ds_seat *seat); static struct ds_seat_client *seat_client_create(struct ds_seat *seat, struct wl_client *wl_client); @@ -72,6 +74,7 @@ ds_seat_create(struct wl_display *display, const char *name) wl_signal_init(&seat->events.touch_grab_begin); wl_signal_init(&seat->events.touch_grab_end); wl_signal_init(&seat->events.set_selection); + wl_signal_init(&seat->events.start_drag); seat->display_destroy.notify = seat_handle_display_destroy; wl_display_add_destroy_listener(display, &seat->display_destroy); @@ -210,6 +213,25 @@ ds_seat_get_selection(struct ds_seat *seat) return seat->selection_source; } +void +ds_seat_start_drag(struct ds_seat *seat, struct ds_data_source *drag_source, + uint32_t serial) +{ + seat->drag_serial = serial; + + if (seat->drag_source) + ds_data_source_destroy(seat->drag_source); + + if (drag_source) { + seat->drag_source = drag_source; + seat->drag_source_destroy.notify = seat_handle_drag_source_destroy; + ds_data_source_add_destroy_listener(drag_source, + &seat->drag_source_destroy); + } + + wl_signal_emit(&seat->events.start_drag, seat); +} + struct ds_seat * ds_seat_client_get_seat(struct ds_seat_client *seat_client) { @@ -223,6 +245,12 @@ ds_seat_add_set_selection_listener(struct ds_seat *seat, wl_signal_add(&seat->events.set_selection, listener); } +struct wl_client * +ds_seat_client_get_wl_client(struct ds_seat_client *seat_client) +{ + return seat_client->wl_client; +} + struct ds_seat_client * seat_client_for_wl_client(struct ds_seat *seat, struct wl_client *wl_client) { @@ -420,6 +448,16 @@ seat_handle_selection_source_destroy(struct wl_listener *listener, } static void +seat_handle_drag_source_destroy(struct wl_listener *listener, void *data) +{ + struct ds_seat *seat; + + seat = wl_container_of(listener, seat, drag_source_destroy); + wl_list_remove(&seat->drag_source_destroy.link); + seat->drag_source = NULL; +} + +static void seat_destroy(struct ds_seat *seat) { struct ds_seat_client *seat_client, *tmp; diff --git a/src/seat/seat_pointer.c b/src/seat/seat_pointer.c index dd9abcf..0f6e96d 100644 --- a/src/seat/seat_pointer.c +++ b/src/seat/seat_pointer.c @@ -283,6 +283,18 @@ ds_seat_pointer_send_frame(struct ds_seat *seat) pointer_send_frame(resource); } +uint32_t +ds_seat_pointer_get_grab_button(struct ds_seat *seat) +{ + return seat->pointer.grab_button; +} + +size_t +ds_seat_pointer_get_grab_button_count(struct ds_seat *seat) +{ + return seat->pointer.button_count; +} + bool seat_pointer_init(struct ds_seat *seat) { diff --git a/src/seat/seat_private.h b/src/seat/seat_private.h index 4c6833d..7d7e063 100644 --- a/src/seat/seat_private.h +++ b/src/seat/seat_private.h @@ -123,6 +123,9 @@ struct ds_seat struct ds_data_source *selection_source; uint32_t selection_serial; + struct ds_data_source *drag_source; + uint32_t drag_serial; + struct wl_list clients; // ds_seat_client::link struct ds_seat_pointer pointer; @@ -131,6 +134,7 @@ struct ds_seat struct wl_listener display_destroy; struct wl_listener selection_source_destroy; + struct wl_listener drag_source_destroy; struct { struct wl_signal destroy; -- 2.7.4