xwayland: Ignore selection request not meant to our internal window
There may be other windows managing selection whose events are seen in our GDK event filter, like st-clipboard in gnome-shell, we should in that case not interfere on Selection/SelectionRequest events that are not meant for us. This fixes an odd feedback loop where requesting clipboard contents from wayland results in a XConvertRequest call and a SelectionRequest event that is interpreted by mutter as a request from another X11 client, so the current data source is poked for content, which happens to be the X11 bridge, which does a XConvertRequest to get contents... This is only broken after the many nested async operations create enough pipes and cancellables to run out of fds. Adding checks to ensure only events meant to our "selection owner" window are managed prevent this unintended loop to happen in the first place. https://bugzilla.gnome.org/show_bug.cgi?id=760745
This commit is contained in:
parent
a9e386e1af
commit
b3eac93c4c
@ -1129,6 +1129,9 @@ meta_xwayland_selection_handle_selection_notify (MetaWaylandCompositor *composit
|
|||||||
if (!selection)
|
if (!selection)
|
||||||
return FALSE;
|
return FALSE;
|
||||||
|
|
||||||
|
if (selection->window != event->requestor)
|
||||||
|
return FALSE;
|
||||||
|
|
||||||
/* convert selection failed */
|
/* convert selection failed */
|
||||||
if (event->property == None)
|
if (event->property == None)
|
||||||
{
|
{
|
||||||
@ -1261,6 +1264,9 @@ meta_xwayland_selection_handle_selection_request (MetaWaylandCompositor *composi
|
|||||||
if (!selection)
|
if (!selection)
|
||||||
return FALSE;
|
return FALSE;
|
||||||
|
|
||||||
|
if (selection->window != event->owner)
|
||||||
|
return FALSE;
|
||||||
|
|
||||||
/* We must fetch from the currently active source, not the Xwayland one */
|
/* We must fetch from the currently active source, not the Xwayland one */
|
||||||
data_source = data_device_get_active_source_for_atom (&compositor->seat->data_device,
|
data_source = data_device_get_active_source_for_atom (&compositor->seat->data_device,
|
||||||
selection->selection_atom);
|
selection->selection_atom);
|
||||||
|
Loading…
Reference in New Issue
Block a user