x11: Look up reason for selection clear events from XFixes

If the event originates from a XSetSelectionOwner request, the event
will contain a XFixesSetSelectionOwnerNotify subtype. The other
subtypes (meant for the selection window being destroyed, and the
client closing) are the situations where we mean to replace the
selection.

Fixes: https://gitlab.gnome.org/GNOME/mutter/-/issues/1268

https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/1350
This commit is contained in:
Carlos Garnacho 2020-07-03 13:47:38 +02:00
parent 06781985e4
commit 2f1f47d257

View File

@ -32,13 +32,6 @@
#define UTF8_STRING_MIMETYPE "text/plain;charset=utf-8" #define UTF8_STRING_MIMETYPE "text/plain;charset=utf-8"
#define STRING_MIMETYPE "text/plain" #define STRING_MIMETYPE "text/plain"
/* Set an arbitrary (although generous) threshold to determine whether a
* XFixesSelectionNotify corresponds to a XSetSelectionOwner from another
* client. The selection timestamp is not updated if the owner client is
* closed.
*/
#define SELECTION_CLEARED_BY_CLIENT(e) (e->timestamp - e->selection_timestamp < 50)
static gboolean static gboolean
atom_to_selection_type (Display *xdisplay, atom_to_selection_type (Display *xdisplay,
Atom selection, Atom selection,
@ -342,7 +335,7 @@ meta_x11_selection_handle_xfixes_selection_notify (MetaX11Display *x11_display,
if (event->owner == None && x11_display->selection.owners[selection_type]) if (event->owner == None && x11_display->selection.owners[selection_type])
{ {
if (SELECTION_CLEARED_BY_CLIENT (event)) if (event->subtype == XFixesSetSelectionOwnerNotify)
{ {
MetaSelectionSource *source; MetaSelectionSource *source;