diff options
author | Colin Guthrie <cguthrie@mandriva.org> | 2010-05-29 19:33:54 +0100 |
---|---|---|
committer | Colin Guthrie <cguthrie@mandriva.org> | 2010-08-15 21:41:52 +0100 |
commit | 2b88634671d1b745b1364e9cf4827e30a5ff2a6e (patch) | |
tree | eb453f9e6c9eb70fb34a8483aca9ab8e72b7cb26 /src/pulsecore/x11prop.c | |
parent | 4a1072e0bcce9165a262dc76a12baa2680caa0e3 (diff) |
x11: Partially convert to XCB.
This commit mostly converts the X11 handling to XCB. There are still
some uses of XLib to deal with the X11 session handling modules, however all
client-side code should now be free of XLib and thus this should fix Bug #799
Diffstat (limited to 'src/pulsecore/x11prop.c')
-rw-r--r-- | src/pulsecore/x11prop.c | 55 |
1 files changed, 34 insertions, 21 deletions
diff --git a/src/pulsecore/x11prop.c b/src/pulsecore/x11prop.c index 873a76e7..cc5987a8 100644 --- a/src/pulsecore/x11prop.c +++ b/src/pulsecore/x11prop.c @@ -25,45 +25,58 @@ #include <string.h> -#include <X11/Xlib.h> -#include <X11/Xatom.h> - #include "x11prop.h" -void pa_x11_set_prop(Display *d, const char *name, const char *data) { - Atom a = XInternAtom(d, name, False); - XChangeProperty(d, RootWindow(d, 0), a, XA_STRING, 8, PropModeReplace, (const unsigned char*) data, (int) (strlen(data)+1)); +#include <xcb/xproto.h> +#include <xcb/xcb_atom.h> + +#define PA_XCB_FORMAT 8 + +void pa_x11_set_prop(xcb_connection_t *xcb, const char *name, const char *data) { + xcb_screen_t *screen; + xcb_atom_t a = xcb_atom_get(xcb, name); + screen = xcb_setup_roots_iterator(xcb_get_setup(xcb)).data; + xcb_change_property(xcb, XCB_PROP_MODE_REPLACE, screen->root, a, STRING, PA_XCB_FORMAT, (int) strlen(data), (const void*) data); } -void pa_x11_del_prop(Display *d, const char *name) { - Atom a = XInternAtom(d, name, False); - XDeleteProperty(d, RootWindow(d, 0), a); +void pa_x11_del_prop(xcb_connection_t *xcb, const char *name) { + xcb_screen_t *screen; + xcb_atom_t a = xcb_atom_get(xcb, name); + screen = xcb_setup_roots_iterator(xcb_get_setup(xcb)).data; + xcb_delete_property(xcb, screen->root, a); } -char* pa_x11_get_prop(Display *d, const char *name, char *p, size_t l) { - Atom actual_type; - int actual_format; - unsigned long nitems; - unsigned long nbytes_after; - unsigned char *prop = NULL; +char* pa_x11_get_prop(xcb_connection_t *xcb, const char *name, char *p, size_t l) { char *ret = NULL; + int len; + xcb_get_property_cookie_t req; + xcb_get_property_reply_t* prop = NULL; + xcb_screen_t *screen; + xcb_atom_t a = xcb_atom_get(xcb, name); + screen = xcb_setup_roots_iterator(xcb_get_setup(xcb)).data; + + req = xcb_get_property(xcb, 0, screen->root, a, STRING, 0, (uint32_t)(l-1)); + prop = xcb_get_property_reply(xcb, req, NULL); + + if (!prop) + goto finish; - Atom a = XInternAtom(d, name, False); - if (XGetWindowProperty(d, RootWindow(d, 0), a, 0, (long) ((l+2)/4), False, XA_STRING, &actual_type, &actual_format, &nitems, &nbytes_after, &prop) != Success) + if (PA_XCB_FORMAT != prop->format) goto finish; - if (actual_type != XA_STRING) + len = xcb_get_property_value_length(prop); + if (len < 1 || len >= (int)l) goto finish; - memcpy(p, prop, nitems); - p[nitems] = 0; + memcpy(p, xcb_get_property_value(prop), len); + p[len] = 0; ret = p; finish: if (prop) - XFree(prop); + free(prop); return ret; } |