aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorwiktor w brodlo <wiktor@brodlo.net>2011-06-15 16:59:54 +0000
committerwiktor w brodlo <wiktor@brodlo.net>2011-06-15 16:59:54 +0000
commit2590d96369d0217e31dc2812690dde61dac417b5 (patch)
tree82276f787b08a28548e342c7921486f1acefab9f /xutils.c
parentfirst commit (diff)
downloadanaconda-2590d96369d0217e31dc2812690dde61dac417b5.tar.gz
anaconda-2590d96369d0217e31dc2812690dde61dac417b5.tar.bz2
anaconda-2590d96369d0217e31dc2812690dde61dac417b5.zip
Initial import from Sabayon (ver 0.9.9.56)
Diffstat (limited to 'xutils.c')
-rw-r--r--xutils.c268
1 files changed, 268 insertions, 0 deletions
diff --git a/xutils.c b/xutils.c
new file mode 100644
index 0000000..372ffca
--- /dev/null
+++ b/xutils.c
@@ -0,0 +1,268 @@
+/*
+ * xutils.c - a Python wrapper for common Xlib ops
+ *
+ * Copyright (C) 2002 Red Hat, Inc. All rights reserved.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program 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 General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ *
+ * Author(s): Michael Fulbright <msf@redhat.com>
+ */
+
+#include <Python.h>
+#include <X11/Xlib.h>
+#include <X11/Xatom.h>
+#include <gdk/gdkx.h>
+
+static PyObject * setRootResource(PyObject * s, PyObject * args);
+static PyObject * getXatom(PyObject *s, PyObject *args);
+
+
+static PyMethodDef xutilsMethods[] = {
+ { "setRootResource", setRootResource, 1, NULL },
+ { "getXatom", getXatom, 1, NULL },
+ { NULL, NULL, 0, NULL }
+};
+
+typedef struct _Resource {
+ char *key, *val;
+} Resource;
+
+static int
+openDisplay(Display **dpy, Window *root)
+{
+ int scrn;
+
+ *dpy=XOpenDisplay("");
+ if (!*dpy)
+ return -1;
+
+ scrn=DefaultScreen(*dpy);
+ *root = RootWindow(*dpy, scrn);
+ return 0;
+}
+
+static void
+closeDisplay(Display *dpy)
+{
+ XCloseDisplay(dpy);
+}
+
+static Resource **
+getCurrentResources(Display *dpy)
+{
+ char *resource_string, *p;
+ Resource **rc;
+ int nrec;
+
+ /* read through current resources, split on newlines */
+ resource_string = XResourceManagerString(dpy);
+
+ if (!resource_string)
+ return NULL;
+
+ rc = (Resource **)malloc(sizeof(Resource *));
+ p = resource_string;
+ nrec = 0;
+ while (1) {
+ char *eol;
+ char *sep;
+ int nleft;
+
+ /* find next newline, defines end of current record */
+ eol = strchr(p, '\n');
+
+ if (!eol)
+ break;
+
+ /* find colon separating key and value */
+ /* if no colon skip this record */
+ sep = strchr(p, ':');
+ if (sep) {
+ int len;
+ Resource *newrec;
+
+ newrec = (Resource *) malloc(sizeof(Resource));
+
+ len = sep - p + 1;
+ newrec->key = (char *) malloc(len*sizeof(char));
+ memcpy(newrec->key, p, len);
+ newrec->key[len-1] = '\0';
+
+ len = eol - sep;
+ newrec->val = (char *) malloc(len*sizeof(char));
+ memcpy(newrec->val, sep+1, len);
+ newrec->val[len-1] = '\0';
+
+ rc = (Resource **) realloc(rc, (nrec+1) * sizeof(Resource *));
+ rc[nrec] = newrec;
+ nrec = nrec + 1;
+ }
+
+ nleft = strlen(resource_string) - (eol-resource_string);
+ if (nleft <= 0)
+ break;
+
+ p = eol + 1;
+ }
+
+ if (nrec > 0) {
+ rc = (Resource **) realloc(rc, (nrec+1) * sizeof(Resource *));
+ rc[nrec] = NULL;
+ } else {
+ rc = NULL;
+ }
+
+ return rc;
+}
+
+static void
+freeResources(Resource **rc)
+{
+ int idx;
+
+ if (!rc)
+ return;
+
+ idx = 0;
+ while (rc[idx]) {
+ free(rc[idx]->key);
+ free(rc[idx]->val);
+ free(rc[idx]);
+
+ idx++;
+ }
+
+ free(rc);
+}
+
+static PyObject *
+setRootResource(PyObject *s, PyObject *args)
+{
+ Display *dpy;
+ Window root;
+ Resource **resources, **p;
+ char *key, *val, *rstring;
+ int fnd, nrec;
+
+ if (!PyArg_ParseTuple(args, "ss", &key, &val)) {
+ return NULL;
+ }
+
+ if (openDisplay(&dpy, &root) < 0) {
+ PyErr_SetString(PyExc_SystemError, "Could not open display.");
+ return NULL;
+ }
+
+ resources = getCurrentResources(dpy);
+ fnd = 0;
+ nrec = 0;
+ if (resources) {
+ p = resources;
+ while (*p) {
+ if (!strcmp(key, (*p)->key)) {
+ free((*p)->val);
+ (*p)->val = strdup(val);
+ fnd = 1;
+ break;
+ }
+
+ p++;
+ }
+
+ p = resources;
+ while (*p) {
+ nrec++;
+ p++;
+ }
+ }
+
+ if (!fnd) {
+ Resource *newrec;
+
+ newrec = (Resource *) malloc(sizeof(Resource));
+ newrec->key = strdup(key);
+ newrec->val = strdup(val);
+
+ if (nrec > 0)
+ resources = (Resource **) realloc(resources, (nrec+2) * sizeof(Resource *));
+ else
+ resources = (Resource **) malloc(2*sizeof(Resource *));
+
+ resources[nrec] = newrec;
+ resources[nrec+1] = NULL;
+ }
+
+ rstring = NULL;
+ p = resources;
+ while (*p) {
+ int len;
+ char *tmpstr;
+
+ len = strlen((*p)->key) + strlen((*p)->val) + 3;
+ tmpstr = (char *) malloc(len*sizeof(char));
+ strcpy(tmpstr, (*p)->key);
+ strcat(tmpstr, ":");
+ strcat(tmpstr, (*p)->val);
+ strcat(tmpstr, "\n");
+
+ if (rstring) {
+ rstring = (char *)realloc(rstring, (strlen(rstring)+len+1)*sizeof(char));
+ strcat(rstring, tmpstr);
+ } else {
+ rstring = tmpstr;
+ }
+
+ p++;
+ }
+
+ XChangeProperty(dpy, root, XA_RESOURCE_MANAGER, XA_STRING,
+ 8, PropModeReplace, (unsigned char *)rstring,
+ strlen(rstring));
+
+ free(rstring);
+ freeResources(resources);
+
+ closeDisplay(dpy);
+
+ Py_INCREF(Py_None);
+ return Py_None;
+}
+
+/* this assumes you've already imported gtk and thus have a display */
+static PyObject *
+getXatom(PyObject *s, PyObject *args)
+{
+ char *atomname;
+ Atom theatom;
+
+ if (!PyArg_ParseTuple(args, "s", &atomname)) {
+ return NULL;
+ }
+
+ theatom = gdk_x11_get_xatom_by_name(atomname);
+ if (XGetSelectionOwner (GDK_DISPLAY(), theatom) != None) {
+ Py_INCREF(Py_True);
+ return Py_True;
+ }
+ Py_INCREF(Py_False);
+ return Py_False;
+}
+
+void
+initxutils ()
+{
+ PyObject * d;
+
+ d = Py_InitModule ("xutils", xutilsMethods);
+}