From 7fbba4ad14129f2536f8599c24c48c5888798c95 Mon Sep 17 00:00:00 2001 From: Carlos Garnacho Date: Thu, 16 Apr 2020 23:45:31 +0200 Subject: [PATCH] wayland: Rely on MetaSelection::owner-changed for .selection event emission We already have a signal callback that translates selection ownership changes to data_device/primary .selection events. Given both will be run when a data source is being replaced, and this event emission being deleted is kinda short sighted in that in only knows about Wayland, rely entirely on MetaSelection::owner-changed emission. Fixes spurious .selection(null) events being sent when a compositor-local source takes over the selection without the focus changing (eg. screenshot to clipboard). Closes: https://gitlab.gnome.org/GNOME/mutter/-/issues/1160 https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/1204 (cherry picked from commit 1363246d4452c0eebf404f2668df9931d06eae92) --- src/wayland/meta-wayland-data-device.c | 53 -------------------------- 1 file changed, 53 deletions(-) diff --git a/src/wayland/meta-wayland-data-device.c b/src/wayland/meta-wayland-data-device.c index a68ab450f..e3d0772b2 100644 --- a/src/wayland/meta-wayland-data-device.c +++ b/src/wayland/meta-wayland-data-device.c @@ -1331,20 +1331,8 @@ static void selection_data_source_destroyed (gpointer data, GObject *object_was_here) { MetaWaylandDataDevice *data_device = data; - MetaWaylandSeat *seat = wl_container_of (data_device, seat, data_device); - struct wl_resource *data_device_resource; - struct wl_client *focus_client = NULL; data_device->selection_data_source = NULL; - - focus_client = meta_wayland_keyboard_get_focus_client (seat->keyboard); - if (focus_client) - { - data_device_resource = wl_resource_find_for_client (&data_device->resource_list, focus_client); - if (data_device_resource) - wl_data_device_send_selection (data_device_resource, NULL); - } - unset_selection_source (data_device, META_SELECTION_CLIPBOARD); } @@ -1646,8 +1634,6 @@ meta_wayland_data_device_set_selection (MetaWaylandDataDevice *data_device, guint32 serial) { MetaWaylandSeat *seat = wl_container_of (data_device, seat, data_device); - struct wl_resource *data_device_resource; - struct wl_client *focus_client; MetaSelectionSource *selection_source; if (data_device->selection_data_source && @@ -1682,18 +1668,6 @@ meta_wayland_data_device_set_selection (MetaWaylandDataDevice *data_device, set_selection_source (data_device, META_SELECTION_CLIPBOARD, selection_source); g_object_unref (selection_source); - - focus_client = meta_wayland_keyboard_get_focus_client (seat->keyboard); - if (focus_client) - { - data_device_resource = wl_resource_find_for_client (&data_device->resource_list, focus_client); - if (data_device_resource) - { - struct wl_resource *offer; - offer = create_and_send_clipboard_offer (data_device, data_device_resource); - wl_data_device_send_selection (data_device_resource, offer); - } - } } static void @@ -1744,21 +1718,8 @@ primary_source_destroyed (gpointer data, GObject *object_was_here) { MetaWaylandDataDevice *data_device = data; - MetaWaylandSeat *seat = wl_container_of (data_device, seat, data_device); - struct wl_client *focus_client = NULL; data_device->primary_data_source = NULL; - - focus_client = meta_wayland_keyboard_get_focus_client (seat->keyboard); - if (focus_client) - { - struct wl_resource *data_device_resource; - - data_device_resource = wl_resource_find_for_client (&data_device->primary_resource_list, focus_client); - if (data_device_resource) - gtk_primary_selection_device_send_selection (data_device_resource, NULL); - } - unset_selection_source (data_device, META_SELECTION_PRIMARY); } @@ -1768,8 +1729,6 @@ meta_wayland_data_device_set_primary (MetaWaylandDataDevice *data_device, guint32 serial) { MetaWaylandSeat *seat = wl_container_of (data_device, seat, data_device); - struct wl_resource *data_device_resource; - struct wl_client *focus_client; MetaSelectionSource *selection_source; g_assert (!source || META_IS_WAYLAND_DATA_SOURCE_PRIMARY (source)); @@ -1805,18 +1764,6 @@ meta_wayland_data_device_set_primary (MetaWaylandDataDevice *data_device, set_selection_source (data_device, META_SELECTION_PRIMARY, selection_source); g_object_unref (selection_source); - - focus_client = meta_wayland_keyboard_get_focus_client (seat->keyboard); - if (focus_client) - { - data_device_resource = wl_resource_find_for_client (&data_device->primary_resource_list, focus_client); - if (data_device_resource) - { - struct wl_resource *offer; - offer = create_and_send_primary_offer (data_device, data_device_resource); - gtk_primary_selection_device_send_selection (data_device_resource, offer); - } - } } static void