aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--include/wlr/types/wlr_data_device.h9
-rw-r--r--types/wlr_data_device.c20
2 files changed, 21 insertions, 8 deletions
diff --git a/include/wlr/types/wlr_data_device.h b/include/wlr/types/wlr_data_device.h
index 6c5dc097..b4aa024a 100644
--- a/include/wlr/types/wlr_data_device.h
+++ b/include/wlr/types/wlr_data_device.h
@@ -36,6 +36,12 @@ struct wlr_data_source {
uint32_t compositor_action;
bool actions_set;
+ void (*accept)(struct wlr_data_source *source, uint32_t serial,
+ const char *mime_type);
+ void (*send)(struct wlr_data_source *source, const char *mime_type,
+ int32_t fd);
+ void (*cancel)(struct wlr_data_source *source);
+
struct {
struct wl_signal destroy;
} events;
@@ -72,4 +78,7 @@ struct wlr_data_device_manager *wlr_data_device_manager_create(
*/
void wlr_seat_handle_send_selection(struct wlr_seat_handle *handle);
+void wlr_seat_set_selection(struct wlr_seat *seat,
+ struct wlr_data_source *source, uint32_t serial);
+
#endif
diff --git a/types/wlr_data_device.c b/types/wlr_data_device.c
index 5c6d5717..d5782830 100644
--- a/types/wlr_data_device.c
+++ b/types/wlr_data_device.c
@@ -82,18 +82,18 @@ static void data_offer_update_action(struct wlr_data_offer *offer) {
}
}
-static void data_source_accept(struct wlr_data_source *source,
- uint32_t time, const char *mime_type) {
+static void client_data_source_accept(struct wlr_data_source *source,
+ uint32_t serial, const char *mime_type) {
wl_data_source_send_target(source->resource, mime_type);
}
-static void data_source_send(struct wlr_data_source *source,
+static void client_data_source_send(struct wlr_data_source *source,
const char *mime_type, int32_t fd) {
wl_data_source_send_send(source->resource, mime_type, fd);
close(fd);
}
-static void data_source_cancel(struct wlr_data_source *source) {
+static void client_data_source_cancel(struct wlr_data_source *source) {
wl_data_source_send_cancelled(source->resource);
}
@@ -108,7 +108,7 @@ static void data_offer_accept(struct wl_client *client,
// TODO check that client is currently focused by the input device
- data_source_accept(offer->source, serial, mime_type);
+ offer->source->accept(offer->source, serial, mime_type);
offer->source->accepted = (mime_type != NULL);
}
@@ -117,7 +117,7 @@ static void data_offer_receive(struct wl_client *client,
struct wlr_data_offer *offer = wl_resource_get_user_data(resource);
if (offer->source && offer == offer->source->offer) {
- data_source_send(offer->source, mime_type, fd);
+ offer->source->send(offer->source, mime_type, fd);
} else {
close(fd);
}
@@ -290,7 +290,7 @@ static void seat_handle_selection_data_source_destroy(
// TODO emit selection signal
}
-static void wlr_seat_set_selection(struct wlr_seat *seat,
+void wlr_seat_set_selection(struct wlr_seat *seat,
struct wlr_data_source *source, uint32_t serial) {
if (seat->selection_source &&
seat->selection_serial - serial < UINT32_MAX / 2) {
@@ -298,7 +298,7 @@ static void wlr_seat_set_selection(struct wlr_seat *seat,
}
if (seat->selection_source) {
- data_source_cancel(seat->selection_source);
+ seat->selection_source->cancel(seat->selection_source);
seat->selection_source = NULL;
wl_list_remove(&seat->selection_data_source_destroy.link);
}
@@ -701,6 +701,10 @@ static void data_device_manager_create_data_source(struct wl_client *client,
return;
}
+ source->accept = client_data_source_accept;
+ source->send = client_data_source_send;
+ source->cancel = client_data_source_cancel;
+
wl_array_init(&source->mime_types);
wl_signal_init(&source->events.destroy);