X-Git-Url: https://code.delx.au/pulseaudio/blobdiff_plain/848a4d7487bdce14f8231698666fb24d5397e091..0a583fe0c330d167f52784585afffdd8065a92cd:/src/pulse/client-conf-x11.c diff --git a/src/pulse/client-conf-x11.c b/src/pulse/client-conf-x11.c index e240ba88..b37f8377 100644 --- a/src/pulse/client-conf-x11.c +++ b/src/pulse/client-conf-x11.c @@ -1,5 +1,3 @@ -/* $Id$ */ - /*** This file is part of PulseAudio. @@ -7,7 +5,7 @@ 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 @@ -27,11 +25,11 @@ #include -#include -#include +#include #include +#include #include #include #include @@ -39,58 +37,72 @@ #include "client-conf-x11.h" -int pa_client_conf_from_x11(pa_client_conf *c, const char *dname) { - Display *d = NULL; - int ret = -1; +int pa_client_conf_from_x11(pa_client_conf *c) { + const char *dname; + xcb_connection_t *xcb = NULL; + int ret = -1, screen = 0; char t[1024]; pa_assert(c); - if (!dname && (!(dname = getenv("DISPLAY")) || *dname == '\0')) + if (!(dname = getenv("DISPLAY"))) + goto finish; + + if (*dname == 0) + goto finish; + + if (!(xcb = xcb_connect(dname, NULL))) { + pa_log(_("xcb_connect() failed")); goto finish; + } - if (!(d = XOpenDisplay(dname))) { - pa_log("XOpenDisplay() failed"); + if (xcb_connection_has_error(xcb)) { + pa_log(_("xcb_connection_has_error() returned true")); goto finish; } - if (pa_x11_get_prop(d, "PULSE_SERVER", t, sizeof(t))) { + if (pa_x11_get_prop(xcb, screen, "PULSE_SERVER", t, sizeof(t))) { + bool 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))) { - uint8_t cookie[PA_NATIVE_COOKIE_LENGTH]; - - if (pa_parsehex(t, cookie, sizeof(cookie)) != sizeof(cookie)) { - pa_log("failed to parse cookie data"); + if (pa_x11_get_prop(xcb, screen, "PULSE_COOKIE", t, sizeof(t))) { + if (pa_client_conf_load_cookie_from_hex(c, t) < 0) { + pa_log(_("Failed to parse cookie data")); goto finish; } - - pa_assert(sizeof(cookie) == sizeof(c->cookie)); - memcpy(c->cookie, cookie, sizeof(cookie)); - - c->cookie_valid = 1; - - pa_xfree(c->cookie_file); - c->cookie_file = NULL; } ret = 0; finish: - if (d) - XCloseDisplay(d); + if (xcb) + xcb_disconnect(xcb); return ret;