diff options
Diffstat (limited to 'src/pulse/client-conf-x11.c')
| -rw-r--r-- | src/pulse/client-conf-x11.c | 69 |
1 files changed, 47 insertions, 22 deletions
diff --git a/src/pulse/client-conf-x11.c b/src/pulse/client-conf-x11.c index e4a90017..76b1b7b3 100644 --- a/src/pulse/client-conf-x11.c +++ b/src/pulse/client-conf-x11.c @@ -1,11 +1,11 @@ -/* $Id$ */ - /*** This file is part of PulseAudio. + Copyright 2004-2006 Lennart Poettering + PulseAudio is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published - by the Free Software Foundation; either version 2 of the License, + by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. PulseAudio is distributed in the hope that it will be useful, but @@ -24,59 +24,84 @@ #endif #include <string.h> -#include <assert.h> -#include <X11/Xlib.h> -#include <X11/Xatom.h> +#include <xcb/xcb.h> #include <pulse/xmalloc.h> +#include <pulse/i18n.h> #include <pulsecore/x11prop.h> #include <pulsecore/log.h> #include <pulsecore/core-util.h> +#include <pulsecore/macro.h> #include "client-conf-x11.h" int pa_client_conf_from_x11(pa_client_conf *c, const char *dname) { - Display *d = NULL; - int ret = -1; + xcb_connection_t *xcb = NULL; + int ret = -1, screen = 0; char t[1024]; - if (!dname && !getenv("DISPLAY")) + pa_assert(c); + + if (!dname && !(dname = getenv("DISPLAY"))) + goto finish; + + if (*dname == 0) goto finish; - - if (!(d = XOpenDisplay(dname))) { - pa_log(__FILE__": 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 (xcb_connection_has_error(xcb)) { + pa_log(_("xcb_connection_has_error() returned true")); + goto finish; + } + + if (pa_x11_get_prop(xcb, screen, "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(xcb, screen, "PULSE_SESSION_ID", t, sizeof(t))) { + char *id; + + if ((id = pa_session_id())) { + if (pa_streq(t, id)) + disable_autospawn = FALSE; + pa_xfree(id); + } + } + + if (disable_autospawn) + c->autospawn = FALSE; } - if (pa_x11_get_prop(d, "PULSE_SINK", t, sizeof(t))) { + if (pa_x11_get_prop(xcb, screen, "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, screen, "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, screen, "PULSE_COOKIE", t, sizeof(t))) { uint8_t cookie[PA_NATIVE_COOKIE_LENGTH]; if (pa_parsehex(t, cookie, sizeof(cookie)) != sizeof(cookie)) { - pa_log(__FILE__": failed to parse cookie data"); + pa_log(_("Failed to parse cookie data")); goto finish; } - assert(sizeof(cookie) == sizeof(c->cookie)); + pa_assert(sizeof(cookie) == sizeof(c->cookie)); memcpy(c->cookie, cookie, sizeof(cookie)); - c->cookie_valid = 1; + c->cookie_valid = TRUE; pa_xfree(c->cookie_file); c->cookie_file = NULL; @@ -85,9 +110,9 @@ 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; - + } |
