xdnd_actions_initialized = TRUE;
for (i=0; i < xdnd_n_actions; i++)
- xdnd_actions_table[i].atom = gdk_atom_intern (xdnd_actions_table[i].name, FALSE);
+ xdnd_actions_table[i].atom = gdk_atom_intern_static_string (xdnd_actions_table[i].name);
}
static GdkDragAction
gdk_display_add_client_message_filter (
display,
- gdk_atom_intern ("_MOTIF_DRAG_AND_DROP_MESSAGE", FALSE),
+ gdk_atom_intern_static_string ("_MOTIF_DRAG_AND_DROP_MESSAGE"),
motif_dnd_filter, NULL);
for (i = 0; i < G_N_ELEMENTS (xdnd_filters); i++)
{
gdk_display_add_client_message_filter (
display,
- gdk_atom_intern (xdnd_filters[i].atom_name, FALSE),
+ gdk_atom_intern_static_string (xdnd_filters[i].atom_name),
xdnd_filters[i].func, NULL);
}
}
/* GTK+ traditionally has used application/x-rootwin-drop,
* but the XDND spec specifies x-rootwindow-drop.
*/
- GdkAtom target1 = gdk_atom_intern ("application/x-rootwindow-drop", FALSE);
- GdkAtom target2 = gdk_atom_intern ("application/x-rootwin-drop", FALSE);
+ GdkAtom target1 = gdk_atom_intern_static_string ("application/x-rootwindow-drop");
+ GdkAtom target2 = gdk_atom_intern_static_string ("application/x-rootwin-drop");
if (g_list_find (context->targets,
GDK_ATOM_TO_POINTER (target1)) ||
return gdk_x11_xatom_to_atom_for_display (GDK_DRAWABLE_DISPLAY (context->source_window),
(PRIVATE_DATA (context))->motif_selection);
else if (context->protocol == GDK_DRAG_PROTO_XDND)
- return gdk_atom_intern ("XdndSelection", FALSE);
+ return gdk_atom_intern_static_string ("XdndSelection");
else
return GDK_NONE;
}
n_xatoms = 0;
for (i = 0; i < n_atoms; i++)
{
- GdkAtom atom = gdk_atom_intern (atom_names[i], FALSE);
+ GdkAtom atom = gdk_atom_intern_static_string (atom_names[i]);
if (lookup_cached_xatom (display, atom) == None)
{
atoms[n_xatoms] = atom;
}
}
-GdkAtom
-gdk_atom_intern (const gchar *atom_name,
- gboolean only_if_exists)
+static GdkAtom
+intern_atom (const gchar *atom_name,
+ gboolean dup)
{
GdkAtom result;
{
result = INDEX_TO_ATOM (virtual_atom_array->len);
- g_ptr_array_add (virtual_atom_array, g_strdup (atom_name));
+ g_ptr_array_add (virtual_atom_array, dup ? g_strdup (atom_name) : atom_name);
g_hash_table_insert (virtual_atom_hash,
g_ptr_array_index (virtual_atom_array,
ATOM_TO_INDEX (result)),
return result;
}
+GdkAtom
+gdk_atom_intern (const gchar *atom_name,
+ gboolean only_if_exists)
+{
+ return intern_atom (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: the atom corresponding to @atom_name
+ *
+ * Since: 2.10
+ */
+GdkAtom
+gdk_atom_intern_static_string (const gchar *atom_name)
+{
+ return intern_atom (atom_name, FALSE);
+}
+
static G_CONST_RETURN char *
get_atom_name (GdkAtom atom)
{
return;
if (gdk_x11_screen_supports_net_wm_hint (GDK_WINDOW_SCREEN (window),
- gdk_atom_intern ("_NET_WM_DESKTOP", FALSE)))
+ gdk_atom_intern_static_string ("_NET_WM_DESKTOP")))
{
XEvent xev;
Atom type;
display = GDK_WINDOW_DISPLAY (window);
if (gdk_x11_screen_supports_net_wm_hint (GDK_WINDOW_SCREEN (window),
- gdk_atom_intern ("_NET_ACTIVE_WINDOW", FALSE)))
+ gdk_atom_intern_static_string ("_NET_ACTIVE_WINDOW")))
{
XEvent xev;
if (GDK_WINDOW_IS_MAPPED (window))
gdk_wmspec_change_state (modal, window,
- gdk_atom_intern ("_NET_WM_STATE_MODAL", FALSE),
+ gdk_atom_intern_static_string ("_NET_WM_STATE_MODAL"),
NULL);
}
if (GDK_WINDOW_IS_MAPPED (window))
gdk_wmspec_change_state (skips_taskbar, window,
- gdk_atom_intern ("_NET_WM_STATE_SKIP_TASKBAR", FALSE),
+ gdk_atom_intern_static_string ("_NET_WM_STATE_SKIP_TASKBAR"),
NULL);
}
if (GDK_WINDOW_IS_MAPPED (window))
gdk_wmspec_change_state (skips_pager, window,
- gdk_atom_intern ("_NET_WM_STATE_SKIP_PAGER", FALSE),
+ gdk_atom_intern_static_string ("_NET_WM_STATE_SKIP_PAGER"),
NULL);
}
/* Request stick during viewport scroll */
gdk_wmspec_change_state (TRUE, window,
- gdk_atom_intern ("_NET_WM_STATE_STICKY", FALSE),
+ gdk_atom_intern_static_string ("_NET_WM_STATE_STICKY"),
NULL);
/* Request desktop 0xFFFFFFFF */
/* Request unstick from viewport */
gdk_wmspec_change_state (FALSE, window,
- gdk_atom_intern ("_NET_WM_STATE_STICKY", FALSE),
+ gdk_atom_intern_static_string ("_NET_WM_STATE_STICKY"),
NULL);
/* Get current desktop, then set it; this is a race, but not
if (GDK_WINDOW_IS_MAPPED (window))
gdk_wmspec_change_state (TRUE, window,
- gdk_atom_intern ("_NET_WM_STATE_MAXIMIZED_VERT", FALSE),
- gdk_atom_intern ("_NET_WM_STATE_MAXIMIZED_HORZ", FALSE));
+ gdk_atom_intern_static_string ("_NET_WM_STATE_MAXIMIZED_VERT"),
+ gdk_atom_intern_static_string ("_NET_WM_STATE_MAXIMIZED_HORZ"));
else
gdk_synthesize_window_state (window,
0,
if (GDK_WINDOW_IS_MAPPED (window))
gdk_wmspec_change_state (FALSE, window,
- gdk_atom_intern ("_NET_WM_STATE_MAXIMIZED_VERT", FALSE),
- gdk_atom_intern ("_NET_WM_STATE_MAXIMIZED_HORZ", FALSE));
+ gdk_atom_intern_static_string ("_NET_WM_STATE_MAXIMIZED_VERT"),
+ gdk_atom_intern_static_string ("_NET_WM_STATE_MAXIMIZED_HORZ"));
else
gdk_synthesize_window_state (window,
GDK_WINDOW_STATE_MAXIMIZED,
if (GDK_WINDOW_IS_MAPPED (window))
gdk_wmspec_change_state (TRUE, window,
- gdk_atom_intern ("_NET_WM_STATE_FULLSCREEN", FALSE),
+ gdk_atom_intern_static_string ("_NET_WM_STATE_FULLSCREEN"),
GDK_NONE);
else
if (GDK_WINDOW_IS_MAPPED (window))
gdk_wmspec_change_state (FALSE, window,
- gdk_atom_intern ("_NET_WM_STATE_FULLSCREEN", FALSE),
+ gdk_atom_intern_static_string ("_NET_WM_STATE_FULLSCREEN"),
GDK_NONE);
else
{
if (setting)
gdk_wmspec_change_state (FALSE, window,
- gdk_atom_intern ("_NET_WM_STATE_BELOW", FALSE),
+ gdk_atom_intern_static_string ("_NET_WM_STATE_BELOW"),
GDK_NONE);
gdk_wmspec_change_state (setting, window,
- gdk_atom_intern ("_NET_WM_STATE_ABOVE", FALSE),
+ gdk_atom_intern_static_string ("_NET_WM_STATE_ABOVE"),
GDK_NONE);
}
else
{
if (setting)
gdk_wmspec_change_state (FALSE, window,
- gdk_atom_intern ("_NET_WM_STATE_ABOVE", FALSE),
+ gdk_atom_intern_static_string ("_NET_WM_STATE_ABOVE"),
GDK_NONE);
gdk_wmspec_change_state (setting, window,
- gdk_atom_intern ("_NET_WM_STATE_BELOW", FALSE),
+ gdk_atom_intern_static_string ("_NET_WM_STATE_BELOW"),
GDK_NONE);
}
else
return;
if (gdk_x11_screen_supports_net_wm_hint (GDK_WINDOW_SCREEN (window),
- gdk_atom_intern ("_NET_WM_MOVERESIZE", FALSE)))
+ gdk_atom_intern_static_string ("_NET_WM_MOVERESIZE")))
wmspec_resize_drag (window, edge, button, root_x, root_y, timestamp);
else
emulate_resize_drag (window, edge, button, root_x, root_y, timestamp);
return;
if (gdk_x11_screen_supports_net_wm_hint (GDK_WINDOW_SCREEN (window),
- gdk_atom_intern ("_NET_WM_MOVERESIZE", FALSE)))
+ gdk_atom_intern_static_string ("_NET_WM_MOVERESIZE")))
wmspec_moveresize (window, _NET_WM_MOVERESIZE_MOVE, root_x, root_y,
timestamp);
else