From: Yichao Yu <[email protected]>

---
 src/data-device.c | 61 ++++++++++++++++---------------------------------------
 1 file changed, 18 insertions(+), 43 deletions(-)

diff --git a/src/data-device.c b/src/data-device.c
index 92ceb12..e5993a1 100644
--- a/src/data-device.c
+++ b/src/data-device.c
@@ -329,17 +329,11 @@ destroy_selection_data_source(struct wl_listener
*listener, void *data)
        struct wl_seat *seat = container_of(listener, struct wl_seat,
                                            selection_data_source_listener);
        struct wl_resource *data_device;
-       struct wl_resource *focus = NULL;

        seat->selection_data_source = NULL;

-       if (seat->keyboard)
-               focus = seat->keyboard->focus_resource;
-       if (focus) {
-               data_device = find_resource(&seat->drag_resource_list,
-                                           focus->client);
-               if (data_device)
-                       wl_data_device_send_selection(data_device, NULL);
+       wl_list_for_each (data_device, &seat->drag_resource_list, link) {
+               wl_data_device_send_selection(data_device, NULL);
        }

        wl_signal_emit(&seat->selection_signal, seat);
@@ -350,7 +344,6 @@ wl_seat_set_selection(struct wl_seat *seat, struct
wl_data_source *source,
                      uint32_t serial)
 {
        struct wl_resource *data_device, *offer;
-       struct wl_resource *focus = NULL;

        if (seat->selection_data_source &&
            seat->selection_serial - serial < UINT32_MAX / 2)
@@ -365,16 +358,12 @@ wl_seat_set_selection(struct wl_seat *seat,
struct wl_data_source *source,
        seat->selection_data_source = source;
        seat->selection_serial = serial;

-       if (seat->keyboard)
-               focus = seat->keyboard->focus_resource;
-       if (focus) {
-               data_device = find_resource(&seat->drag_resource_list,
-                                           focus->client);
-               if (data_device && source) {
-                       offer =
wl_data_source_send_offer(seat->selection_data_source,
+       wl_list_for_each (data_device, &seat->drag_resource_list, link) {
+               if (source) {
+                       offer = wl_data_source_send_offer(source,
                                                          data_device);
                        wl_data_device_send_selection(data_device, offer);
-               } else if (data_device) {
+               } else {
                        wl_data_device_send_selection(data_device, NULL);
                }
        }
@@ -479,14 +468,20 @@ get_data_device(struct wl_client *client,
                uint32_t id, struct wl_resource *seat_resource)
 {
        struct wl_seat *seat = seat_resource->data;
-       struct wl_resource *resource;
+       struct wl_resource *data_device, *offer;
+
+       data_device = wl_client_add_object(client, &wl_data_device_interface,
+                                          &data_device_interface, id,
+                                          seat);

-       resource = wl_client_add_object(client, &wl_data_device_interface,
-                                       &data_device_interface, id,
-                                       seat);
+       wl_list_insert(&seat->drag_resource_list, &data_device->link);
+       data_device->destroy = unbind_data_device;

-       wl_list_insert(&seat->drag_resource_list, &resource->link);
-       resource->destroy = unbind_data_device;
+       if (seat->selection_data_source) {
+               offer = wl_data_source_send_offer(seat->selection_data_source,
+                                                 data_device);
+               wl_data_device_send_selection(data_device, offer);
+       }
 }

 static const struct wl_data_device_manager_interface manager_interface = {
@@ -505,26 +500,6 @@ bind_manager(struct wl_client *client,
 WL_EXPORT void
 wl_data_device_set_keyboard_focus(struct wl_seat *seat)
 {
-       struct wl_resource *data_device, *focus, *offer;
-       struct wl_data_source *source;
-
-       if (!seat->keyboard)
-               return;
-
-       focus = seat->keyboard->focus_resource;
-       if (!focus)
-               return;
-
-       data_device = find_resource(&seat->drag_resource_list,
-                                   focus->client);
-       if (!data_device)
-               return;
-
-       source = seat->selection_data_source;
-       if (source) {
-               offer = wl_data_source_send_offer(source, data_device);
-               wl_data_device_send_selection(data_device, offer);
-       }
 }

 WL_EXPORT int
--
1.8.2.1
_______________________________________________
wayland-devel mailing list
[email protected]
http://lists.freedesktop.org/mailman/listinfo/wayland-devel

Reply via email to