mirror of
https://github.com/brl/mutter.git
synced 2024-11-23 08:30:42 -05:00
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:
parent
eb6189d6b6
commit
7fbba4ad14
@ -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
|
||||||
|
Loading…
Reference in New Issue
Block a user