diff options
author | Benjamin Otte <otte@redhat.com> | 2013-04-15 15:40:55 +0200 |
---|---|---|
committer | Benjamin Otte <otte@redhat.com> | 2013-04-15 15:43:27 +0200 |
commit | aa9e974c866e32c5573da3d364c72dd5e016d47a (patch) | |
tree | 88d43c63fdeba8dd54bd216e0bc77d08c33373a9 /gdk | |
parent | a489f69e009644717aad8df74397b669f5f3fbb2 (diff) | |
download | gtk+-aa9e974c866e32c5573da3d364c72dd5e016d47a.tar.gz |
gdk: Make atoms handled generically
This is another step towards making GdkDisplayManager backend-agnostic.
Most of the backends profit from this as their atom implementations
where generic anyway - x11 needed that to allow multiple X displays and
broadway, quartz and wayland don't have the concept of displays.
The X11 backend still did things, so I only #if 0'd some code but did
not actually update anything.
Diffstat (limited to 'gdk')
-rw-r--r-- | gdk/Makefile.am | 1 | ||||
-rw-r--r-- | gdk/broadway/gdkdisplaymanager-broadway.c | 2 | ||||
-rw-r--r-- | gdk/broadway/gdkprivate-broadway.h | 9 | ||||
-rw-r--r-- | gdk/broadway/gdkproperty-broadway.c | 28 | ||||
-rw-r--r-- | gdk/gdkdisplaymanager.c | 66 | ||||
-rw-r--r-- | gdk/gdkdisplaymanagerprivate.h | 5 | ||||
-rw-r--r-- | gdk/gdkprivate.h | 2 | ||||
-rw-r--r-- | gdk/gdkproperty.c | 220 | ||||
-rw-r--r-- | gdk/wayland/gdkdisplaymanager-wayland.c | 88 | ||||
-rw-r--r-- | gdk/win32/gdkdisplaymanager-win32.c | 2 | ||||
-rw-r--r-- | gdk/x11/gdkdisplaymanager-x11.c | 2 | ||||
-rw-r--r-- | gdk/x11/gdkproperty-x11.c | 78 |
12 files changed, 230 insertions, 273 deletions
diff --git a/gdk/Makefile.am b/gdk/Makefile.am index 2cd935379b..a32c6b508e 100644 --- a/gdk/Makefile.am +++ b/gdk/Makefile.am @@ -134,6 +134,7 @@ gdk_c_sources = \ gdkframeclockidle.c \ gdkpango.c \ gdkpixbuf-drawable.c \ + gdkproperty.c \ gdkrectangle.c \ gdkrgba.c \ gdkscreen.c \ diff --git a/gdk/broadway/gdkdisplaymanager-broadway.c b/gdk/broadway/gdkdisplaymanager-broadway.c index 468d4fc6d6..0cefe07fe3 100644 --- a/gdk/broadway/gdkdisplaymanager-broadway.c +++ b/gdk/broadway/gdkdisplaymanager-broadway.c @@ -127,8 +127,6 @@ gdk_broadway_display_manager_class_init (GdkBroadwayDisplayManagerClass *class) object_class->finalize = gdk_broadway_display_manager_finalize; manager_class->open_display = gdk_broadway_display_manager_open_display; - manager_class->atom_intern = _gdk_broadway_display_manager_atom_intern; - manager_class->get_atom_name = _gdk_broadway_display_manager_get_atom_name; manager_class->lookup_keyval = gdk_broadway_display_manager_lookup_keyval; manager_class->get_keyval_name = gdk_broadway_display_manager_get_keyval_name; } diff --git a/gdk/broadway/gdkprivate-broadway.h b/gdk/broadway/gdkprivate-broadway.h index b631e04178..89997e3e7b 100644 --- a/gdk/broadway/gdkprivate-broadway.h +++ b/gdk/broadway/gdkprivate-broadway.h @@ -42,15 +42,6 @@ void _gdk_broadway_resync_windows (void); void _gdk_broadway_windowing_init (void); -gchar * _gdk_broadway_display_manager_get_atom_name (GdkDisplayManager *manager, - GdkAtom atom); -GdkAtom _gdk_broadway_display_manager_atom_intern_static_string (GdkDisplayManager *manager, - const gchar *atom_name); -GdkAtom _gdk_broadway_display_manager_atom_intern (GdkDisplayManager *manager, - const gchar *atom_name, - gboolean only_if_exists); - - void _gdk_broadway_window_register_dnd (GdkWindow *window); GdkDragContext * _gdk_broadway_window_drag_begin (GdkWindow *window, GdkDevice *device, diff --git a/gdk/broadway/gdkproperty-broadway.c b/gdk/broadway/gdkproperty-broadway.c index 3e8b62b923..85bb8be8e5 100644 --- a/gdk/broadway/gdkproperty-broadway.c +++ b/gdk/broadway/gdkproperty-broadway.c @@ -35,34 +35,6 @@ #include <string.h> -GdkAtom -_gdk_broadway_display_manager_atom_intern (GdkDisplayManager *manager, - const gchar *atom_name, - gboolean only_if_exists) -{ - return _GDK_MAKE_ATOM (g_quark_from_string (atom_name)); -} - -GdkAtom -_gdk_broadway_display_manager_atom_intern_static_string (GdkDisplayManager *manager, - const gchar *atom_name) -{ - return _GDK_MAKE_ATOM (g_quark_from_static_string (atom_name)); -} - -static const char * -get_atom_name (GdkAtom atom) -{ - return g_quark_to_string (GPOINTER_TO_UINT(atom)); -} - -gchar * -_gdk_broadway_display_manager_get_atom_name (GdkDisplayManager *manager, - GdkAtom atom) -{ - return g_strdup (get_atom_name (atom)); -} - gboolean _gdk_broadway_window_get_property (GdkWindow *window, GdkAtom property, diff --git a/gdk/gdkdisplaymanager.c b/gdk/gdkdisplaymanager.c index 0442ae0580..cfbd15e88a 100644 --- a/gdk/gdkdisplaymanager.c +++ b/gdk/gdkdisplaymanager.c @@ -524,72 +524,6 @@ gdk_display_manager_open_display (GdkDisplayManager *manager, return GDK_DISPLAY_MANAGER_GET_CLASS (manager)->open_display (manager, name); } -/** - * gdk_atom_intern: - * @atom_name: a string. - * @only_if_exists: if %TRUE, GDK is allowed to not create a new atom, but - * just return %GDK_NONE if the requested atom doesn't already - * exists. Currently, the flag is ignored, since checking the - * existance of an atom is as expensive as creating it. - * - * Finds or creates an atom corresponding to a given string. - * - * Returns: (transfer none): the atom corresponding to @atom_name. - */ -GdkAtom -gdk_atom_intern (const gchar *atom_name, - gboolean only_if_exists) -{ - GdkDisplayManager *manager = gdk_display_manager_get (); - - return GDK_DISPLAY_MANAGER_GET_CLASS (manager)->atom_intern (manager, atom_name, TRUE); -} - -/** - * gdk_atom_intern_static_string: - * @atom_name: a static string - * - * Finds or creates an atom corresponding to a given string. - * - * Note that this function is identical to gdk_atom_intern() except - * that if a new #GdkAtom is created the string itself is used rather - * than a copy. This saves memory, but can only be used if the string - * will <emphasis>always</emphasis> exist. It can be used with statically - * allocated strings in the main program, but not with statically - * allocated memory in dynamically loaded modules, if you expect to - * ever unload the module again (e.g. do not use this function in - * GTK+ theme engines). - * - * Returns: (transfer none): the atom corresponding to @atom_name - * - * Since: 2.10 - */ -GdkAtom -gdk_atom_intern_static_string (const gchar *atom_name) -{ - GdkDisplayManager *manager = gdk_display_manager_get (); - - return GDK_DISPLAY_MANAGER_GET_CLASS (manager)->atom_intern (manager, atom_name, FALSE); -} - -/** - * gdk_atom_name: - * @atom: a #GdkAtom. - * - * Determines the string corresponding to an atom. - * - * Returns: a newly-allocated string containing the string - * corresponding to @atom. When you are done with the - * return value, you should free it using g_free(). - */ -gchar * -gdk_atom_name (GdkAtom atom) -{ - GdkDisplayManager *manager = gdk_display_manager_get (); - - return GDK_DISPLAY_MANAGER_GET_CLASS (manager)->get_atom_name (manager, atom); -} - void _gdk_display_manager_add_display (GdkDisplayManager *manager, GdkDisplay *display) diff --git a/gdk/gdkdisplaymanagerprivate.h b/gdk/gdkdisplaymanagerprivate.h index 4794b7e731..a8885a3b5e 100644 --- a/gdk/gdkdisplaymanagerprivate.h +++ b/gdk/gdkdisplaymanagerprivate.h @@ -45,11 +45,6 @@ struct _GdkDisplayManagerClass const gchar *name); /* FIXME the following should really be frontend-only, not vfuncs */ - GdkAtom (*atom_intern) (GdkDisplayManager *manager, - const gchar *atom_name, - gboolean copy_name); - gchar * (*get_atom_name) (GdkDisplayManager *manager, - GdkAtom atom); guint (*lookup_keyval) (GdkDisplayManager *manager, const gchar *name); gchar * (*get_keyval_name) (GdkDisplayManager *manager, diff --git a/gdk/gdkprivate.h b/gdk/gdkprivate.h index 7cf006aa49..c2902b8ae0 100644 --- a/gdk/gdkprivate.h +++ b/gdk/gdkprivate.h @@ -29,6 +29,8 @@ G_BEGIN_DECLS +const char * _gdk_atom_name_const (GdkAtom atom); + void gdk_window_destroy_notify (GdkWindow *window); void gdk_synthesize_window_state (GdkWindow *window, diff --git a/gdk/gdkproperty.c b/gdk/gdkproperty.c new file mode 100644 index 0000000000..7ba0f83bc4 --- /dev/null +++ b/gdk/gdkproperty.c @@ -0,0 +1,220 @@ +/* GDK - The GIMP Drawing Kit + * Copyright (C) 2000 Red Hat, Inc. + * 2005 Imendio AB + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library. If not, see <http://www.gnu.org/licenses/>. + */ + +#include "config.h" + +#include "gdkproperty.h" + +#include "gdkprivate.h" + +static GHashTable *names_to_atoms; +static GPtrArray *atoms_to_names; + +static const gchar xatoms_string[] = + /* These are all the standard predefined X atoms */ + "NONE\0" + "PRIMARY\0" + "SECONDARY\0" + "ARC\0" + "ATOM\0" + "BITMAP\0" + "CARDINAL\0" + "COLORMAP\0" + "CURSOR\0" + "CUT_BUFFER0\0" + "CUT_BUFFER1\0" + "CUT_BUFFER2\0" + "CUT_BUFFER3\0" + "CUT_BUFFER4\0" + "CUT_BUFFER5\0" + "CUT_BUFFER6\0" + "CUT_BUFFER7\0" + "DRAWABLE\0" + "FONT\0" + "INTEGER\0" + "PIXMAP\0" + "POINT\0" + "RECTANGLE\0" + "RESOURCE_MANAGER\0" + "RGB_COLOR_MAP\0" + "RGB_BEST_MAP\0" + "RGB_BLUE_MAP\0" + "RGB_DEFAULT_MAP\0" + "RGB_GRAY_MAP\0" + "RGB_GREEN_MAP\0" + "RGB_RED_MAP\0" + "STRING\0" + "VISUALID\0" + "WINDOW\0" + "WM_COMMAND\0" + "WM_HINTS\0" + "WM_CLIENT_MACHINE\0" + "WM_ICON_NAME\0" + "WM_ICON_SIZE\0" + "WM_NAME\0" + "WM_NORMAL_HINTS\0" + "WM_SIZE_HINTS\0" + "WM_ZOOM_HINTS\0" + "MIN_SPACE\0" + "NORM_SPACE\0" + "MAX_SPACE\0" + "END_SPACE\0" + "SUPERSCRIPT_X\0" + "SUPERSCRIPT_Y\0" + "SUBSCRIPT_X\0" + "SUBSCRIPT_Y\0" + "UNDERLINE_POSITION\0" + "UNDERLINE_THICKNESS\0" + "STRIKEOUT_ASCENT\0" + "STRIKEOUT_DESCENT\0" + "ITALIC_ANGLE\0" + "X_HEIGHT\0" + "QUAD_WIDTH\0" + "WEIGHT\0" + "POINT_SIZE\0" + "RESOLUTION\0" + "COPYRIGHT\0" + "NOTICE\0" + "FONT_NAME\0" + "FAMILY_NAME\0" + "FULL_NAME\0" + "CAP_HEIGHT\0" + "WM_CLASS\0" + "WM_TRANSIENT_FOR\0" + "CLIPBOARD\0" /* = 69 */; + +static const gint xatoms_offset[] = { + 0, 5, 13, 23, 27, 32, 39, 48, 57, 64, 76, 88, + 100, 112, 124, 136, 148, 160, 169, 174, 182, 189, 195, 205, + 222, 236, 249, 262, 278, 291, 305, 317, 324, 333, 340, 351, + 360, 378, 391, 404, 412, 428, 442, 456, 466, 477, 487, 497, + 511, 525, 537, 549, 568, 588, 605, 623, 636, 645, 656, 663, + 674, 685, 695, 702, 712, 724, 734, 745, 754, 771 +}; + +static void +ensure_atom_tables (void) +{ + int i; + + if (names_to_atoms) + return; + + names_to_atoms = g_hash_table_new (g_str_hash, g_str_equal); + atoms_to_names = g_ptr_array_sized_new (G_N_ELEMENTS (xatoms_offset)); + + for (i = 0; i < G_N_ELEMENTS (xatoms_offset); i++) + { + g_hash_table_insert(names_to_atoms, (gchar *)xatoms_string + xatoms_offset[i], GINT_TO_POINTER (i)); + g_ptr_array_add(atoms_to_names, (gchar *)xatoms_string + xatoms_offset[i]); + } +} + +static GdkAtom +intern_atom_internal (const gchar *atom_name, gboolean allocate) +{ + gpointer result; + gchar *name; + + ensure_atom_tables (); + + if (g_hash_table_lookup_extended (names_to_atoms, atom_name, NULL, &result)) + return result; + + result = GINT_TO_POINTER (atoms_to_names->len); + name = allocate ? g_strdup (atom_name) : (gchar *)atom_name; + g_hash_table_insert(names_to_atoms, name, result); + g_ptr_array_add(atoms_to_names, name); + + return result; +} + +/** + * gdk_atom_intern: + * @atom_name: a string. + * @only_if_exists: if %TRUE, GDK is allowed to not create a new atom, but + * just return %GDK_NONE if the requested atom doesn't already + * exists. Currently, the flag is ignored, since checking the + * existance of an atom is as expensive as creating it. + * + * Finds or creates an atom corresponding to a given string. + * + * Returns: (transfer none): the atom corresponding to @atom_name. + */ +GdkAtom +gdk_atom_intern (const gchar *atom_name, + gboolean only_if_exists) +{ + g_return_val_if_fail (atom_name != NULL, GDK_NONE); + + return intern_atom_internal (atom_name, TRUE); +} + +/** + * gdk_atom_intern_static_string: + * @atom_name: a static string + * + * Finds or creates an atom corresponding to a given string. + * + * Note that this function is identical to gdk_atom_intern() except + * that if a new #GdkAtom is created the string itself is used rather + * than a copy. This saves memory, but can only be used if the string + * will <emphasis>always</emphasis> exist. It can be used with statically + * allocated strings in the main program, but not with statically + * allocated memory in dynamically loaded modules, if you expect to + * ever unload the module again (e.g. do not use this function in + * GTK+ theme engines). + * + * Returns: (transfer none): the atom corresponding to @atom_name + * + * Since: 2.10 + */ +GdkAtom +gdk_atom_intern_static_string (const gchar *atom_name) +{ + g_return_val_if_fail (atom_name != NULL, GDK_NONE); + + return intern_atom_internal (atom_name, FALSE); +} + +/** + * gdk_atom_name: + * @atom: a #GdkAtom. + * + * Determines the string corresponding to an atom. + * + * Returns: a newly-allocated string containing the string + * corresponding to @atom. When you are done with the + * return value, you should free it using g_free(). + */ +gchar * +gdk_atom_name (GdkAtom atom) +{ + return g_strdup (_gdk_atom_name_const (atom)); +} + +const gchar * +_gdk_atom_name_const (GdkAtom atom) +{ + ensure_atom_tables (); + + if (GPOINTER_TO_INT (atom) >= atoms_to_names->len) + return NULL; + + return g_ptr_array_index (atoms_to_names, GPOINTER_TO_INT (atom)); +} diff --git a/gdk/wayland/gdkdisplaymanager-wayland.c b/gdk/wayland/gdkdisplaymanager-wayland.c index 17160fbdb0..4b8ded5bc5 100644 --- a/gdk/wayland/gdkdisplaymanager-wayland.c +++ b/gdk/wayland/gdkdisplaymanager-wayland.c @@ -35,9 +35,6 @@ struct _GdkWaylandDisplayManager GSList *displays; - GHashTable *name_to_atoms; - guint next_atom; - gboolean init_failed; }; @@ -100,54 +97,6 @@ gdk_wayland_display_manager_open_display (GdkDisplayManager *manager, return _gdk_wayland_display_open (name); } -static GdkAtom -gdk_wayland_display_manager_atom_intern (GdkDisplayManager *manager_in, - const gchar *atom_name, - gboolean dup) -{ - GdkWaylandDisplayManager *manager = GDK_WAYLAND_DISPLAY_MANAGER (manager_in); - GdkAtom atom; - gpointer data; - const gchar *atom_name_intern; - - atom_name_intern = g_intern_string (atom_name); - data = g_hash_table_lookup (manager->name_to_atoms, atom_name_intern); - - if (data) - { - atom = GDK_POINTER_TO_ATOM (data); - return atom; - } - - atom = _GDK_MAKE_ATOM (manager->next_atom); - - g_hash_table_insert (manager->name_to_atoms, - (gchar *)atom_name_intern, - GDK_ATOM_TO_POINTER (atom)); - manager->next_atom++; - - return atom; -} - -static gchar * -gdk_wayland_display_manager_get_atom_name (GdkDisplayManager *manager_in, - GdkAtom atom) -{ - GdkWaylandDisplayManager *manager = GDK_WAYLAND_DISPLAY_MANAGER (manager_in); - GHashTableIter iter; - gpointer key, value; - - g_hash_table_iter_init (&iter, manager->name_to_atoms); - - while (g_hash_table_iter_next (&iter, &key, &value)) - { - if (GDK_POINTER_TO_ATOM (value) == atom) - return g_strdup (key); - } - - return NULL; -} - static guint gdk_wayland_display_manager_lookup_keyval (GdkDisplayManager *manager, const gchar *keyval_name) @@ -191,50 +140,13 @@ gdk_wayland_display_manager_class_init (GdkWaylandDisplayManagerClass *class) object_class->finalize = gdk_wayland_display_manager_finalize; manager_class->open_display = gdk_wayland_display_manager_open_display; - manager_class->atom_intern = gdk_wayland_display_manager_atom_intern; - manager_class->get_atom_name = gdk_wayland_display_manager_get_atom_name; manager_class->lookup_keyval = gdk_wayland_display_manager_lookup_keyval; manager_class->get_keyval_name = gdk_wayland_display_manager_get_keyval_name; } -static struct { - const gchar *name; - guint atom_id; -} predefined_atoms[] = { - { "NONE", 0 }, - { "PRIMARY", 1 }, - { "SECONDARY", 2 }, - { "ATOM", 4 }, - { "BITMAP", 5 }, - { "COLORMAP", 7 }, - { "DRAWABLE", 17 }, - { "INTEGER", 19 }, - { "PIXMAP", 20 }, - { "STRING", 31 }, - { "WINDOW", 33 }, - { "CLIPBOARD", 69 }, -}; - static void gdk_wayland_display_manager_init (GdkWaylandDisplayManager *manager) { - gint i; - - manager->name_to_atoms = g_hash_table_new (NULL, NULL); - - for (i = 0; i < G_N_ELEMENTS (predefined_atoms); i++) - { - GdkAtom atom; - const gchar *atom_name = predefined_atoms[i].name; - - atom = _GDK_MAKE_ATOM (predefined_atoms[i].atom_id); - g_hash_table_insert (manager->name_to_atoms, - (gchar *)g_intern_static_string (atom_name), - GDK_ATOM_TO_POINTER (atom)); - } - - manager->next_atom = - predefined_atoms[G_N_ELEMENTS (predefined_atoms) - 1].atom_id + 1; } void diff --git a/gdk/win32/gdkdisplaymanager-win32.c b/gdk/win32/gdkdisplaymanager-win32.c index a968f8e7b4..127386bba3 100644 --- a/gdk/win32/gdkdisplaymanager-win32.c +++ b/gdk/win32/gdkdisplaymanager-win32.c @@ -90,8 +90,10 @@ gdk_win32_display_manager_class_init (GdkWin32DisplayManagerClass *class) object_class->finalize = gdk_win32_display_manager_finalize; manager_class->open_display = gdk_win32_display_manager_open_display; +#if 0 manager_class->atom_intern = _gdk_win32_display_manager_atom_intern; manager_class->get_atom_name = _gdk_win32_display_manager_get_atom_name; +#endif manager_class->lookup_keyval = gdk_win32_display_manager_lookup_keyval; manager_class->get_keyval_name = gdk_win32_display_manager_get_keyval_name; } diff --git a/gdk/x11/gdkdisplaymanager-x11.c b/gdk/x11/gdkdisplaymanager-x11.c index afe5e9491c..adf3d15c42 100644 --- a/gdk/x11/gdkdisplaymanager-x11.c +++ b/gdk/x11/gdkdisplaymanager-x11.c @@ -113,8 +113,6 @@ gdk_x11_display_manager_class_init (GdkX11DisplayManagerClass *class) object_class->finalize = gdk_x11_display_manager_finalize; manager_class->open_display = gdk_x11_display_manager_open_display; - manager_class->atom_intern = _gdk_x11_display_manager_atom_intern; - manager_class->get_atom_name = _gdk_x11_display_manager_get_atom_name; manager_class->lookup_keyval = _gdk_x11_display_manager_lookup_keyval; manager_class->get_keyval_name = _gdk_x11_display_manager_get_keyval_name; manager_class->keyval_convert_case = _gdk_x11_display_manager_keyval_convert_case; diff --git a/gdk/x11/gdkproperty-x11.c b/gdk/x11/gdkproperty-x11.c index 2318a2e468..0e5a641be3 100644 --- a/gdk/x11/gdkproperty-x11.c +++ b/gdk/x11/gdkproperty-x11.c @@ -72,10 +72,6 @@ * data commonly stored in X window properties. */ - -static GPtrArray *virtual_atom_array; -static GHashTable *virtual_atom_hash; - static const gchar xatoms_string[] = /* These are all the standard predefined X atoms */ "\0" /* leave a space for None, even though it is not a predefined atom */ @@ -235,14 +231,12 @@ gdk_x11_atom_to_xatom_for_display (GdkDisplay *display, if (!xatom) { - char *name; - - g_return_val_if_fail (ATOM_TO_INDEX (atom) < virtual_atom_array->len, None); - - name = g_ptr_array_index (virtual_atom_array, ATOM_TO_INDEX (atom)); + char *name = gdk_atom_name (atom); xatom = XInternAtom (GDK_DISPLAY_XDISPLAY (display), name, FALSE); insert_atom_pair (display, atom, xatom); + + g_free (name); } return xatom; @@ -377,68 +371,6 @@ gdk_x11_xatom_to_atom (Atom xatom) return gdk_x11_xatom_to_atom_for_display (gdk_display_get_default (), xatom); } -static void -virtual_atom_check_init (void) -{ - if (!virtual_atom_hash) - { - gint i; - - virtual_atom_hash = g_hash_table_new (g_str_hash, g_str_equal); - virtual_atom_array = g_ptr_array_new (); - - for (i = 0; i < G_N_ELEMENTS (xatoms_offset); i++) - { - g_ptr_array_add (virtual_atom_array, (gchar *)(xatoms_string + xatoms_offset[i])); - g_hash_table_insert (virtual_atom_hash, (gchar *)(xatoms_string + xatoms_offset[i]), - GUINT_TO_POINTER (i)); - } - } -} - -GdkAtom -_gdk_x11_display_manager_atom_intern (GdkDisplayManager *manager, - const gchar *atom_name, - gboolean dup) -{ - GdkAtom result; - - virtual_atom_check_init (); - - result = GDK_POINTER_TO_ATOM (g_hash_table_lookup (virtual_atom_hash, atom_name)); - if (!result) - { - result = INDEX_TO_ATOM (virtual_atom_array->len); - - g_ptr_array_add (virtual_atom_array, dup ? g_strdup (atom_name) : (gchar *)atom_name); - g_hash_table_insert (virtual_atom_hash, - g_ptr_array_index (virtual_atom_array, - ATOM_TO_INDEX (result)), - GDK_ATOM_TO_POINTER (result)); - } - - return result; -} - -static const gchar * -get_atom_name (GdkAtom atom) -{ - virtual_atom_check_init (); - - if (ATOM_TO_INDEX (atom) < virtual_atom_array->len) - return g_ptr_array_index (virtual_atom_array, ATOM_TO_INDEX (atom)); - else - return NULL; -} - - -gchar * -_gdk_x11_display_manager_get_atom_name (GdkDisplayManager *manager, - GdkAtom atom) -{ - return g_strdup (get_atom_name (atom)); -} - /** * gdk_x11_get_xatom_by_name_for_display: * @display: a #GdkDisplay @@ -519,7 +451,7 @@ gdk_x11_get_xatom_name_for_display (GdkDisplay *display, { g_return_val_if_fail (GDK_IS_DISPLAY (display), NULL); - return get_atom_name (gdk_x11_xatom_to_atom_for_display (display, xatom)); + return _gdk_atom_name_const (gdk_x11_xatom_to_atom_for_display (display, xatom)); } /** @@ -538,7 +470,7 @@ gdk_x11_get_xatom_name_for_display (GdkDisplay *display, const gchar * gdk_x11_get_xatom_name (Atom xatom) { - return get_atom_name (gdk_x11_xatom_to_atom (xatom)); + return _gdk_atom_name_const (gdk_x11_xatom_to_atom (xatom)); } gboolean |