mirror of
https://github.com/brl/mutter.git
synced 2025-02-16 13:24:09 +00:00
x11: Map x11 (UTF8_)STRING requests to text/plain mimetypes
Make the x11 selection proxy map UTF8_STRING and STRING to proper mimetypes, as the selection source (wayland or memory) might not offer those for backwards compatibility. Closes: https://gitlab.gnome.org/GNOME/gnome-shell/issues/1355 https://gitlab.gnome.org/GNOME/mutter/merge_requests/1005
This commit is contained in:
parent
c1df48befd
commit
a6c195b05c
@ -27,6 +27,9 @@
|
||||
#include "x11/meta-x11-selection-output-stream-private.h"
|
||||
#include "x11/meta-x11-selection-private.h"
|
||||
|
||||
#define UTF8_STRING_MIMETYPE "text/plain;charset=utf-8"
|
||||
#define STRING_MIMETYPE "text/plain"
|
||||
|
||||
static gboolean
|
||||
atom_to_selection_type (Display *xdisplay,
|
||||
Atom selection,
|
||||
@ -142,6 +145,45 @@ transfer_cb (MetaSelection *selection,
|
||||
g_object_unref (output);
|
||||
}
|
||||
|
||||
static char *
|
||||
meta_x11_selection_find_target (MetaX11Display *x11_display,
|
||||
MetaSelection *selection,
|
||||
MetaSelectionType selection_type,
|
||||
Atom selection_atom)
|
||||
{
|
||||
GList* mimetypes = NULL;
|
||||
const gchar *atom_name;
|
||||
char *retval;
|
||||
|
||||
mimetypes = meta_selection_get_mimetypes (selection, selection_type);
|
||||
atom_name = gdk_x11_get_xatom_name (selection_atom);
|
||||
|
||||
if (g_list_find_custom (mimetypes, atom_name, (GCompareFunc) g_strcmp0))
|
||||
{
|
||||
retval = g_strdup (atom_name);
|
||||
}
|
||||
else if (strcmp (atom_name, "UTF8_STRING") == 0 &&
|
||||
g_list_find_custom (mimetypes, UTF8_STRING_MIMETYPE,
|
||||
(GCompareFunc) g_strcmp0))
|
||||
{
|
||||
retval = g_strdup (UTF8_STRING_MIMETYPE);
|
||||
}
|
||||
else if (strcmp (atom_name, "STRING") == 0 &&
|
||||
g_list_find_custom (mimetypes, STRING_MIMETYPE,
|
||||
(GCompareFunc) g_strcmp0))
|
||||
{
|
||||
retval = g_strdup (STRING_MIMETYPE);
|
||||
}
|
||||
else
|
||||
{
|
||||
retval = NULL;
|
||||
}
|
||||
|
||||
g_list_free_full (mimetypes, g_free);
|
||||
|
||||
return retval;
|
||||
}
|
||||
|
||||
static gboolean
|
||||
meta_x11_selection_handle_selection_request (MetaX11Display *x11_display,
|
||||
XEvent *xevent)
|
||||
@ -198,15 +240,12 @@ meta_x11_selection_handle_selection_request (MetaX11Display *x11_display,
|
||||
}
|
||||
else
|
||||
{
|
||||
gboolean has_target;
|
||||
g_autofree char *target = NULL;
|
||||
|
||||
mimetypes = meta_selection_get_mimetypes (selection, selection_type);
|
||||
has_target = g_list_find_custom (mimetypes,
|
||||
gdk_x11_get_xatom_name (event->target),
|
||||
(GCompareFunc) g_strcmp0) != NULL;
|
||||
g_list_free_full (mimetypes, g_free);
|
||||
target = meta_x11_selection_find_target (x11_display, selection,
|
||||
selection_type, event->target);
|
||||
|
||||
if (has_target)
|
||||
if (target != NULL)
|
||||
{
|
||||
output = meta_x11_selection_output_stream_new (x11_display,
|
||||
event->requestor,
|
||||
@ -218,7 +257,7 @@ meta_x11_selection_handle_selection_request (MetaX11Display *x11_display,
|
||||
|
||||
meta_selection_transfer_async (selection,
|
||||
selection_type,
|
||||
gdk_x11_get_xatom_name (event->target),
|
||||
target,
|
||||
-1,
|
||||
output,
|
||||
NULL,
|
||||
@ -227,7 +266,9 @@ meta_x11_selection_handle_selection_request (MetaX11Display *x11_display,
|
||||
return TRUE;
|
||||
}
|
||||
else
|
||||
send_selection_notify (event, FALSE);
|
||||
{
|
||||
send_selection_notify (event, FALSE);
|
||||
}
|
||||
}
|
||||
|
||||
return FALSE;
|
||||
|
Loading…
x
Reference in New Issue
Block a user