seat: Add APIs needed by data_device 25/279825/1
authorSeunghun Lee <shiin.lee@samsung.com>
Tue, 16 Aug 2022 10:10:54 +0000 (19:10 +0900)
committerTizen Window System <tizen.windowsystem@gmail.com>
Thu, 18 Aug 2022 07:37:50 +0000 (16:37 +0900)
Change-Id: I879fccd534aec397fcca2e41a9cc9ac4169d0eba

src/seat.h
src/seat/seat.c
src/seat/seat_pointer.c
src/seat/seat_private.h

index 59a1d10..a5b3e59 100644 (file)
@@ -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);
index 09fbb51..174f672 100644 (file)
@@ -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;
index dd9abcf..0f6e96d 100644 (file)
@@ -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)
 {
index 4c6833d..7d7e063 100644 (file)
@@ -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;