diff options
-rw-r--r-- | configure.ac | 2 | ||||
-rw-r--r-- | src/modules/x11/module-x11-publish.c | 35 | ||||
-rw-r--r-- | src/pulse/client-conf-x11.c | 23 | ||||
-rw-r--r-- | src/pulsecore/x11prop.c | 63 | ||||
-rw-r--r-- | src/pulsecore/x11prop.h | 9 | ||||
-rw-r--r-- | src/pulsecore/x11wrap.c | 4 | ||||
-rw-r--r-- | src/pulsecore/x11wrap.h | 4 | ||||
-rw-r--r-- | src/utils/pax11publish.c | 67 |
8 files changed, 109 insertions, 98 deletions
diff --git a/configure.ac b/configure.ac index a3551f06..5d69c924 100644 --- a/configure.ac +++ b/configure.ac @@ -531,7 +531,7 @@ AC_ARG_ENABLE([x11], [x11=auto]) if test "x${x11}" != xno ; then - PKG_CHECK_MODULES(X11, [ x11 ice sm xtst ], + PKG_CHECK_MODULES(X11, [ x11-xcb ice sm xtst xcb-atom ], HAVE_X11=1, [ HAVE_X11=0 diff --git a/src/modules/x11/module-x11-publish.c b/src/modules/x11/module-x11-publish.c index 7ee1b6da..e811bdf0 100644 --- a/src/modules/x11/module-x11-publish.c +++ b/src/modules/x11/module-x11-publish.c @@ -28,8 +28,7 @@ #include <string.h> #include <unistd.h> -#include <X11/Xlib.h> -#include <X11/Xatom.h> +#include <xcb/xcb.h> #include <pulse/util.h> #include <pulse/xmalloc.h> @@ -92,10 +91,10 @@ static void publish_servers(struct userdata *u, pa_strlist *l) { s = pa_strlist_tostring(l); pa_strlist_reverse(l); - pa_x11_set_prop(pa_x11_wrapper_get_display(u->x11_wrapper), "PULSE_SERVER", s); + pa_x11_set_prop(pa_x11_wrapper_get_xcb_connection(u->x11_wrapper), "PULSE_SERVER", s); pa_xfree(s); } else - pa_x11_del_prop(pa_x11_wrapper_get_display(u->x11_wrapper), "PULSE_SERVER"); + pa_x11_del_prop(pa_x11_wrapper_get_xcb_connection(u->x11_wrapper), "PULSE_SERVER"); } static pa_hook_result_t servers_changed_cb(void *hook_data, void *call_data, void *slot_data) { @@ -105,7 +104,7 @@ static pa_hook_result_t servers_changed_cb(void *hook_data, void *call_data, voi pa_assert(u); - if (!pa_x11_get_prop(pa_x11_wrapper_get_display(u->x11_wrapper), "PULSE_ID", t, sizeof(t)) || strcmp(t, u->id)) { + if (!pa_x11_get_prop(pa_x11_wrapper_get_xcb_connection(u->x11_wrapper), "PULSE_ID", t, sizeof(t)) || strcmp(t, u->id)) { pa_log_warn("PulseAudio information vanished from X11!"); return PA_HOOK_OK; } @@ -168,22 +167,22 @@ int pa__init(pa_module*m) { u->id = pa_sprintf_malloc("%lu@%s/%lu", (unsigned long) getuid(), mid, (unsigned long) getpid()); pa_xfree(mid); - pa_x11_set_prop(pa_x11_wrapper_get_display(u->x11_wrapper), "PULSE_ID", u->id); + pa_x11_set_prop(pa_x11_wrapper_get_xcb_connection(u->x11_wrapper), "PULSE_ID", u->id); if ((sid = pa_session_id())) { - pa_x11_set_prop(pa_x11_wrapper_get_display(u->x11_wrapper), "PULSE_SESSION_ID", sid); + pa_x11_set_prop(pa_x11_wrapper_get_xcb_connection(u->x11_wrapper), "PULSE_SESSION_ID", sid); pa_xfree(sid); } publish_servers(u, pa_native_protocol_servers(u->protocol)); if ((t = pa_modargs_get_value(ma, "source", NULL))) - pa_x11_set_prop(pa_x11_wrapper_get_display(u->x11_wrapper), "PULSE_SOURCE", t); + pa_x11_set_prop(pa_x11_wrapper_get_xcb_connection(u->x11_wrapper), "PULSE_SOURCE", t); if ((t = pa_modargs_get_value(ma, "sink", NULL))) - pa_x11_set_prop(pa_x11_wrapper_get_display(u->x11_wrapper), "PULSE_SINK", t); + pa_x11_set_prop(pa_x11_wrapper_get_xcb_connection(u->x11_wrapper), "PULSE_SINK", t); - pa_x11_set_prop(pa_x11_wrapper_get_display(u->x11_wrapper), "PULSE_COOKIE", + pa_x11_set_prop(pa_x11_wrapper_get_xcb_connection(u->x11_wrapper), "PULSE_COOKIE", pa_hexstr(pa_auth_cookie_read(u->auth_cookie, PA_NATIVE_COOKIE_LENGTH), PA_NATIVE_COOKIE_LENGTH, hx, sizeof(hx))); u->x11_client = pa_x11_client_new(u->x11_wrapper, NULL, x11_kill_cb, u); @@ -216,16 +215,16 @@ void pa__done(pa_module*m) { char t[256]; /* Yes, here is a race condition */ - if (!pa_x11_get_prop(pa_x11_wrapper_get_display(u->x11_wrapper), "PULSE_ID", t, sizeof(t)) || strcmp(t, u->id)) + if (!pa_x11_get_prop(pa_x11_wrapper_get_xcb_connection(u->x11_wrapper), "PULSE_ID", t, sizeof(t)) || strcmp(t, u->id)) pa_log_warn("PulseAudio information vanished from X11!"); else { - pa_x11_del_prop(pa_x11_wrapper_get_display(u->x11_wrapper), "PULSE_ID"); - pa_x11_del_prop(pa_x11_wrapper_get_display(u->x11_wrapper), "PULSE_SERVER"); - pa_x11_del_prop(pa_x11_wrapper_get_display(u->x11_wrapper), "PULSE_SINK"); - pa_x11_del_prop(pa_x11_wrapper_get_display(u->x11_wrapper), "PULSE_SOURCE"); - pa_x11_del_prop(pa_x11_wrapper_get_display(u->x11_wrapper), "PULSE_COOKIE"); - pa_x11_del_prop(pa_x11_wrapper_get_display(u->x11_wrapper), "PULSE_SESSION_ID"); - XSync(pa_x11_wrapper_get_display(u->x11_wrapper), False); + pa_x11_del_prop(pa_x11_wrapper_get_xcb_connection(u->x11_wrapper), "PULSE_ID"); + pa_x11_del_prop(pa_x11_wrapper_get_xcb_connection(u->x11_wrapper), "PULSE_SERVER"); + pa_x11_del_prop(pa_x11_wrapper_get_xcb_connection(u->x11_wrapper), "PULSE_SINK"); + pa_x11_del_prop(pa_x11_wrapper_get_xcb_connection(u->x11_wrapper), "PULSE_SOURCE"); + pa_x11_del_prop(pa_x11_wrapper_get_xcb_connection(u->x11_wrapper), "PULSE_COOKIE"); + pa_x11_del_prop(pa_x11_wrapper_get_xcb_connection(u->x11_wrapper), "PULSE_SESSION_ID"); + xcb_flush(pa_x11_wrapper_get_xcb_connection(u->x11_wrapper)); } pa_x11_wrapper_unref(u->x11_wrapper); diff --git a/src/pulse/client-conf-x11.c b/src/pulse/client-conf-x11.c index 4970363b..565f997d 100644 --- a/src/pulse/client-conf-x11.c +++ b/src/pulse/client-conf-x11.c @@ -25,8 +25,7 @@ #include <string.h> -#include <X11/Xlib.h> -#include <X11/Xatom.h> +#include <xcb/xcb.h> #include <pulse/xmalloc.h> #include <pulse/i18n.h> @@ -39,7 +38,7 @@ #include "client-conf-x11.h" int pa_client_conf_from_x11(pa_client_conf *c, const char *dname) { - Display *d = NULL; + xcb_connection_t *xcb = NULL; int ret = -1; char t[1024]; @@ -51,18 +50,18 @@ int pa_client_conf_from_x11(pa_client_conf *c, const char *dname) { if (*dname == 0) goto finish; - if (!(d = XOpenDisplay(dname))) { - pa_log(_("XOpenDisplay() failed")); + if (!(xcb = xcb_connect(dname, NULL))) { + pa_log(_("xcb_connect() failed")); goto finish; } - if (pa_x11_get_prop(d, "PULSE_SERVER", t, sizeof(t))) { + if (pa_x11_get_prop(xcb, "PULSE_SERVER", t, sizeof(t))) { pa_bool_t disable_autospawn = TRUE; pa_xfree(c->default_server); c->default_server = pa_xstrdup(t); - if (pa_x11_get_prop(d, "PULSE_SESSION_ID", t, sizeof(t))) { + if (pa_x11_get_prop(xcb, "PULSE_SESSION_ID", t, sizeof(t))) { char *id; if ((id = pa_session_id())) { @@ -76,17 +75,17 @@ int pa_client_conf_from_x11(pa_client_conf *c, const char *dname) { c->autospawn = FALSE; } - if (pa_x11_get_prop(d, "PULSE_SINK", t, sizeof(t))) { + if (pa_x11_get_prop(xcb, "PULSE_SINK", t, sizeof(t))) { pa_xfree(c->default_sink); c->default_sink = pa_xstrdup(t); } - if (pa_x11_get_prop(d, "PULSE_SOURCE", t, sizeof(t))) { + if (pa_x11_get_prop(xcb, "PULSE_SOURCE", t, sizeof(t))) { pa_xfree(c->default_source); c->default_source = pa_xstrdup(t); } - if (pa_x11_get_prop(d, "PULSE_COOKIE", t, sizeof(t))) { + if (pa_x11_get_prop(xcb, "PULSE_COOKIE", t, sizeof(t))) { uint8_t cookie[PA_NATIVE_COOKIE_LENGTH]; if (pa_parsehex(t, cookie, sizeof(cookie)) != sizeof(cookie)) { @@ -106,8 +105,8 @@ int pa_client_conf_from_x11(pa_client_conf *c, const char *dname) { ret = 0; finish: - if (d) - XCloseDisplay(d); + if (xcb) + xcb_disconnect(xcb); return ret; diff --git a/src/pulsecore/x11prop.c b/src/pulsecore/x11prop.c index dc8ec294..cc5987a8 100644 --- a/src/pulsecore/x11prop.c +++ b/src/pulsecore/x11prop.c @@ -25,53 +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, DefaultRootWindow(d), 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, DefaultRootWindow(d), 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 window_ret; + 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; - Atom a = XInternAtom(d, name, False); + req = xcb_get_property(xcb, 0, screen->root, a, STRING, 0, (uint32_t)(l-1)); + prop = xcb_get_property_reply(xcb, req, NULL); - window_ret = XGetWindowProperty(d, DefaultRootWindow(d), a, 0, (long) ((l+2)/4), False, XA_STRING, &actual_type, &actual_format, &nitems, &nbytes_after, &prop); + if (!prop) + goto finish; - if (window_ret != Success || actual_type != XA_STRING) { - if (DefaultScreen(d) != 0) { - window_ret = XGetWindowProperty(d, RootWindow(d, 0), a, 0, (long) ((l+2)/4), False, XA_STRING, &actual_type, &actual_format, &nitems, &nbytes_after, &prop); + if (PA_XCB_FORMAT != prop->format) + goto finish; - if (window_ret != Success || actual_type != XA_STRING) - goto finish; - } else - goto finish; - } + 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; } diff --git a/src/pulsecore/x11prop.h b/src/pulsecore/x11prop.h index dc675263..74922615 100644 --- a/src/pulsecore/x11prop.h +++ b/src/pulsecore/x11prop.h @@ -5,6 +5,7 @@ This file is part of PulseAudio. Copyright 2004-2006 Lennart Poettering + Copyright 2010 Colin Guthrie PulseAudio is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published @@ -24,10 +25,10 @@ #include <sys/types.h> -#include <X11/Xlib.h> +#include <xcb/xcb.h> -void pa_x11_set_prop(Display *d, const char *name, const char *data); -void pa_x11_del_prop(Display *d, const char *name); -char* pa_x11_get_prop(Display *d, const char *name, char *p, size_t l); +void pa_x11_set_prop(xcb_connection_t *xcb, const char *name, const char *data); +void pa_x11_del_prop(xcb_connection_t *xcb, const char *name); +char* pa_x11_get_prop(xcb_connection_t *xcb, const char *name, char *p, size_t l); #endif diff --git a/src/pulsecore/x11wrap.c b/src/pulsecore/x11wrap.c index 1960a12f..454507ae 100644 --- a/src/pulsecore/x11wrap.c +++ b/src/pulsecore/x11wrap.c @@ -259,6 +259,10 @@ Display *pa_x11_wrapper_get_display(pa_x11_wrapper *w) { return w->display; } +xcb_connection_t *pa_x11_wrapper_get_xcb_connection(pa_x11_wrapper *w) { + return XGetXCBConnection(pa_x11_wrapper_get_display(w)); +} + void pa_x11_wrapper_kill(pa_x11_wrapper *w) { pa_x11_client *c, *n; diff --git a/src/pulsecore/x11wrap.h b/src/pulsecore/x11wrap.h index b57541f2..fc2e01fe 100644 --- a/src/pulsecore/x11wrap.h +++ b/src/pulsecore/x11wrap.h @@ -23,6 +23,7 @@ ***/ #include <X11/Xlib.h> +#include <X11/Xlib-xcb.h> #include <pulsecore/core.h> @@ -46,6 +47,9 @@ void pa_x11_wrapper_unref(pa_x11_wrapper* w); /* Return the X11 display object for this connection */ Display *pa_x11_wrapper_get_display(pa_x11_wrapper *w); +/* Return the XCB connection object for this connection */ +xcb_connection_t *pa_x11_wrapper_get_xcb_connection(pa_x11_wrapper *w); + /* Kill the connection to the X11 display */ void pa_x11_wrapper_kill(pa_x11_wrapper *w); diff --git a/src/utils/pax11publish.c b/src/utils/pax11publish.c index a9eb329f..111bee23 100644 --- a/src/utils/pax11publish.c +++ b/src/utils/pax11publish.c @@ -29,8 +29,7 @@ #include <assert.h> #include <locale.h> -#include <X11/Xlib.h> -#include <X11/Xatom.h> +#include <xcb/xcb.h> #include <pulse/util.h> #include <pulse/i18n.h> @@ -46,7 +45,7 @@ int main(int argc, char *argv[]) { const char *dname = NULL, *sink = NULL, *source = NULL, *server = NULL, *cookie_file = PA_NATIVE_COOKIE_FILE; int c, ret = 1; - Display *d = NULL; + xcb_connection_t *xcb = NULL; enum { DUMP, EXPORT, IMPORT, REMOVE } mode = DUMP; setlocale(LC_ALL, ""); @@ -96,21 +95,21 @@ int main(int argc, char *argv[]) { } } - if (!(d = XOpenDisplay(dname))) { - pa_log(_("XOpenDisplay() failed")); + if (!(xcb = xcb_connect(dname, NULL))) { + pa_log(_("xcb_connect() failed")); goto finish; } switch (mode) { case DUMP: { char t[1024]; - if (pa_x11_get_prop(d, "PULSE_SERVER", t, sizeof(t))) + if (pa_x11_get_prop(xcb, "PULSE_SERVER", t, sizeof(t))) printf(_("Server: %s\n"), t); - if (pa_x11_get_prop(d, "PULSE_SOURCE", t, sizeof(t))) + if (pa_x11_get_prop(xcb, "PULSE_SOURCE", t, sizeof(t))) printf(_("Source: %s\n"), t); - if (pa_x11_get_prop(d, "PULSE_SINK", t, sizeof(t))) + if (pa_x11_get_prop(xcb, "PULSE_SINK", t, sizeof(t))) printf(_("Sink: %s\n"), t); - if (pa_x11_get_prop(d, "PULSE_COOKIE", t, sizeof(t))) + if (pa_x11_get_prop(xcb, "PULSE_COOKIE", t, sizeof(t))) printf(_("Cookie: %s\n"), t); break; @@ -118,14 +117,14 @@ int main(int argc, char *argv[]) { case IMPORT: { char t[1024]; - if (pa_x11_get_prop(d, "PULSE_SERVER", t, sizeof(t))) + if (pa_x11_get_prop(xcb, "PULSE_SERVER", t, sizeof(t))) printf("PULSE_SERVER='%s'\nexport PULSE_SERVER\n", t); - if (pa_x11_get_prop(d, "PULSE_SOURCE", t, sizeof(t))) + if (pa_x11_get_prop(xcb, "PULSE_SOURCE", t, sizeof(t))) printf("PULSE_SOURCE='%s'\nexport PULSE_SOURCE\n", t); - if (pa_x11_get_prop(d, "PULSE_SINK", t, sizeof(t))) + if (pa_x11_get_prop(xcb, "PULSE_SINK", t, sizeof(t))) printf("PULSE_SINK='%s'\nexport PULSE_SINK\n", t); - if (pa_x11_get_prop(d, "PULSE_COOKIE", t, sizeof(t))) { + if (pa_x11_get_prop(xcb, "PULSE_COOKIE", t, sizeof(t))) { uint8_t cookie[PA_NATIVE_COOKIE_LENGTH]; size_t l; if ((l = pa_parsehex(t, cookie, sizeof(cookie))) != sizeof(cookie)) { @@ -158,16 +157,16 @@ int main(int argc, char *argv[]) { goto finish; } - pa_x11_del_prop(d, "PULSE_SERVER"); - pa_x11_del_prop(d, "PULSE_SINK"); - pa_x11_del_prop(d, "PULSE_SOURCE"); - pa_x11_del_prop(d, "PULSE_ID"); - pa_x11_del_prop(d, "PULSE_COOKIE"); + pa_x11_del_prop(xcb, "PULSE_SERVER"); + pa_x11_del_prop(xcb, "PULSE_SINK"); + pa_x11_del_prop(xcb, "PULSE_SOURCE"); + pa_x11_del_prop(xcb, "PULSE_ID"); + pa_x11_del_prop(xcb, "PULSE_COOKIE"); if (server) - pa_x11_set_prop(d, "PULSE_SERVER", server); + pa_x11_set_prop(xcb, "PULSE_SERVER", server); else if (conf->default_server) - pa_x11_set_prop(d, "PULSE_SERVER", conf->default_server); + pa_x11_set_prop(xcb, "PULSE_SERVER", conf->default_server); else { char hn[256]; if (!pa_get_fqdn(hn, sizeof(hn))) { @@ -175,18 +174,18 @@ int main(int argc, char *argv[]) { goto finish; } - pa_x11_set_prop(d, "PULSE_SERVER", hn); + pa_x11_set_prop(xcb, "PULSE_SERVER", hn); } if (sink) - pa_x11_set_prop(d, "PULSE_SINK", sink); + pa_x11_set_prop(xcb, "PULSE_SINK", sink); else if (conf->default_sink) - pa_x11_set_prop(d, "PULSE_SINK", conf->default_sink); + pa_x11_set_prop(xcb, "PULSE_SINK", conf->default_sink); if (source) - pa_x11_set_prop(d, "PULSE_SOURCE", source); + pa_x11_set_prop(xcb, "PULSE_SOURCE", source); if (conf->default_source) - pa_x11_set_prop(d, "PULSE_SOURCE", conf->default_source); + pa_x11_set_prop(xcb, "PULSE_SOURCE", conf->default_source); pa_client_conf_free(conf); @@ -195,16 +194,16 @@ int main(int argc, char *argv[]) { goto finish; } - pa_x11_set_prop(d, "PULSE_COOKIE", pa_hexstr(cookie, sizeof(cookie), hx, sizeof(hx))); + pa_x11_set_prop(xcb, "PULSE_COOKIE", pa_hexstr(cookie, sizeof(cookie), hx, sizeof(hx))); break; } case REMOVE: - pa_x11_del_prop(d, "PULSE_SERVER"); - pa_x11_del_prop(d, "PULSE_SINK"); - pa_x11_del_prop(d, "PULSE_SOURCE"); - pa_x11_del_prop(d, "PULSE_ID"); - pa_x11_del_prop(d, "PULSE_COOKIE"); + pa_x11_del_prop(xcb, "PULSE_SERVER"); + pa_x11_del_prop(xcb, "PULSE_SINK"); + pa_x11_del_prop(xcb, "PULSE_SOURCE"); + pa_x11_del_prop(xcb, "PULSE_ID"); + pa_x11_del_prop(xcb, "PULSE_COOKIE"); break; default: @@ -216,9 +215,9 @@ int main(int argc, char *argv[]) { finish: - if (d) { - XSync(d, False); - XCloseDisplay(d); + if (xcb) { + xcb_flush(xcb); + xcb_disconnect(xcb); } return ret; |