📄 gdkproperty-x11.c
字号:
GdkAtomgdk_atom_intern (const gchar *atom_name, gboolean only_if_exists){ 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, g_strdup (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 G_CONST_RETURN char *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_atom_name (GdkAtom atom){ return g_strdup (get_atom_name (atom));}/** * gdk_x11_get_xatom_by_name_for_display: * @display: a #GdkDisplay * @atom_name: a string * * Returns the X atom for a #GdkDisplay corresponding to @atom_name. * This function caches the result, so if called repeatedly it is much * faster than XInternAtom(), which is a round trip to the server each time. * * Return value: a X atom for a #GdkDisplay * * Since: 2.2 **/Atomgdk_x11_get_xatom_by_name_for_display (GdkDisplay *display, const gchar *atom_name){ g_return_val_if_fail (GDK_IS_DISPLAY (display), None); return gdk_x11_atom_to_xatom_for_display (display, gdk_atom_intern (atom_name, FALSE));}/** * gdk_x11_get_xatom_by_name: * @atom_name: a string * * Returns the X atom for GDK's default display corresponding to @atom_name. * This function caches the result, so if called repeatedly it is much * faster than XInternAtom(), which is a round trip to the server each time. * * Return value: a X atom for GDK's default display. **/Atomgdk_x11_get_xatom_by_name (const gchar *atom_name){ return gdk_x11_get_xatom_by_name_for_display (gdk_display_get_default (), atom_name);}/** * gdk_x11_get_xatom_name_for_display: * @display: the #GdkDisplay where @xatom is defined * @xatom: an X atom * * Returns the name of an X atom for its display. This * function is meant mainly for debugging, so for convenience, unlike * XAtomName() and gdk_atom_name(), the result doesn't need to * be freed. * * Return value: name of the X atom; this string is owned by GDK, * so it shouldn't be modifed or freed. * * Since: 2.2 **/G_CONST_RETURN gchar *gdk_x11_get_xatom_name_for_display (GdkDisplay *display, Atom xatom){ g_return_val_if_fail (GDK_IS_DISPLAY (display), NULL); return get_atom_name (gdk_x11_xatom_to_atom_for_display (display, xatom));}/** * gdk_x11_get_xatom_name: * @xatom: an X atom for GDK's default display * * Returns the name of an X atom for GDK's default display. This * function is meant mainly for debugging, so for convenience, unlike * <function>XAtomName()</function> and gdk_atom_name(), the result * doesn't need to be freed. Also, this function will never return %NULL, * even if @xatom is invalid. * * Return value: name of the X atom; this string is owned by GTK+, * so it shouldn't be modifed or freed. **/G_CONST_RETURN gchar *gdk_x11_get_xatom_name (Atom xatom){ return get_atom_name (gdk_x11_xatom_to_atom (xatom));}gbooleangdk_property_get (GdkWindow *window, GdkAtom property, GdkAtom type, gulong offset, gulong length, gint pdelete, GdkAtom *actual_property_type, gint *actual_format_type, gint *actual_length, guchar **data){ GdkDisplay *display; Atom ret_prop_type; gint ret_format; gulong ret_nitems; gulong ret_bytes_after; gulong get_length; gulong ret_length; guchar *ret_data; Atom xproperty; Atom xtype; int res; g_return_val_if_fail (!window || GDK_IS_WINDOW (window), FALSE); if (!window) { GdkScreen *screen = gdk_screen_get_default (); window = gdk_screen_get_root_window (screen); GDK_NOTE (MULTIHEAD, g_message ("gdk_property_get(): window is NULL\n")); } if (GDK_WINDOW_DESTROYED (window)) return FALSE; display = gdk_drawable_get_display (window); xproperty = gdk_x11_atom_to_xatom_for_display (display, property); if (type == GDK_NONE) xtype = AnyPropertyType; else xtype = gdk_x11_atom_to_xatom_for_display (display, type); ret_data = NULL; /* * Round up length to next 4 byte value. Some code is in the (bad?) * habit of passing G_MAXLONG as the length argument, causing an * overflow to negative on the add. In this case, we clamp the * value to G_MAXLONG. */ get_length = length + 3; if (get_length > G_MAXLONG) { g_warning ("gdk_property_get(): length value has wrapped in calculation " "(did you pass G_MAXLONG?)"); get_length = G_MAXLONG; } /* To fail, either the user passed 0 or G_MAXULONG */ get_length = get_length / 4; if (get_length == 0) { g_warning ("gdk_propery-get(): invalid length 0"); return FALSE; } res = XGetWindowProperty (GDK_DISPLAY_XDISPLAY (display), GDK_WINDOW_XWINDOW (window), xproperty, offset, get_length, pdelete, xtype, &ret_prop_type, &ret_format, &ret_nitems, &ret_bytes_after, &ret_data); if (res != Success || (ret_prop_type == None && ret_format == 0)) { return FALSE; } if (actual_property_type) *actual_property_type = gdk_x11_xatom_to_atom_for_display (display, ret_prop_type); if (actual_format_type) *actual_format_type = ret_format; if ((xtype != AnyPropertyType) && (ret_prop_type != xtype)) { XFree (ret_data); g_warning ("Couldn't match property type %s to %s\n", gdk_x11_get_xatom_name_for_display (display, ret_prop_type), gdk_x11_get_xatom_name_for_display (display, xtype)); return FALSE; } /* FIXME: ignoring bytes_after could have very bad effects */ if (data) { if (ret_prop_type == XA_ATOM || ret_prop_type == gdk_x11_get_xatom_by_name_for_display (display, "ATOM_PAIR")) { /* * data is an array of X atom, we need to convert it * to an array of GDK Atoms */ gint i; GdkAtom *ret_atoms = g_new (GdkAtom, ret_nitems); Atom *xatoms = (Atom *)ret_data; *data = (guchar *)ret_atoms; for (i = 0; i < ret_nitems; i++) ret_atoms[i] = gdk_x11_xatom_to_atom_for_display (display, xatoms[i]); if (actual_length) *actual_length = ret_nitems * sizeof (GdkAtom); } else { switch (ret_format) { case 8: ret_length = ret_nitems; break; case 16: ret_length = sizeof(short) * ret_nitems; break; case 32: ret_length = sizeof(long) * ret_nitems; break; default: g_warning ("unknown property return format: %d", ret_format); XFree (ret_data); return FALSE; } *data = g_new (guchar, ret_length); memcpy (*data, ret_data, ret_length); if (actual_length) *actual_length = ret_length; } } XFree (ret_data); return TRUE;}voidgdk_property_change (GdkWindow *window, GdkAtom property, GdkAtom type, gint format, GdkPropMode mode, const guchar *data, gint nelements){ GdkDisplay *display; Window xwindow; Atom xproperty; Atom xtype; g_return_if_fail (!window || GDK_IS_WINDOW (window)); if (!window) { GdkScreen *screen; screen = gdk_screen_get_default (); window = gdk_screen_get_root_window (screen); GDK_NOTE (MULTIHEAD, g_message ("gdk_property_change(): window is NULL\n")); } if (GDK_WINDOW_DESTROYED (window)) return; display = gdk_drawable_get_display (window); xproperty = gdk_x11_atom_to_xatom_for_display (display, property); xtype = gdk_x11_atom_to_xatom_for_display (display, type); xwindow = GDK_WINDOW_XID (window); if (xtype == XA_ATOM || xtype == gdk_x11_get_xatom_by_name_for_display (display, "ATOM_PAIR")) { /* * data is an array of GdkAtom, we need to convert it * to an array of X Atoms */ gint i; GdkAtom *atoms = (GdkAtom*) data; Atom *xatoms; xatoms = g_new (Atom, nelements); for (i = 0; i < nelements; i++) xatoms[i] = gdk_x11_atom_to_xatom_for_display (display, atoms[i]); XChangeProperty (GDK_DISPLAY_XDISPLAY (display), xwindow, xproperty, xtype, format, mode, (guchar *)xatoms, nelements); g_free (xatoms); } else XChangeProperty (GDK_DISPLAY_XDISPLAY (display), xwindow, xproperty, xtype, format, mode, (guchar *)data, nelements);}voidgdk_property_delete (GdkWindow *window, GdkAtom property){ g_return_if_fail (!window || GDK_IS_WINDOW (window)); if (!window) { GdkScreen *screen = gdk_screen_get_default (); window = gdk_screen_get_root_window (screen); GDK_NOTE (MULTIHEAD, g_message ("gdk_property_delete(): window is NULL\n")); } if (GDK_WINDOW_DESTROYED (window)) return; XDeleteProperty (GDK_WINDOW_XDISPLAY (window), GDK_WINDOW_XWINDOW (window), gdk_x11_atom_to_xatom_for_display (GDK_WINDOW_DISPLAY (window), property));}#define __GDK_PROPERTY_X11_C__#include "gdkaliasdef.c"
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -