#include "libds/keyboard.h"
#include "libds/seat.h"
+#include "data_device.h"
struct ds_pointer_grab_interface;
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);
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);
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);
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);
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)
{
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)
{
}
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;
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;
struct wl_listener display_destroy;
struct wl_listener selection_source_destroy;
+ struct wl_listener drag_source_destroy;
struct {
struct wl_signal destroy;