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 1363246d44)
This commit is contained in:
Carlos Garnacho 2020-04-16 23:45:31 +02:00 committed by Robert Mader
parent eb6189d6b6
commit 7fbba4ad14

View File

@ -1331,20 +1331,8 @@ static void
selection_data_source_destroyed (gpointer data, GObject *object_was_here) selection_data_source_destroyed (gpointer data, GObject *object_was_here)
{ {
MetaWaylandDataDevice *data_device = data; 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; 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); unset_selection_source (data_device, META_SELECTION_CLIPBOARD);
} }
@ -1646,8 +1634,6 @@ meta_wayland_data_device_set_selection (MetaWaylandDataDevice *data_device,
guint32 serial) guint32 serial)
{ {
MetaWaylandSeat *seat = wl_container_of (data_device, seat, data_device); MetaWaylandSeat *seat = wl_container_of (data_device, seat, data_device);
struct wl_resource *data_device_resource;
struct wl_client *focus_client;
MetaSelectionSource *selection_source; MetaSelectionSource *selection_source;
if (data_device->selection_data_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, set_selection_source (data_device, META_SELECTION_CLIPBOARD,
selection_source); selection_source);
g_object_unref (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 static void
@ -1744,21 +1718,8 @@ primary_source_destroyed (gpointer data,
GObject *object_was_here) GObject *object_was_here)
{ {
MetaWaylandDataDevice *data_device = data; 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; 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); unset_selection_source (data_device, META_SELECTION_PRIMARY);
} }
@ -1768,8 +1729,6 @@ meta_wayland_data_device_set_primary (MetaWaylandDataDevice *data_device,
guint32 serial) guint32 serial)
{ {
MetaWaylandSeat *seat = wl_container_of (data_device, seat, data_device); MetaWaylandSeat *seat = wl_container_of (data_device, seat, data_device);
struct wl_resource *data_device_resource;
struct wl_client *focus_client;
MetaSelectionSource *selection_source; MetaSelectionSource *selection_source;
g_assert (!source || META_IS_WAYLAND_DATA_SOURCE_PRIMARY (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, set_selection_source (data_device, META_SELECTION_PRIMARY,
selection_source); selection_source);
g_object_unref (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 static void