[mutter/wip/carlosg/selection-bugfixes: 2/2] x11: Map x11 (UTF8_)STRING requests to text/plain mimetypes
- From: Carlos Garnacho <carlosg src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [mutter/wip/carlosg/selection-bugfixes: 2/2] x11: Map x11 (UTF8_)STRING requests to text/plain mimetypes
- Date: Mon, 13 Jan 2020 14:03:27 +0000 (UTC)
commit bf7bbad6fe58e9f03986e104fa1d314fd89a1c59
Author: Carlos Garnacho <carlosg gnome org>
Date: Mon Jan 13 14:18:00 2020 +0100
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
src/x11/meta-x11-selection.c | 59 +++++++++++++++++++++++++++++++++++++-------
1 file changed, 50 insertions(+), 9 deletions(-)
---
diff --git a/src/x11/meta-x11-selection.c b/src/x11/meta-x11-selection.c
index 5332e9d54..e83773502 100644
--- a/src/x11/meta-x11-selection.c
+++ b/src/x11/meta-x11-selection.c
@@ -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;
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]