[gtk+/gdk-backend: 86/91] Deal with property encoding functions
- From: Benjamin Otte <otte src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gtk+/gdk-backend: 86/91] Deal with property encoding functions
- Date: Sat, 18 Dec 2010 01:13:03 +0000 (UTC)
commit f74adceb079f33925a6b8043b43ec919bdfb3330
Author: Matthias Clasen <mclasen redhat com>
Date: Thu Dec 16 23:44:50 2010 -0500
Deal with property encoding functions
Move everything dealing with compound text to be X11 specific
Only gdk_text_property_to_utf8_list and gdk_utf8_to_string_target
are kept across backends, so add vfuncs for these.
Also, remove the non-multihead-safe variants of all these.
gdk/gdk.symbols | 14 +-
gdk/gdkdisplayprivate.h | 9 +
gdk/gdkproperty.h | 92 ++-----
gdk/gdkselection.c | 165 ++++--------
gdk/x11/gdkdisplay-x11.c | 2 +
gdk/x11/gdkprivate-x11.h | 9 +
gdk/x11/gdkselection-x11.c | 656 +++++++++++++++++++++-----------------------
gdk/x11/gdkwindow-x11.c | 10 +-
gdk/x11/gdkx.h | 24 ++
gtk/gtkselection.c | 24 +-
10 files changed, 459 insertions(+), 546 deletions(-)
---
diff --git a/gdk/gdk.symbols b/gdk/gdk.symbols
index f996e84..fd50e8a 100644
--- a/gdk/gdk.symbols
+++ b/gdk/gdk.symbols
@@ -193,8 +193,6 @@ gdk_event_type_get_type G_GNUC_CONST
gdk_extension_mode_get_type G_GNUC_CONST
gdk_filter_return_get_type G_GNUC_CONST
gdk_flush
-gdk_free_compound_text
-gdk_free_text_list
gdk_get_default_root_window
gdk_get_display
gdk_get_display_arg_name
@@ -319,15 +317,10 @@ gdk_set_show_events
gdk_setting_action_get_type G_GNUC_CONST
gdk_setting_get
gdk_status_get_type G_GNUC_CONST
-gdk_string_to_compound_text
-gdk_string_to_compound_text_for_display
gdk_synthesize_window_state
gdk_test_render_sync
gdk_test_simulate_button
gdk_test_simulate_key
-gdk_text_property_to_text_list
-gdk_text_property_to_text_list_for_display
-gdk_text_property_to_utf8_list
gdk_text_property_to_utf8_list_for_display
gdk_threads_add_idle
gdk_threads_add_idle_full
@@ -340,8 +333,6 @@ gdk_threads_init
gdk_threads_leave
gdk_threads_set_lock_functions
gdk_unicode_to_keyval G_GNUC_CONST
-gdk_utf8_to_compound_text
-gdk_utf8_to_compound_text_for_display
gdk_utf8_to_string_target
gdk_visibility_state_get_type G_GNUC_CONST
gdk_visual_get_best
@@ -535,7 +526,12 @@ gdk_x11_display_get_xdisplay
gdk_x11_display_grab
gdk_x11_display_set_cursor_theme
gdk_x11_display_set_startup_notification_id
+gdk_x11_display_string_to_compound_text
+gdk_x11_display_text_property_to_text_list
gdk_x11_display_ungrab
+gdk_x11_display_utf8_to_compound_text
+gdk_x11_free_compound_text
+gdk_x11_free_text_list
gdk_x11_get_default_root_xwindow
gdk_x11_get_default_screen
gdk_x11_get_default_xdisplay
diff --git a/gdk/gdkdisplayprivate.h b/gdk/gdkdisplayprivate.h
index f589581..4885b18 100644
--- a/gdk/gdkdisplayprivate.h
+++ b/gdk/gdkdisplayprivate.h
@@ -220,6 +220,15 @@ struct _GdkDisplayClass
GdkAtom target,
guint32 time);
+ gint (*text_property_to_utf8_list) (GdkDisplay *display,
+ GdkAtom encoding,
+ gint format,
+ const guchar *text,
+ gint length,
+ gchar ***list);
+ gchar * (*utf8_to_string_target) (GdkDisplay *display,
+ const gchar *text);
+
/* Signals */
void (*closed) (GdkDisplay *display,
gboolean is_error);
diff --git a/gdk/gdkproperty.h b/gdk/gdkproperty.h
index 4ea6f81..014234e 100644
--- a/gdk/gdkproperty.h
+++ b/gdk/gdkproperty.h
@@ -54,83 +54,39 @@ typedef enum
GdkAtom gdk_atom_intern (const gchar *atom_name,
- gboolean only_if_exists);
+ gboolean only_if_exists);
GdkAtom gdk_atom_intern_static_string (const gchar *atom_name);
gchar* gdk_atom_name (GdkAtom atom);
gboolean gdk_property_get (GdkWindow *window,
- GdkAtom property,
- GdkAtom type,
- gulong offset,
- gulong length,
- gint pdelete,
- GdkAtom *actual_property_type,
- gint *actual_format,
- gint *actual_length,
- guchar **data);
+ GdkAtom property,
+ GdkAtom type,
+ gulong offset,
+ gulong length,
+ gint pdelete,
+ GdkAtom *actual_property_type,
+ gint *actual_format,
+ gint *actual_length,
+ guchar **data);
void gdk_property_change (GdkWindow *window,
- GdkAtom property,
- GdkAtom type,
- gint format,
- GdkPropMode mode,
- const guchar *data,
- gint nelements);
+ GdkAtom property,
+ GdkAtom type,
+ gint format,
+ GdkPropMode mode,
+ const guchar *data,
+ gint nelements);
void gdk_property_delete (GdkWindow *window,
- GdkAtom property);
+ GdkAtom property);
-#ifndef GDK_MULTIHEAD_SAFE
-gint gdk_text_property_to_text_list (GdkAtom encoding,
- gint format,
- const guchar *text,
- gint length,
- gchar ***list);
-gint gdk_text_property_to_utf8_list (GdkAtom encoding,
- gint format,
- const guchar *text,
- gint length,
- gchar ***list);
-gboolean gdk_utf8_to_compound_text (const gchar *str,
- GdkAtom *encoding,
- gint *format,
- guchar **ctext,
- gint *length);
-gint gdk_string_to_compound_text (const gchar *str,
- GdkAtom *encoding,
- gint *format,
- guchar **ctext,
- gint *length);
-#endif /* GDK_MULTIHEAD_SAFE */
+gint gdk_text_property_to_utf8_list_for_display (GdkDisplay *display,
+ GdkAtom encoding,
+ gint format,
+ const guchar *text,
+ gint length,
+ gchar ***list);
-gint gdk_text_property_to_text_list_for_display (GdkDisplay *display,
- GdkAtom encoding,
- gint format,
- const guchar *text,
- gint length,
- gchar ***list);
-gint gdk_text_property_to_utf8_list_for_display (GdkDisplay *display,
- GdkAtom encoding,
- gint format,
- const guchar *text,
- gint length,
- gchar ***list);
-
-gchar *gdk_utf8_to_string_target (const gchar *str);
-gint gdk_string_to_compound_text_for_display (GdkDisplay *display,
- const gchar *str,
- GdkAtom *encoding,
- gint *format,
- guchar **ctext,
- gint *length);
-gboolean gdk_utf8_to_compound_text_for_display (GdkDisplay *display,
- const gchar *str,
- GdkAtom *encoding,
- gint *format,
- guchar **ctext,
- gint *length);
-
-void gdk_free_text_list (gchar **list);
-void gdk_free_compound_text (guchar *ctext);
+gchar *gdk_utf8_to_string_target (const gchar *str);
G_END_DECLS
diff --git a/gdk/gdkselection.c b/gdk/gdkselection.c
index c50a3f7..27adfdf 100644
--- a/gdk/gdkselection.c
+++ b/gdk/gdkselection.c
@@ -138,116 +138,6 @@ gdk_selection_send_notify (GdkNativeWindow requestor,
}
/**
- * gdk_text_property_to_text_list:
- * @encoding: an atom representing the encoding. The most common
- * values for this are <literal>STRING</literal>,
- * or <literal>COMPOUND_TEXT</literal>. This is
- * value used as the type for the property.
- * @format: the format of the property.
- * @text: the text data.
- * @length: the length of the property, in items.
- * @list: location to store a terminated array of strings
- * in the encoding of the current locale. This
- * array should be freed using gdk_free_text_list().
- *
- * Converts a text string from the encoding as it is stored in
- * a property into an array of strings in the encoding of
- * the current local. (The elements of the array represent
- * the nul-separated elements of the original text string.)
- *
- * Returns: the number of strings stored in @list, or 0,
- * if the conversion failed.
- */
-gint
-gdk_text_property_to_text_list (GdkAtom encoding,
- gint format,
- const guchar *text,
- gint length,
- gchar ***list)
-{
- return gdk_text_property_to_text_list_for_display (gdk_display_get_default (),
- encoding, format, text, length, list);
-}
-
-/**
- * gdk_text_property_to_utf8_list:
- * @encoding: an atom representing the encoding of the text
- * @format: the format of the property
- * @text: the text to convert
- * @length: the length of @text, in bytes
- * @list: (allow-none): location to store the list of strings or %NULL. The
- * list should be freed with g_strfreev().
- *
- * Convert a text property in the giving encoding to
- * a list of UTF-8 strings.
- *
- * Return value: the number of strings in the resulting
- * list.
- **/
-gint
-gdk_text_property_to_utf8_list (GdkAtom encoding,
- gint format,
- const guchar *text,
- gint length,
- gchar ***list)
-{
- return gdk_text_property_to_utf8_list_for_display (gdk_display_get_default (),
- encoding, format, text, length, list);
-}
-
-/**
- * gdk_string_to_compound_text:
- * @str: a nul-terminated string.
- * @encoding: location to store the encoding atom (to be used as
- * the type for the property).
- * @format: location to store the format for the property.
- * @ctext: location to store newly allocated data for the property.
- * @length: location to store the length of @ctext in items.
- *
- * Converts a string from the encoding of the current locale
- * into a form suitable for storing in a window property.
- *
- * Returns: 0 upon sucess, non-zero upon failure.
- */
-gint
-gdk_string_to_compound_text (const gchar *str,
- GdkAtom *encoding,
- gint *format,
- guchar **ctext,
- gint *length)
-{
- return gdk_string_to_compound_text_for_display (gdk_display_get_default (),
- str, encoding, format,
- ctext, length);
-}
-
-/**
- * gdk_utf8_to_compound_text:
- * @str: a UTF-8 string
- * @encoding: location to store resulting encoding
- * @format: location to store format of the result
- * @ctext: location to store the data of the result
- * @length: location to store the length of the data
- * stored in @ctext
- *
- * Convert from UTF-8 to compound text.
- *
- * Return value: %TRUE if the conversion succeeded, otherwise
- * false.
- **/
-gboolean
-gdk_utf8_to_compound_text (const gchar *str,
- GdkAtom *encoding,
- gint *format,
- guchar **ctext,
- gint *length)
-{
- return gdk_utf8_to_compound_text_for_display (gdk_display_get_default (),
- str, encoding, format,
- ctext, length);
-}
-
-/**
* gdk_selection_owner_set_for_display:
* @display: the #GdkDisplay
* @owner: a #GdkWindow or %NULL to indicate that the owner for
@@ -386,3 +276,58 @@ gdk_selection_convert (GdkWindow *requestor,
GDK_DISPLAY_GET_CLASS (display)
->convert_selection (display, requestor, selection, target, time);
}
+
+/**
+ * gdk_text_property_to_utf8_list_for_display:
+ * @display: a #GdkDisplay
+ * @encoding: an atom representing the encoding of the text
+ * @format: the format of the property
+ * @text: the text to convert
+ * @length: the length of @text, in bytes
+ * @list: location to store the list of strings or %NULL. The
+ * list should be freed with g_strfreev().
+ *
+ * Converts a text property in the given encoding to
+ * a list of UTF-8 strings.
+ *
+ * Return value: the number of strings in the resulting list
+ *
+ * Since: 2.2
+ */
+gint
+gdk_text_property_to_utf8_list_for_display (GdkDisplay *display,
+ GdkAtom encoding,
+ gint format,
+ const guchar *text,
+ gint length,
+ gchar ***list)
+{
+ g_return_val_if_fail (text != NULL, 0);
+ g_return_val_if_fail (length >= 0, 0);
+ g_return_val_if_fail (GDK_IS_DISPLAY (display), 0);
+
+ return GDK_DISPLAY_GET_CLASS (display)
+ ->text_property_to_utf8_list (display, encoding, format, text, length, list);
+}
+
+/**
+ * gdk_utf8_to_string_target:
+ * @str: a UTF-8 string
+ *
+ * Converts an UTF-8 string into the best possible representation
+ * as a STRING. The representation of characters not in STRING
+ * is not specified; it may be as pseudo-escape sequences
+ * \x{ABCD}, or it may be in some other form of approximation.
+ *
+ * Return value: the newly-allocated string, or %NULL if the
+ * conversion failed. (It should not fail for
+ * any properly formed UTF-8 string unless system
+ * limits like memory or file descriptors are exceeded.)
+ **/
+gchar *
+gdk_utf8_to_string_target (const gchar *str)
+{
+ GdkDisplay *display = gdk_display_get_default ();
+
+ return GDK_DISPLAY_GET_CLASS (display)->utf8_to_string_target (display, str);
+}
diff --git a/gdk/x11/gdkdisplay-x11.c b/gdk/x11/gdkdisplay-x11.c
index cbba5aa..cdf2b5c 100644
--- a/gdk/x11/gdkdisplay-x11.c
+++ b/gdk/x11/gdkdisplay-x11.c
@@ -2765,4 +2765,6 @@ _gdk_display_x11_class_init (GdkDisplayX11Class * class)
display_class->send_selection_notify = _gdk_x11_display_send_selection_notify;
display_class->get_selection_property = _gdk_x11_display_get_selection_property;
display_class->convert_selection = _gdk_x11_display_convert_selection;
+ display_class->text_property_to_utf8_list = _gdk_x11_display_text_property_to_utf8_list;
+ display_class->utf8_to_string_target = _gdk_x11_display_utf8_to_string_target;
}
diff --git a/gdk/x11/gdkprivate-x11.h b/gdk/x11/gdkprivate-x11.h
index c630c31..a2f80dc 100644
--- a/gdk/x11/gdkprivate-x11.h
+++ b/gdk/x11/gdkprivate-x11.h
@@ -213,6 +213,15 @@ void _gdk_x11_display_convert_selection (GdkDisplay *display,
GdkAtom target,
guint32 time);
+gint _gdk_x11_display_text_property_to_utf8_list (GdkDisplay *display,
+ GdkAtom encoding,
+ gint format,
+ const guchar *text,
+ gint length,
+ gchar ***list);
+gchar * _gdk_x11_display_utf8_to_string_target (GdkDisplay *displayt,
+ const gchar *str);
+
void _gdk_x11_device_check_extension_events (GdkDevice *device);
GdkDeviceManager *_gdk_x11_device_manager_new (GdkDisplay *display);
diff --git a/gdk/x11/gdkselection-x11.c b/gdk/x11/gdkselection-x11.c
index 4331258..7b89105 100644
--- a/gdk/x11/gdkselection-x11.c
+++ b/gdk/x11/gdkselection-x11.c
@@ -21,7 +21,7 @@
* Modified by the GTK+ Team and others 1997-2000. See the AUTHORS
* file for a list of people on the GTK+ Team. See the ChangeLog
* files for a list of changes. These files are distributed with
- * GTK+ at ftp://ftp.gtk.org/pub/gtk/.
+ * GTK+ at ftp://ftp.gtk.org/pub/gtk/.
*/
#include "config.h"
@@ -61,12 +61,12 @@ _gdk_x11_selection_window_destroyed (GdkWindow *window)
{
OwnerInfo *info = tmp_list->data;
tmp_list = tmp_list->next;
-
+
if (info->owner == window)
- {
- owner_list = g_slist_remove (owner_list, info);
- g_free (info);
- }
+ {
+ owner_list = g_slist_remove (owner_list, info);
+ g_free (info);
+ }
}
}
@@ -78,24 +78,24 @@ _gdk_x11_selection_filter_clear_event (XSelectionClearEvent *event)
{
GSList *tmp_list = owner_list;
GdkDisplay *display = gdk_x11_lookup_xdisplay (event->display);
-
+
while (tmp_list)
{
OwnerInfo *info = tmp_list->data;
if (gdk_window_get_display (info->owner) == display &&
- info->selection == gdk_x11_xatom_to_atom_for_display (display, event->selection))
- {
- if ((GDK_WINDOW_XID (info->owner) == event->window &&
- event->serial >= info->serial))
- {
- owner_list = g_slist_remove (owner_list, info);
- g_free (info);
- return TRUE;
- }
- else
- return FALSE;
- }
+ info->selection == gdk_x11_xatom_to_atom_for_display (display, event->selection))
+ {
+ if ((GDK_WINDOW_XID (info->owner) == event->window &&
+ event->serial >= info->serial))
+ {
+ owner_list = g_slist_remove (owner_list, info);
+ g_free (info);
+ return TRUE;
+ }
+ else
+ return FALSE;
+ }
tmp_list = tmp_list->next;
}
@@ -127,24 +127,24 @@ _gdk_x11_display_set_selection_owner (GdkDisplay *display,
xdisplay = GDK_WINDOW_XDISPLAY (owner);
xwindow = GDK_WINDOW_XID (owner);
}
- else
+ else
{
xdisplay = GDK_DISPLAY_XDISPLAY (display);
xwindow = None;
}
-
+
xselection = gdk_x11_atom_to_xatom_for_display (display, selection);
tmp_list = owner_list;
while (tmp_list)
{
info = tmp_list->data;
- if (info->selection == selection)
- {
- owner_list = g_slist_remove (owner_list, info);
- g_free (info);
- break;
- }
+ if (info->selection == selection)
+ {
+ owner_list = g_slist_remove (owner_list, info);
+ g_free (info);
+ break;
+ }
tmp_list = tmp_list->next;
}
@@ -173,8 +173,8 @@ _gdk_x11_display_get_selection_owner (GdkDisplay *display,
return NULL;
xwindow = XGetSelectionOwner (GDK_DISPLAY_XDISPLAY (display),
- gdk_x11_atom_to_xatom_for_display (display,
- selection));
+ gdk_x11_atom_to_xatom_for_display (display,
+ selection));
if (xwindow == None)
return NULL;
@@ -232,66 +232,66 @@ _gdk_x11_display_get_selection_property (GdkDisplay *display,
AnyPropertyType, &prop_type, &prop_format,
&nitems, &nbytes, &t) != Success)
goto err;
-
+
if (prop_type != None)
{
if (ret_type)
- *ret_type = gdk_x11_xatom_to_atom_for_display (display, prop_type);
+ *ret_type = gdk_x11_xatom_to_atom_for_display (display, prop_type);
if (ret_format)
- *ret_format = prop_format;
+ *ret_format = prop_format;
if (prop_type == XA_ATOM ||
- prop_type == gdk_x11_get_xatom_by_name_for_display (display, "ATOM_PAIR"))
- {
- Atom* atoms = (Atom*) t;
- GdkAtom* atoms_dest;
- gint num_atom, i;
-
- if (prop_format != 32)
- goto err;
-
- num_atom = nitems;
- length = sizeof (GdkAtom) * num_atom + 1;
-
- if (data)
- {
- *data = g_malloc (length);
- (*data)[length - 1] = '\0';
- atoms_dest = (GdkAtom *)(*data);
-
- for (i=0; i < num_atom; i++)
- atoms_dest[i] = gdk_x11_xatom_to_atom_for_display (display, atoms[i]);
- }
- }
+ prop_type == gdk_x11_get_xatom_by_name_for_display (display, "ATOM_PAIR"))
+ {
+ Atom* atoms = (Atom*) t;
+ GdkAtom* atoms_dest;
+ gint num_atom, i;
+
+ if (prop_format != 32)
+ goto err;
+
+ num_atom = nitems;
+ length = sizeof (GdkAtom) * num_atom + 1;
+
+ if (data)
+ {
+ *data = g_malloc (length);
+ (*data)[length - 1] = '\0';
+ atoms_dest = (GdkAtom *)(*data);
+
+ for (i=0; i < num_atom; i++)
+ atoms_dest[i] = gdk_x11_xatom_to_atom_for_display (display, atoms[i]);
+ }
+ }
else
- {
- switch (prop_format)
- {
- case 8:
- length = nitems;
- break;
- case 16:
- length = sizeof(short) * nitems;
- break;
- case 32:
- length = sizeof(long) * nitems;
- break;
- default:
- g_assert_not_reached ();
- break;
- }
-
- /* Add on an extra byte to handle null termination. X guarantees
- that t will be 1 longer than nitems and null terminated */
- length += 1;
-
- if (data)
- *data = g_memdup (t, length);
- }
-
+ {
+ switch (prop_format)
+ {
+ case 8:
+ length = nitems;
+ break;
+ case 16:
+ length = sizeof(short) * nitems;
+ break;
+ case 32:
+ length = sizeof(long) * nitems;
+ break;
+ default:
+ g_assert_not_reached ();
+ break;
+ }
+
+ /* Add on an extra byte to handle null termination. X guarantees
+ that t will be 1 longer than nitems and null terminated */
+ length += 1;
+
+ if (data)
+ *data = g_memdup (t, length);
+ }
+
if (t)
- XFree (t);
-
+ XFree (t);
+
return length - 1;
}
@@ -302,7 +302,7 @@ _gdk_x11_display_get_selection_property (GdkDisplay *display,
*ret_format = 0;
if (data)
*data = NULL;
-
+
return 0;
}
@@ -332,35 +332,35 @@ _gdk_x11_display_send_selection_notify (GdkDisplay *display,
}
/**
- * gdk_text_property_to_text_list_for_display:
- * @display: The #GdkDisplay where the encoding is defined.
- * @encoding: an atom representing the encoding. The most
- * common values for this are STRING, or COMPOUND_TEXT.
- * This is value used as the type for the property.
- * @format: the format of the property.
- * @text: The text data.
- * @length: The number of items to transform.
- * @list: location to store a terminated array of strings in
- * the encoding of the current locale. This array should be
+ * gdk_x11_display_text_property_to_text_list:
+ * @display: The #GdkDisplay where the encoding is defined
+ * @encoding: an atom representing the encoding. The most
+ * common values for this are STRING, or COMPOUND_TEXT.
+ * This is value used as the type for the property
+ * @format: the format of the property
+ * @text: The text data
+ * @length: The number of items to transform
+ * @list: location to store a terminated array of strings in
+ * the encoding of the current locale. This array should be
* freed using gdk_free_text_list().
*
- * Convert a text string from the encoding as it is stored
+ * Convert a text string from the encoding as it is stored
* in a property into an array of strings in the encoding of
* the current locale. (The elements of the array represent the
* nul-separated elements of the original text string.)
*
- * Returns: the number of strings stored in list, or 0,
- * if the conversion failed.
+ * Returns: the number of strings stored in list, or 0,
+ * if the conversion failed
*
- * Since: 2.2
+ * Since: 3.0
*/
gint
-gdk_text_property_to_text_list_for_display (GdkDisplay *display,
- GdkAtom encoding,
- gint format,
- const guchar *text,
- gint length,
- gchar ***list)
+gdk_x11_display_text_property_to_text_list (GdkDisplay *display,
+ GdkAtom encoding,
+ gint format,
+ const guchar *text,
+ gint length,
+ gchar ***list)
{
XTextProperty property;
gint count = 0;
@@ -378,31 +378,31 @@ gdk_text_property_to_text_list_for_display (GdkDisplay *display,
property.encoding = gdk_x11_atom_to_xatom_for_display (display, encoding);
property.format = format;
property.nitems = length;
- res = XmbTextPropertyToTextList (GDK_DISPLAY_XDISPLAY (display), &property,
- &local_list, &count);
+ res = XmbTextPropertyToTextList (GDK_DISPLAY_XDISPLAY (display), &property,
+ &local_list, &count);
if (res == XNoMemory || res == XLocaleNotSupported || res == XConverterNotFound)
return 0;
else
{
if (list)
- *list = local_list;
+ *list = g_strdupv (local_list);
else
- XFreeStringList (local_list);
-
+ XFreeStringList (local_list);
+
return count;
}
}
/**
- * gdk_free_text_list:
+ * gdk_x11_free_text_list:
* @list: the value stored in the @list parameter by
- * a call to gdk_text_property_to_text_list().
+ * a call to gdk_x11_display_text_property_to_text_list().
*
* Frees the array of strings created by
- * gdk_text_property_to_text_list().
+ * gdk_x11_display_text_property_to_text_list().
*/
void
-gdk_free_text_list (gchar **list)
+gdk_x11_free_text_list (gchar **list)
{
g_return_if_fail (list != NULL);
@@ -411,9 +411,9 @@ gdk_free_text_list (gchar **list)
static gint
make_list (const gchar *text,
- gint length,
- gboolean latin1,
- gchar ***list)
+ gint length,
+ gboolean latin1,
+ gchar ***list)
{
GSList *strings = NULL;
gint n_strings = 0;
@@ -426,40 +426,40 @@ make_list (const gchar *text,
while (p < text + length)
{
gchar *str;
-
+
q = p;
while (*q && q < text + length)
- q++;
+ q++;
if (latin1)
- {
- str = g_convert (p, q - p,
- "UTF-8", "ISO-8859-1",
- NULL, NULL, &error);
-
- if (!str)
- {
- g_warning ("Error converting selection from STRING: %s",
- error->message);
- g_error_free (error);
- }
- }
+ {
+ str = g_convert (p, q - p,
+ "UTF-8", "ISO-8859-1",
+ NULL, NULL, &error);
+
+ if (!str)
+ {
+ g_warning ("Error converting selection from STRING: %s",
+ error->message);
+ g_error_free (error);
+ }
+ }
else
- {
- str = g_strndup (p, q - p);
- if (!g_utf8_validate (str, -1, NULL))
- {
- g_warning ("Error converting selection from UTF8_STRING");
- g_free (str);
- str = NULL;
- }
- }
+ {
+ str = g_strndup (p, q - p);
+ if (!g_utf8_validate (str, -1, NULL))
+ {
+ g_warning ("Error converting selection from UTF8_STRING");
+ g_free (str);
+ str = NULL;
+ }
+ }
if (str)
- {
- strings = g_slist_prepend (strings, str);
- n_strings++;
- }
+ {
+ strings = g_slist_prepend (strings, str);
+ n_strings++;
+ }
p = q + 1;
}
@@ -469,54 +469,32 @@ make_list (const gchar *text,
*list = g_new (gchar *, n_strings + 1);
(*list)[n_strings] = NULL;
}
-
+
i = n_strings;
tmp_list = strings;
while (tmp_list)
{
if (list)
- (*list)[--i] = tmp_list->data;
+ (*list)[--i] = tmp_list->data;
else
- g_free (tmp_list->data);
-
+ g_free (tmp_list->data);
+
tmp_list = tmp_list->next;
}
-
+
g_slist_free (strings);
return n_strings;
}
-/**
- * gdk_text_property_to_utf8_list_for_display:
- * @display: a #GdkDisplay
- * @encoding: an atom representing the encoding of the text
- * @format: the format of the property
- * @text: the text to convert
- * @length: the length of @text, in bytes
- * @list: location to store the list of strings or %NULL. The
- * list should be freed with g_strfreev().
- *
- * Converts a text property in the given encoding to
- * a list of UTF-8 strings.
- *
- * Return value: the number of strings in the resulting
- * list.
- *
- * Since: 2.2
- **/
-gint
-gdk_text_property_to_utf8_list_for_display (GdkDisplay *display,
- GdkAtom encoding,
- gint format,
- const guchar *text,
- gint length,
- gchar ***list)
+gint
+_gdk_x11_display_text_property_to_utf8_list (GdkDisplay *display,
+ GdkAtom encoding,
+ gint format,
+ const guchar *text,
+ gint length,
+ gchar ***list)
{
- g_return_val_if_fail (text != NULL, 0);
- g_return_val_if_fail (length >= 0, 0);
- g_return_val_if_fail (GDK_IS_DISPLAY (display), 0);
-
if (encoding == GDK_TARGET_STRING)
{
return make_list ((gchar *)text, length, TRUE, list);
@@ -534,88 +512,88 @@ gdk_text_property_to_utf8_list_for_display (GdkDisplay *display,
gboolean need_conversion = !g_get_charset (&charset);
gint count = 0;
GError *error = NULL;
-
+
/* Probably COMPOUND text, we fall back to Xlib routines
*/
- local_count = gdk_text_property_to_text_list_for_display (display,
- encoding,
- format,
- text,
- length,
- &local_list);
+ local_count = gdk_x11_display_text_property_to_text_list (display,
+ encoding,
+ format,
+ text,
+ length,
+ &local_list);
if (list)
- *list = g_new (gchar *, local_count + 1);
-
+ *list = g_new (gchar *, local_count + 1);
+
for (i=0; i<local_count; i++)
- {
- /* list contains stuff in our default encoding
- */
- if (need_conversion)
- {
- gchar *utf = g_convert (local_list[i], -1,
- "UTF-8", charset,
- NULL, NULL, &error);
- if (utf)
- {
- if (list)
- (*list)[count++] = utf;
- else
- g_free (utf);
- }
- else
- {
- g_warning ("Error converting to UTF-8 from '%s': %s",
- charset, error->message);
- g_error_free (error);
- error = NULL;
- }
- }
- else
- {
- if (list)
- {
- if (g_utf8_validate (local_list[i], -1, NULL))
- (*list)[count++] = g_strdup (local_list[i]);
- else
- g_warning ("Error converting selection");
- }
- }
- }
+ {
+ /* list contains stuff in our default encoding
+ */
+ if (need_conversion)
+ {
+ gchar *utf = g_convert (local_list[i], -1,
+ "UTF-8", charset,
+ NULL, NULL, &error);
+ if (utf)
+ {
+ if (list)
+ (*list)[count++] = utf;
+ else
+ g_free (utf);
+ }
+ else
+ {
+ g_warning ("Error converting to UTF-8 from '%s': %s",
+ charset, error->message);
+ g_error_free (error);
+ error = NULL;
+ }
+ }
+ else
+ {
+ if (list)
+ {
+ if (g_utf8_validate (local_list[i], -1, NULL))
+ (*list)[count++] = g_strdup (local_list[i]);
+ else
+ g_warning ("Error converting selection");
+ }
+ }
+ }
if (local_count)
- gdk_free_text_list (local_list);
-
+ gdk_x11_free_text_list (local_list);
+
if (list)
- (*list)[count] = NULL;
+ (*list)[count] = NULL;
return count;
}
}
/**
- * gdk_string_to_compound_text_for_display:
- * @display: the #GdkDisplay where the encoding is defined.
- * @str: a nul-terminated string.
- * @encoding: location to store the encoding atom
- * (to be used as the type for the property).
- * @format: location to store the format of the property
- * @ctext: location to store newly allocated data for the property.
- * @length: the length of @text, in bytes
- *
- * Convert a string from the encoding of the current
+ * gdk_x11_display_string_to_compound_text:
+ * @display: the #GdkDisplay where the encoding is defined
+ * @str: a nul-terminated string
+ * @encoding: location to store the encoding atom
+ * (to be used as the type for the property)
+ * @format: location to store the format of the property
+ * @ctext: location to store newly allocated data for the property
+ * @length: the length of @text, in bytes
+ *
+ * Convert a string from the encoding of the current
* locale into a form suitable for storing in a window property.
- *
- * Returns: 0 upon success, non-zero upon failure.
*
- * Since: 2.2
- **/
+ * Returns: 0 upon success, non-zero upon failure
+ *
+ * Since: 3.0
+ */
gint
-gdk_string_to_compound_text_for_display (GdkDisplay *display,
- const gchar *str,
- GdkAtom *encoding,
- gint *format,
- guchar **ctext,
- gint *length)
+gdk_x11_display_string_to_compound_text (GdkDisplay *display,
+ const gchar *str,
+ GdkAtom *encoding,
+ gint *format,
+ guchar **ctext,
+ gint *length)
{
gint res;
XTextProperty property;
@@ -625,9 +603,9 @@ gdk_string_to_compound_text_for_display (GdkDisplay *display,
if (gdk_display_is_closed (display))
res = XLocaleNotSupported;
else
- res = XmbTextListToTextProperty (GDK_DISPLAY_XDISPLAY (display),
- (char **)&str, 1, XCompoundTextStyle,
- &property);
+ res = XmbTextListToTextProperty (GDK_DISPLAY_XDISPLAY (display),
+ (char **)&str, 1, XCompoundTextStyle,
+ &property);
if (res != Success)
{
property.encoding = None;
@@ -655,9 +633,9 @@ gdk_string_to_compound_text_for_display (GdkDisplay *display,
* This routine strips out all non-allowed C0 and C1 characters
* from the input string and also canonicalizes \r, and \r\n to \n
*/
-static gchar *
+static gchar *
sanitize_utf8 (const gchar *src,
- gboolean return_latin1)
+ gboolean return_latin1)
{
gint len = strlen (src);
GString *result = g_string_sized_new (len);
@@ -666,89 +644,76 @@ sanitize_utf8 (const gchar *src,
while (*p)
{
if (*p == '\r')
- {
- p++;
- if (*p == '\n')
- p++;
+ {
+ p++;
+ if (*p == '\n')
+ p++;
- g_string_append_c (result, '\n');
- }
+ 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);
- }
+ {
+ 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);
}
-/**
- * gdk_utf8_to_string_target:
- * @str: a UTF-8 string
- *
- * Converts an UTF-8 string into the best possible representation
- * as a STRING. The representation of characters not in STRING
- * is not specified; it may be as pseudo-escape sequences
- * \x{ABCD}, or it may be in some other form of approximation.
- *
- * Return value: the newly-allocated string, or %NULL if the
- * conversion failed. (It should not fail for
- * any properly formed UTF-8 string unless system
- * limits like memory or file descriptors are exceeded.)
- **/
gchar *
-gdk_utf8_to_string_target (const gchar *str)
+_gdk_x11_display_utf8_to_string_target (GdkDisplay *display,
+ const gchar *str)
{
return sanitize_utf8 (str, TRUE);
}
/**
- * gdk_utf8_to_compound_text_for_display:
- * @display: a #GdkDisplay
- * @str: a UTF-8 string
+ * gdk_x11_display_utf8_to_compound_text:
+ * @display: a #GdkDisplay
+ * @str: a UTF-8 string
* @encoding: location to store resulting encoding
- * @format: location to store format of the result
- * @ctext: location to store the data of the result
- * @length: location to store the length of the data
- * stored in @ctext
- *
- * Converts from UTF-8 to compound text.
- *
- * Return value: %TRUE if the conversion succeeded, otherwise
- * %FALSE.
+ * @format: location to store format of the result
+ * @ctext: location to store the data of the result
+ * @length: location to store the length of the data
+ * stored in @ctext
+ *
+ * Converts from UTF-8 to compound text.
*
- * Since: 2.2
- **/
+ * Return value: %TRUE if the conversion succeeded,
+ * otherwise %FALSE
+ *
+ * Since: 3.0
+ */
gboolean
-gdk_utf8_to_compound_text_for_display (GdkDisplay *display,
- const gchar *str,
- GdkAtom *encoding,
- gint *format,
- guchar **ctext,
- gint *length)
+gdk_x11_display_utf8_to_compound_text (GdkDisplay *display,
+ const gchar *str,
+ GdkAtom *encoding,
+ gint *format,
+ guchar **ctext,
+ gint *length)
{
gboolean need_conversion;
const gchar *charset;
@@ -766,53 +731,56 @@ gdk_utf8_to_compound_text_for_display (GdkDisplay *display,
if (need_conversion)
{
locale_str = g_convert (tmp_str, -1,
- charset, "UTF-8",
- NULL, NULL, &error);
+ charset, "UTF-8",
+ NULL, NULL, &error);
g_free (tmp_str);
if (!locale_str)
- {
- if (!(error->domain = G_CONVERT_ERROR &&
- error->code == G_CONVERT_ERROR_ILLEGAL_SEQUENCE))
- {
- g_warning ("Error converting from UTF-8 to '%s': %s",
- charset, error->message);
- }
- g_error_free (error);
-
- if (encoding)
- *encoding = None;
- if (format)
- *format = None;
- if (ctext)
- *ctext = NULL;
- if (length)
- *length = 0;
-
- return FALSE;
- }
+ {
+ if (!(error->domain = G_CONVERT_ERROR &&
+ error->code == G_CONVERT_ERROR_ILLEGAL_SEQUENCE))
+ {
+ g_warning ("Error converting from UTF-8 to '%s': %s",
+ charset, error->message);
+ }
+ g_error_free (error);
+
+ if (encoding)
+ *encoding = None;
+ if (format)
+ *format = None;
+ if (ctext)
+ *ctext = NULL;
+ if (length)
+ *length = 0;
+
+ return FALSE;
+ }
}
else
locale_str = tmp_str;
-
- result = gdk_string_to_compound_text_for_display (display, locale_str,
- encoding, format,
- ctext, length);
+
+ result = gdk_x11_display_string_to_compound_text (display, locale_str,
+ encoding, format,
+ ctext, length);
result = (result == Success? TRUE : FALSE);
-
+
g_free (locale_str);
return result;
}
/**
- * gdk_free_compound_text:
+ * gdk_x11_free_compound_text:
* @ctext: The pointer stored in @ctext from a call to
- * gdk_string_to_compound_text().
+ * gdk_x11_display_string_to_compound_text().
*
- * Frees the data returned from gdk_string_to_compound_text().
+ * Frees the data returned from gdk_x11_display_string_to_compound_text().
+ *
+ * Since: 3.0
*/
-void gdk_free_compound_text (guchar *ctext)
+void
+gdk_x11_free_compound_text (guchar *ctext)
{
if (ctext)
XFree (ctext);
diff --git a/gdk/x11/gdkwindow-x11.c b/gdk/x11/gdkwindow-x11.c
index b9d59fe..0c29ab9 100644
--- a/gdk/x11/gdkwindow-x11.c
+++ b/gdk/x11/gdkwindow-x11.c
@@ -2231,10 +2231,10 @@ set_text_property (GdkDisplay *display,
else
{
GdkAtom gdk_type;
-
- gdk_utf8_to_compound_text_for_display (display,
- utf8_str, &gdk_type, &prop_format,
- (guchar **)&prop_text, &prop_length);
+
+ gdk_x11_display_utf8_to_compound_text (display,
+ utf8_str, &gdk_type, &prop_format,
+ (guchar **)&prop_text, &prop_length);
prop_type = gdk_x11_atom_to_xatom_for_display (display, gdk_type);
is_compound_text = TRUE;
}
@@ -2249,7 +2249,7 @@ set_text_property (GdkDisplay *display,
prop_length);
if (is_compound_text)
- gdk_free_compound_text ((guchar *)prop_text);
+ gdk_x11_free_compound_text ((guchar *)prop_text);
else
g_free (prop_text);
}
diff --git a/gdk/x11/gdkx.h b/gdk/x11/gdkx.h
index 1801b63..f9e24be 100644
--- a/gdk/x11/gdkx.h
+++ b/gdk/x11/gdkx.h
@@ -231,6 +231,30 @@ GdkWindow *gdk_x11_window_foreign_new_for_display (GdkDisplay *display,
GdkWindow *gdk_x11_window_lookup_for_display (GdkDisplay *display,
Window window);
+gint gdk_x11_display_text_property_to_text_list (GdkDisplay *display,
+ GdkAtom encoding,
+ gint format,
+ const guchar *text,
+ gint length,
+ gchar ***list);
+void gdk_x11_free_text_list (gchar **list);
+gint gdk_x11_display_string_to_compound_text (GdkDisplay *display,
+ const gchar *str,
+ GdkAtom *encoding,
+ gint *format,
+ guchar **ctext,
+ gint *length);
+gboolean gdk_x11_display_utf8_to_compound_text (GdkDisplay *display,
+ const gchar *str,
+ GdkAtom *encoding,
+ gint *format,
+ guchar **ctext,
+ gint *length);
+void gdk_x11_free_compound_text (guchar *ctext);
+
+
+
+
G_END_DECLS
#endif /* __GDK_X_H__ */
diff --git a/gtk/gtkselection.c b/gtk/gtkselection.c
index 04908a7..84531f5 100644
--- a/gtk/gtkselection.c
+++ b/gtk/gtkselection.c
@@ -1315,18 +1315,22 @@ selection_set_compound_text (GtkSelectionData *selection_data,
gint format;
gint new_length;
gboolean result = FALSE;
-
- tmp = g_strndup (str, len);
- if (gdk_utf8_to_compound_text_for_display (selection_data->display, tmp,
- &encoding, &format, &text, &new_length))
+
+#ifdef GDK_WINDOWING_X11
+ if (GDK_IS_DISPLAY_X11 (selection_data->display))
{
- gtk_selection_data_set (selection_data, encoding, format, text, new_length);
- gdk_free_compound_text (text);
-
- result = TRUE;
- }
+ tmp = g_strndup (str, len);
+ if (gdk_x11_display_utf8_to_compound_text (selection_data->display, tmp,
+ &encoding, &format, &text, &new_length))
+ {
+ gtk_selection_data_set (selection_data, encoding, format, text, new_length);
+ gdk_x11_free_compound_text (text);
- g_free (tmp);
+ result = TRUE;
+ }
+ g_free (tmp);
+ }
+#endif
return result;
}
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]