2010-12-18 20:38:49 +00:00
|
|
|
/*
|
|
|
|
* Copyright © 2010 Intel Corporation
|
|
|
|
*
|
|
|
|
* This library is free software; you can redistribute it and/or
|
|
|
|
* modify it under the terms of the GNU Library General Public
|
|
|
|
* License as published by the Free Software Foundation; either
|
|
|
|
* version 2 of the License, or (at your option) any later version.
|
|
|
|
*
|
|
|
|
* This library is distributed in the hope that it will be useful,
|
|
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
|
|
* Library General Public License for more details.
|
|
|
|
*
|
|
|
|
* You should have received a copy of the GNU Library General Public
|
2012-02-27 13:01:10 +00:00
|
|
|
* License along with this library. If not, see <http://www.gnu.org/licenses/>.
|
2010-12-18 20:38:49 +00:00
|
|
|
*/
|
|
|
|
|
|
|
|
#include "config.h"
|
|
|
|
|
2014-08-21 16:34:01 +00:00
|
|
|
#include <fcntl.h>
|
2016-02-25 23:28:05 +00:00
|
|
|
#include <unistd.h>
|
2014-08-21 16:34:01 +00:00
|
|
|
|
|
|
|
#include <gio/gunixinputstream.h>
|
2014-10-10 18:38:46 +00:00
|
|
|
#include <gio/gunixoutputstream.h>
|
2014-08-21 16:34:01 +00:00
|
|
|
#include <glib-unix.h>
|
|
|
|
|
|
|
|
#include "gdkwayland.h"
|
|
|
|
#include "gdkprivate-wayland.h"
|
|
|
|
#include "gdkdisplay-wayland.h"
|
2017-11-18 04:53:25 +00:00
|
|
|
#include "gdkcontentformatsprivate.h"
|
2010-12-18 20:38:49 +00:00
|
|
|
#include "gdkproperty.h"
|
|
|
|
|
|
|
|
#include <string.h>
|
|
|
|
|
|
|
|
gint
|
|
|
|
_gdk_wayland_display_text_property_to_utf8_list (GdkDisplay *display,
|
2015-02-28 03:28:28 +00:00
|
|
|
GdkAtom encoding,
|
|
|
|
gint format,
|
|
|
|
const guchar *text,
|
|
|
|
gint length,
|
|
|
|
gchar ***list)
|
2010-12-18 20:38:49 +00:00
|
|
|
{
|
2014-08-21 17:50:21 +00:00
|
|
|
GPtrArray *array;
|
|
|
|
const gchar *ptr;
|
|
|
|
gsize chunk_len;
|
|
|
|
gchar *copy;
|
|
|
|
guint nitems;
|
|
|
|
|
|
|
|
ptr = (const gchar *) text;
|
|
|
|
array = g_ptr_array_new ();
|
|
|
|
|
|
|
|
while (ptr < (const gchar *) &text[length])
|
|
|
|
{
|
|
|
|
chunk_len = strlen (ptr);
|
|
|
|
|
|
|
|
if (g_utf8_validate (ptr, chunk_len, NULL))
|
|
|
|
{
|
|
|
|
copy = g_strndup (ptr, chunk_len);
|
|
|
|
g_ptr_array_add (array, copy);
|
|
|
|
}
|
|
|
|
|
|
|
|
ptr = &ptr[chunk_len + 1];
|
|
|
|
}
|
|
|
|
|
|
|
|
nitems = array->len;
|
|
|
|
g_ptr_array_add (array, NULL);
|
|
|
|
|
|
|
|
if (list)
|
|
|
|
*list = (gchar **) g_ptr_array_free (array, FALSE);
|
|
|
|
else
|
|
|
|
g_ptr_array_free (array, TRUE);
|
|
|
|
|
|
|
|
return nitems;
|
2010-12-18 20:38:49 +00:00
|
|
|
}
|
|
|
|
|
2016-06-27 09:57:21 +00:00
|
|
|
/* This function has been copied straight from the x11 backend */
|
|
|
|
static gchar *
|
|
|
|
sanitize_utf8 (const gchar *src,
|
|
|
|
gboolean return_latin1)
|
|
|
|
{
|
|
|
|
gint len = strlen (src);
|
|
|
|
GString *result = g_string_sized_new (len);
|
|
|
|
const gchar *p = src;
|
|
|
|
|
|
|
|
while (*p)
|
|
|
|
{
|
|
|
|
if (*p == '\r')
|
|
|
|
{
|
|
|
|
p++;
|
|
|
|
if (*p == '\n')
|
|
|
|
p++;
|
|
|
|
|
|
|
|
g_string_append_c (result, '\n');
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
gunichar ch = g_utf8_get_char (p);
|
|
|
|
|
|
|
|
if (!((ch < 0x20 && ch != '\t' && ch != '\n') || (ch >= 0x7f && ch < 0xa0)))
|
|
|
|
{
|
|
|
|
if (return_latin1)
|
|
|
|
{
|
|
|
|
if (ch <= 0xff)
|
|
|
|
g_string_append_c (result, ch);
|
|
|
|
else
|
|
|
|
g_string_append_printf (result,
|
|
|
|
ch < 0x10000 ? "\\u%04x" : "\\U%08x",
|
|
|
|
ch);
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
char buf[7];
|
|
|
|
gint buflen;
|
|
|
|
|
|
|
|
buflen = g_unichar_to_utf8 (ch, buf);
|
|
|
|
g_string_append_len (result, buf, buflen);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
p = g_utf8_next_char (p);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return g_string_free (result, FALSE);
|
|
|
|
}
|
|
|
|
|
2010-12-18 20:38:49 +00:00
|
|
|
gchar *
|
|
|
|
_gdk_wayland_display_utf8_to_string_target (GdkDisplay *display,
|
2015-02-28 03:28:28 +00:00
|
|
|
const gchar *str)
|
2010-12-18 20:38:49 +00:00
|
|
|
{
|
2016-06-27 09:57:21 +00:00
|
|
|
/* This is mainly needed when interfacing with old clients through
|
|
|
|
* Xwayland, the STRING target could be used, and passed as-is
|
|
|
|
* by the compositor.
|
|
|
|
*
|
|
|
|
* There's already some handling of this atom (aka "mimetype" in
|
|
|
|
* this backend) in common code, so we end up in this vfunc.
|
|
|
|
*/
|
|
|
|
return sanitize_utf8 (str, TRUE);
|
2010-12-18 20:38:49 +00:00
|
|
|
}
|
2014-08-21 17:41:48 +00:00
|
|
|
|