mirror of
https://github.com/brl/mutter.git
synced 2024-11-24 17:10:40 -05:00
wayland: Send primary offer to all data devices from the same client
Make the data device track the keyboard focus, and use that list to
forward the primary selection to all data devices from the same
client.
https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/1253
(cherry-pick of commit b45d5ef3f5
)
https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/1262
This commit is contained in:
parent
36f5a0a491
commit
493aeb65c8
@ -1871,10 +1871,7 @@ owner_changed_cb (MetaSelection *selection,
|
|||||||
|
|
||||||
if (selection_type == META_SELECTION_PRIMARY)
|
if (selection_type == META_SELECTION_PRIMARY)
|
||||||
{
|
{
|
||||||
data_device_resource =
|
wl_resource_for_each (data_device_resource, &data_device->primary_focus_resource_list)
|
||||||
wl_resource_find_for_client (&data_device->primary_resource_list,
|
|
||||||
focus_client);
|
|
||||||
if (data_device_resource)
|
|
||||||
{
|
{
|
||||||
struct wl_resource *offer = NULL;
|
struct wl_resource *offer = NULL;
|
||||||
|
|
||||||
@ -2027,6 +2024,7 @@ meta_wayland_data_device_init (MetaWaylandDataDevice *data_device)
|
|||||||
wl_list_init (&data_device->resource_list);
|
wl_list_init (&data_device->resource_list);
|
||||||
wl_list_init (&data_device->focus_resource_list);
|
wl_list_init (&data_device->focus_resource_list);
|
||||||
wl_list_init (&data_device->primary_resource_list);
|
wl_list_init (&data_device->primary_resource_list);
|
||||||
|
wl_list_init (&data_device->primary_focus_resource_list);
|
||||||
}
|
}
|
||||||
|
|
||||||
static struct wl_resource *
|
static struct wl_resource *
|
||||||
@ -2110,6 +2108,8 @@ meta_wayland_data_device_set_keyboard_focus (MetaWaylandDataDevice *data_device)
|
|||||||
data_device->focus_client = focus_client;
|
data_device->focus_client = focus_client;
|
||||||
move_resources (&data_device->resource_list,
|
move_resources (&data_device->resource_list,
|
||||||
&data_device->focus_resource_list);
|
&data_device->focus_resource_list);
|
||||||
|
move_resources (&data_device->primary_resource_list,
|
||||||
|
&data_device->primary_focus_resource_list);
|
||||||
|
|
||||||
if (!focus_client)
|
if (!focus_client)
|
||||||
return;
|
return;
|
||||||
@ -2126,10 +2126,14 @@ meta_wayland_data_device_set_keyboard_focus (MetaWaylandDataDevice *data_device)
|
|||||||
wl_data_device_send_selection (data_device_resource, offer);
|
wl_data_device_send_selection (data_device_resource, offer);
|
||||||
}
|
}
|
||||||
|
|
||||||
data_device_resource = wl_resource_find_for_client (&data_device->primary_resource_list, focus_client);
|
move_resources_for_client (&data_device->primary_focus_resource_list,
|
||||||
if (data_device_resource)
|
&data_device->primary_resource_list,
|
||||||
|
focus_client);
|
||||||
|
|
||||||
|
wl_resource_for_each (data_device_resource, &data_device->primary_focus_resource_list)
|
||||||
{
|
{
|
||||||
struct wl_resource *offer;
|
struct wl_resource *offer;
|
||||||
|
|
||||||
offer = create_and_send_primary_offer (data_device, data_device_resource);
|
offer = create_and_send_primary_offer (data_device, data_device_resource);
|
||||||
gtk_primary_selection_device_send_selection (data_device_resource, offer);
|
gtk_primary_selection_device_send_selection (data_device_resource, offer);
|
||||||
}
|
}
|
||||||
|
@ -65,6 +65,7 @@ struct _MetaWaylandDataDevice
|
|||||||
struct wl_list resource_list;
|
struct wl_list resource_list;
|
||||||
struct wl_list focus_resource_list;
|
struct wl_list focus_resource_list;
|
||||||
struct wl_list primary_resource_list;
|
struct wl_list primary_resource_list;
|
||||||
|
struct wl_list primary_focus_resource_list;
|
||||||
MetaWaylandDragGrab *current_grab;
|
MetaWaylandDragGrab *current_grab;
|
||||||
struct wl_client *focus_client;
|
struct wl_client *focus_client;
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user