summaryrefslogtreecommitdiff
path: root/gdk/x11/gdkproperty-x11.c
diff options
context:
space:
mode:
Diffstat (limited to 'gdk/x11/gdkproperty-x11.c')
-rw-r--r--gdk/x11/gdkproperty-x11.c194
1 files changed, 194 insertions, 0 deletions
diff --git a/gdk/x11/gdkproperty-x11.c b/gdk/x11/gdkproperty-x11.c
new file mode 100644
index 0000000000..35d8a50cf1
--- /dev/null
+++ b/gdk/x11/gdkproperty-x11.c
@@ -0,0 +1,194 @@
+/* GDK - The GIMP Drawing Kit
+ * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald
+ *
+ * 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
+ * License along with this library; if not, write to the Free
+ * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+#include <X11/Xlib.h>
+#include <X11/Xatom.h>
+#include <string.h>
+#include "gdk.h"
+#include "gdkprivate.h"
+
+
+GdkAtom
+gdk_atom_intern (const gchar *atom_name,
+ gint only_if_exists)
+{
+ return XInternAtom (gdk_display, atom_name, only_if_exists);
+}
+
+gchar *
+gdk_atom_name (GdkAtom atom)
+{
+ gchar *t;
+ gchar *name;
+
+ /* If this atom doesn't exist, we'll die with an X error unless
+ we take precautions */
+
+ gdk_error_warnings = 0;
+ t = XGetAtomName (gdk_display, atom);
+ gdk_error_warnings = 1;
+
+ if (gdk_error_code == -1)
+ {
+ return NULL;
+ }
+ else
+ {
+ name = g_strdup (t);
+ XFree (t);
+
+ return name;
+ }
+}
+
+gint
+gdk_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)
+{
+ GdkWindowPrivate *private;
+ Display *xdisplay;
+ Window xwindow;
+ Atom ret_prop_type;
+ gint ret_format;
+ gulong ret_nitems;
+ gulong ret_bytes_after;
+ gulong ret_length;
+ guchar *ret_data;
+
+ if (window)
+ {
+ private = (GdkWindowPrivate*) window;
+ xdisplay = private->xdisplay;
+ xwindow = private->xwindow;
+ }
+ else
+ {
+ xdisplay = gdk_display;
+ xwindow = gdk_root_window;
+ }
+
+ XGetWindowProperty (xdisplay, xwindow, property,
+ offset, (length + 3) / 4, pdelete,
+ type, &ret_prop_type, &ret_format,
+ &ret_nitems, &ret_bytes_after,
+ &ret_data);
+
+ if ((ret_prop_type == None) && (ret_format == 0))
+ return FALSE;
+
+ if (actual_property_type)
+ *actual_property_type = ret_prop_type;
+ if (actual_format_type)
+ *actual_format_type = ret_format;
+
+ if (ret_prop_type != property)
+ {
+ XFree (ret_data);
+ return FALSE;
+ }
+
+ /* FIXME: ignoring bytes_after could have very bad effects */
+
+ if (data)
+ {
+ switch (ret_format)
+ {
+ case 8:
+ ret_length = ret_nitems;
+ break;
+ case 16:
+ ret_length = 2 * ret_nitems;
+ break;
+ case 32:
+ ret_length = 4 * 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;
+}
+
+void
+gdk_property_change (GdkWindow *window,
+ GdkAtom property,
+ GdkAtom type,
+ gint format,
+ GdkPropMode mode,
+ guchar *data,
+ gint nelements)
+{
+ GdkWindowPrivate *private;
+ Display *xdisplay;
+ Window xwindow;
+
+ if (window)
+ {
+ private = (GdkWindowPrivate*) window;
+ xdisplay = private->xdisplay;
+ xwindow = private->xwindow;
+ }
+ else
+ {
+ xdisplay = gdk_display;
+ xwindow = gdk_root_window;
+ }
+
+ XChangeProperty (xdisplay, xwindow, property, type,
+ format, mode, data, nelements);
+}
+
+void
+gdk_property_delete (GdkWindow *window,
+ GdkAtom property)
+{
+ GdkWindowPrivate *private;
+ Display *xdisplay;
+ Window xwindow;
+
+ if (window)
+ {
+ private = (GdkWindowPrivate*) window;
+ xdisplay = private->xdisplay;
+ xwindow = private->xwindow;
+ }
+ else
+ {
+ xdisplay = gdk_display;
+ xwindow = gdk_root_window;
+ }
+
+ XDeleteProperty (xdisplay, xwindow, property);
+}