1 /***
2 This file is part of PulseAudio.
3
4 Copyright 2004-2006 Lennart Poettering
5
6 PulseAudio is free software; you can redistribute it and/or modify
7 it under the terms of the GNU Lesser General Public License as published
8 by the Free Software Foundation; either version 2.1 of the License,
9 or (at your option) any later version.
10
11 PulseAudio is distributed in the hope that it will be useful, but
12 WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 General Public License for more details.
15
16 You should have received a copy of the GNU Lesser General Public License
17 along with PulseAudio; if not, see <http://www.gnu.org/licenses/>.
18 ***/
19
20 #ifdef HAVE_CONFIG_H
21 #include <config.h>
22 #endif
23
24 #include <string.h>
25
26 #include <xcb/xcb.h>
27
28 #include <pulse/xmalloc.h>
29
30 #include <pulsecore/i18n.h>
31 #include <pulsecore/x11prop.h>
32 #include <pulsecore/log.h>
33 #include <pulsecore/core-util.h>
34 #include <pulsecore/macro.h>
35
36 #include "client-conf-x11.h"
37
pa_client_conf_from_x11(pa_client_conf * c)38 int pa_client_conf_from_x11(pa_client_conf *c) {
39 const char *dname;
40 xcb_connection_t *xcb = NULL;
41 int ret = -1, screen = 0;
42 char t[1024];
43
44 pa_assert(c);
45
46 /* Local connections will have configuration and X root window
47 * properties match 1:1, these paths are only strictly necessary
48 * for remote clients, so check for SSH_CONNECTION to make sure
49 * this is a remote session with X forwarding.
50 */
51 if (!getenv("SSH_CONNECTION"))
52 goto finish;
53
54 if (!(dname = getenv("DISPLAY")))
55 goto finish;
56
57 if (*dname == 0)
58 goto finish;
59
60 if (!(xcb = xcb_connect(dname, NULL))) {
61 pa_log(_("xcb_connect() failed"));
62 goto finish;
63 }
64
65 if (xcb_connection_has_error(xcb)) {
66 pa_log(_("xcb_connection_has_error() returned true"));
67 goto finish;
68 }
69
70 if (pa_x11_get_prop(xcb, screen, "PULSE_SERVER", t, sizeof(t))) {
71 bool disable_autospawn = true;
72
73 pa_xfree(c->default_server);
74 c->default_server = pa_xstrdup(t);
75
76 if (pa_x11_get_prop(xcb, screen, "PULSE_SESSION_ID", t, sizeof(t))) {
77 char *id;
78
79 if ((id = pa_session_id())) {
80 if (pa_streq(t, id))
81 disable_autospawn = false;
82 pa_xfree(id);
83 }
84 }
85
86 if (disable_autospawn)
87 c->autospawn = false;
88 }
89
90 if (pa_x11_get_prop(xcb, screen, "PULSE_SINK", t, sizeof(t))) {
91 pa_xfree(c->default_sink);
92 c->default_sink = pa_xstrdup(t);
93 }
94
95 if (pa_x11_get_prop(xcb, screen, "PULSE_SOURCE", t, sizeof(t))) {
96 pa_xfree(c->default_source);
97 c->default_source = pa_xstrdup(t);
98 }
99
100 if (pa_x11_get_prop(xcb, screen, "PULSE_COOKIE", t, sizeof(t))) {
101 if (pa_parsehex(t, c->cookie_from_x11, sizeof(c->cookie_from_x11)) != sizeof(c->cookie_from_x11)) {
102 pa_log(_("Failed to parse cookie data"));
103 goto finish;
104 }
105
106 c->cookie_from_x11_valid = true;
107 }
108
109 ret = 0;
110
111 finish:
112 if (xcb)
113 xcb_disconnect(xcb);
114
115 return ret;
116
117 }
118