X-Git-Url: https://code.delx.au/pulseaudio/blobdiff_plain/9e79c875a5629f64211dbf33dffb7a6c8abc3cc8..dcd4a73df94b0e9083f72d79f81083961bd15746:/src/pulsecore/proplist-util.c diff --git a/src/pulsecore/proplist-util.c b/src/pulsecore/proplist-util.c index 4d505f57..af5f0aa6 100644 --- a/src/pulsecore/proplist-util.c +++ b/src/pulsecore/proplist-util.c @@ -25,7 +25,16 @@ #include #include +#include +#ifdef __APPLE__ +#include +#define environ (*_NSGetEnviron()) +#elif !HAVE_DECL_ENVIRON +extern char **environ; +#endif + +#include #include #include #include @@ -33,38 +42,122 @@ #include +#if defined(HAVE_GLIB) && defined(PA_GCC_WEAKREF) +#include +static G_CONST_RETURN gchar* _g_get_application_name(void) PA_GCC_WEAKREF(g_get_application_name); +#endif + +#if defined(HAVE_GTK) && defined(PA_GCC_WEAKREF) +#pragma GCC diagnostic ignored "-Wstrict-prototypes" +#include +#include +static G_CONST_RETURN gchar* _gtk_window_get_default_icon_name(void) PA_GCC_WEAKREF(gtk_window_get_default_icon_name); +static Display *_gdk_display PA_GCC_WEAKREF(gdk_display); +#endif + #include "proplist-util.h" -void pa_init_proplist(pa_proplist *p) { - int a, b; -#if !HAVE_DECL_ENVIRON - extern char **environ; +static void add_glib_properties(pa_proplist *p) { + +#if defined(HAVE_GLIB) && defined(PA_GCC_WEAKREF) + + if (!pa_proplist_contains(p, PA_PROP_APPLICATION_NAME)) + if (_g_get_application_name) { + const gchar *t; + + /* We ignore the tiny race condition here. */ + + if ((t = _g_get_application_name())) + pa_proplist_sets(p, PA_PROP_APPLICATION_NAME, t); + } + #endif +} + +static void add_gtk_properties(pa_proplist *p) { + +#if defined(HAVE_GTK) && defined(PA_GCC_WEAKREF) + + if (!pa_proplist_contains(p, PA_PROP_APPLICATION_ICON_NAME)) + if (_gtk_window_get_default_icon_name) { + const gchar *t; + + /* We ignore the tiny race condition here. */ + + if ((t = _gtk_window_get_default_icon_name())) + pa_proplist_sets(p, PA_PROP_APPLICATION_ICON_NAME, t); + } + + if (!pa_proplist_contains(p, PA_PROP_WINDOW_X11_DISPLAY)) + if (&_gdk_display && _gdk_display) { + const char *t; + + /* We ignore the tiny race condition here. */ + + if ((t = DisplayString(_gdk_display))) + pa_proplist_sets(p, PA_PROP_WINDOW_X11_DISPLAY, t); + } + +#endif +} + +void pa_init_proplist(pa_proplist *p) { char **e; + const char *pp; pa_assert(p); - for (e = environ; *e; e++) { + if (environ) { + + /* Some applications seem to reset environ to NULL for various + * reasons, hence we need to check for this explicitly. See + * rhbz #473080 */ + + for (e = environ; *e; e++) { - if (pa_startswith(*e, "PULSE_PROP_")) { - size_t kl = strcspn(*e+11, "="); - char *k; + if (pa_startswith(*e, "PULSE_PROP_")) { + size_t kl, skip; + char *k; + pa_bool_t override; - if ((*e)[11+kl] != '=') - continue; + if (pa_startswith(*e, "PULSE_PROP_OVERRIDE_")) { + skip = 20; + override = TRUE; + } else { + skip = 11; + override = FALSE; + } - if (!pa_utf8_valid(*e+11+kl+1)) - continue; + kl = strcspn(*e+skip, "="); - k = pa_xstrndup(*e+11, kl); + if ((*e)[skip+kl] != '=') + continue; - if (pa_proplist_contains(p, k)) { + k = pa_xstrndup(*e+skip, kl); + + if (!pa_streq(k, "OVERRIDE")) + if (override || !pa_proplist_contains(p, k)) + pa_proplist_sets(p, k, *e+skip+kl+1); pa_xfree(k); - continue; } + } + } + + if ((pp = getenv("PULSE_PROP"))) { + pa_proplist *t; + + if ((t = pa_proplist_from_string(pp))) { + pa_proplist_update(p, PA_UPDATE_MERGE, t); + pa_proplist_free(t); + } + } + + if ((pp = getenv("PULSE_PROP_OVERRIDE"))) { + pa_proplist *t; - pa_proplist_sets(p, k, *e+11+kl+1); - pa_xfree(k); + if ((t = pa_proplist_from_string(pp))) { + pa_proplist_update(p, PA_UPDATE_REPLACE, t); + pa_proplist_free(t); } } @@ -92,27 +185,58 @@ void pa_init_proplist(pa_proplist *p) { } } - a = pa_proplist_contains(p, PA_PROP_APPLICATION_PROCESS_BINARY); - b = pa_proplist_contains(p, PA_PROP_APPLICATION_NAME); - - if (!a || !b) { + if (!pa_proplist_contains(p, PA_PROP_APPLICATION_PROCESS_BINARY)) { char t[PATH_MAX]; if (pa_get_binary_name(t, sizeof(t))) { char *c = pa_utf8_filter(t); - - if (!a) - pa_proplist_sets(p, PA_PROP_APPLICATION_PROCESS_BINARY, c); - if (!b) - pa_proplist_sets(p, PA_PROP_APPLICATION_NAME, c); - + pa_proplist_sets(p, PA_PROP_APPLICATION_PROCESS_BINARY, c); pa_xfree(c); } } + add_glib_properties(p); + add_gtk_properties(p); + + if (!pa_proplist_contains(p, PA_PROP_APPLICATION_NAME)) { + const char *t; + + if ((t = pa_proplist_gets(p, PA_PROP_APPLICATION_PROCESS_BINARY))) + pa_proplist_sets(p, PA_PROP_APPLICATION_NAME, t); + } + if (!pa_proplist_contains(p, PA_PROP_APPLICATION_LANGUAGE)) { const char *l; if ((l = setlocale(LC_MESSAGES, NULL))) pa_proplist_sets(p, PA_PROP_APPLICATION_LANGUAGE, l); } + + if (!pa_proplist_contains(p, PA_PROP_WINDOW_X11_DISPLAY)) { + const char *t; + + if ((t = getenv("DISPLAY"))) { + char *c = pa_utf8_filter(t); + pa_proplist_sets(p, PA_PROP_WINDOW_X11_DISPLAY, c); + pa_xfree(c); + } + } + + if (!pa_proplist_contains(p, PA_PROP_APPLICATION_PROCESS_MACHINE_ID)) { + char *m; + + if ((m = pa_machine_id())) { + pa_proplist_sets(p, PA_PROP_APPLICATION_PROCESS_MACHINE_ID, m); + pa_xfree(m); + } + } + + if (!pa_proplist_contains(p, PA_PROP_APPLICATION_PROCESS_SESSION_ID)) { + const char *t; + + if ((t = getenv("XDG_SESSION_COOKIE"))) { + char *c = pa_utf8_filter(t); + pa_proplist_sets(p, PA_PROP_APPLICATION_PROCESS_SESSION_ID, c); + pa_xfree(c); + } + } }