summaryrefslogtreecommitdiffstats
path: root/src/pulse/client-conf-x11.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/pulse/client-conf-x11.c')
-rw-r--r--src/pulse/client-conf-x11.c117
1 files changed, 117 insertions, 0 deletions
diff --git a/src/pulse/client-conf-x11.c b/src/pulse/client-conf-x11.c
new file mode 100644
index 0000000..e0c985e
--- /dev/null
+++ b/src/pulse/client-conf-x11.c
@@ -0,0 +1,117 @@
+/***
+ 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.1 of the License,
+ or (at your option) any later version.
+
+ PulseAudio 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 Lesser General Public License
+ along with PulseAudio; if not, see <http://www.gnu.org/licenses/>.
+***/
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include <string.h>
+
+#include <xcb/xcb.h>
+
+#include <pulse/xmalloc.h>
+
+#include <pulsecore/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;
+ xcb_connection_t *xcb = NULL;
+ int ret = -1, screen = 0;
+ char t[1024];
+
+ pa_assert(c);
+
+ /* Local connections will have configuration and X root window
+ * properties match 1:1, these paths are only strictly necessary
+ * for remote clients, so check for SSH_CONNECTION to make sure
+ * this is a remote session with X forwarding.
+ */
+ if (!getenv("SSH_CONNECTION"))
+ goto finish;
+
+ 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 (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))) {
+ 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(xcb, screen, "PULSE_SINK", t, sizeof(t))) {
+ pa_xfree(c->default_sink);
+ c->default_sink = pa_xstrdup(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(xcb, screen, "PULSE_COOKIE", t, sizeof(t))) {
+ if (pa_parsehex(t, c->cookie_from_x11, sizeof(c->cookie_from_x11)) != sizeof(c->cookie_from_x11)) {
+ pa_log(_("Failed to parse cookie data"));
+ goto finish;
+ }
+
+ c->cookie_from_x11_valid = true;
+ }
+
+ ret = 0;
+
+finish:
+ if (xcb)
+ xcb_disconnect(xcb);
+
+ return ret;
+
+}