1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
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;
}
|