From 5d26da9d15d4874c383bbc9948a802fcd605dc8b Mon Sep 17 00:00:00 2001
From: emersion <contact@emersion.fr>
Date: Wed, 21 Nov 2018 21:32:54 +0100
Subject: data-device: allow multiple devices for the same seat

This commit makes it possible for a single client to have multiple data devices
for the same seat. This fixes issues with Firefox.

This mainly removes wlr_data_source.offer. We make sure we create one data
offer per device. We now make the offer inert when the source is destroyed.

Fixes the second half of https://github.com/swaywm/wlroots/issues/1041
---
 include/types/wlr_data_device.h     |  3 ++-
 include/wlr/types/wlr_data_device.h | 13 ++++++-------
 2 files changed, 8 insertions(+), 8 deletions(-)

(limited to 'include')

diff --git a/include/types/wlr_data_device.h b/include/types/wlr_data_device.h
index 388e91a5..376c5f09 100644
--- a/include/types/wlr_data_device.h
+++ b/include/types/wlr_data_device.h
@@ -19,6 +19,7 @@ extern const struct wlr_surface_role drag_icon_surface_role;
 struct wlr_data_offer *data_offer_create(struct wl_client *client,
 	struct wlr_data_source *source, uint32_t version);
 void data_offer_update_action(struct wlr_data_offer *offer);
+void data_offer_destroy(struct wlr_data_offer *offer);
 
 struct wlr_client_data_source *client_data_source_create(
 	struct wl_client *client, uint32_t version, uint32_t id,
@@ -26,7 +27,7 @@ struct wlr_client_data_source *client_data_source_create(
 struct wlr_client_data_source *client_data_source_from_resource(
 	struct wl_resource *resource);
 struct wlr_data_offer *data_source_send_offer(struct wlr_data_source *source,
-	struct wlr_seat_client *target);
+	struct wl_resource *device_resource);
 void data_source_notify_finish(struct wlr_data_source *source);
 
 bool seat_client_start_drag(struct wlr_seat_client *client,
diff --git a/include/wlr/types/wlr_data_device.h b/include/wlr/types/wlr_data_device.h
index 9ce8f400..9c4ce995 100644
--- a/include/wlr/types/wlr_data_device.h
+++ b/include/wlr/types/wlr_data_device.h
@@ -12,14 +12,14 @@
 #include <wayland-server.h>
 #include <wlr/types/wlr_seat.h>
 
-extern const struct
-wlr_pointer_grab_interface wlr_data_device_pointer_drag_interface;
+extern const struct wlr_pointer_grab_interface
+	wlr_data_device_pointer_drag_interface;
 
-extern const struct
-wlr_keyboard_grab_interface wlr_data_device_keyboard_drag_interface;
+extern const struct wlr_keyboard_grab_interface
+	wlr_data_device_keyboard_drag_interface;
 
-extern const struct
-wlr_touch_grab_interface wlr_data_device_touch_drag_interface;
+extern const struct wlr_touch_grab_interface
+	wlr_data_device_touch_drag_interface;
 
 struct wlr_data_device_manager {
 	struct wl_global *global;
@@ -72,7 +72,6 @@ struct wlr_data_source {
 
 	// source status
 	bool accepted;
-	struct wlr_data_offer *offer;
 
 	// drag'n'drop status
 	enum wl_data_device_manager_dnd_action current_dnd_action;
-- 
cgit v1.2.3