X-Git-Url: https://code.delx.au/pulseaudio/blobdiff_plain/16e369498cffd28a806f0ba7b173f3c669c0e820..54025c96a7133964aa1568fe6d2e6c5ad05651bf:/src/pulsecore/proplist-util.c diff --git a/src/pulsecore/proplist-util.c b/src/pulsecore/proplist-util.c index 4920c27e..23864bcb 100644 --- a/src/pulsecore/proplist-util.c +++ b/src/pulsecore/proplist-util.c @@ -27,6 +27,14 @@ #include #include +#ifdef __APPLE__ +#include +#define environ (*_NSGetEnviron()) +#elif !HAVE_DECL_ENVIRON +extern char **environ; +#endif + +#include #include #include #include @@ -34,13 +42,68 @@ #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) { -#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); @@ -53,28 +116,51 @@ void pa_init_proplist(pa_proplist *p) { for (e = environ; *e; e++) { if (pa_startswith(*e, "PULSE_PROP_")) { - size_t kl = strcspn(*e+11, "="); + size_t kl, skip; char *k; + pa_bool_t override; + + if (pa_startswith(*e, "PULSE_PROP_OVERRIDE_")) { + skip = 20; + override = TRUE; + } else { + skip = 11; + override = FALSE; + } - if ((*e)[11+kl] != '=') - continue; + kl = strcspn(*e+skip, "="); - if (!pa_utf8_valid(*e+11+kl+1)) + if ((*e)[skip+kl] != '=') continue; - k = pa_xstrndup(*e+11, kl); - - if (pa_proplist_contains(p, k)) { - pa_xfree(k); - continue; - } + k = pa_xstrndup(*e+skip, kl); - pa_proplist_sets(p, k, *e+11+kl+1); + if (!pa_streq(k, "OVERRIDE")) + if (override || !pa_proplist_contains(p, k)) + pa_proplist_sets(p, k, *e+skip+kl+1); pa_xfree(k); } } } + 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; + + if ((t = pa_proplist_from_string(pp))) { + pa_proplist_update(p, PA_UPDATE_REPLACE, t); + pa_proplist_free(t); + } + } + if (!pa_proplist_contains(p, PA_PROP_APPLICATION_PROCESS_ID)) { char t[32]; pa_snprintf(t, sizeof(t), "%lu", (unsigned long) getpid()); @@ -82,46 +168,36 @@ void pa_init_proplist(pa_proplist *p) { } if (!pa_proplist_contains(p, PA_PROP_APPLICATION_PROCESS_USER)) { - char t[64]; - if (pa_get_user_name(t, sizeof(t))) { - char *c = pa_utf8_filter(t); - pa_proplist_sets(p, PA_PROP_APPLICATION_PROCESS_USER, c); - pa_xfree(c); + char *u; + + if ((u = pa_get_user_name_malloc())) { + pa_proplist_sets(p, PA_PROP_APPLICATION_PROCESS_USER, u); + pa_xfree(u); } } if (!pa_proplist_contains(p, PA_PROP_APPLICATION_PROCESS_HOST)) { - char t[64]; - if (pa_get_host_name(t, sizeof(t))) { - char *c = pa_utf8_filter(t); - pa_proplist_sets(p, PA_PROP_APPLICATION_PROCESS_HOST, c); - pa_xfree(c); + char *h; + + if ((h = pa_get_host_name_malloc())) { + pa_proplist_sets(p, PA_PROP_APPLICATION_PROCESS_HOST, h); + pa_xfree(h); } } if (!pa_proplist_contains(p, PA_PROP_APPLICATION_PROCESS_BINARY)) { - char t[PATH_MAX]; - if (pa_get_binary_name(t, sizeof(t))) { + char *t; + + if ((t = pa_get_binary_name_malloc())) { char *c = pa_utf8_filter(t); pa_proplist_sets(p, PA_PROP_APPLICATION_PROCESS_BINARY, c); + pa_xfree(t); pa_xfree(c); } } -#ifdef RTLD_NOLOAD - if (!pa_proplist_contains(p, PA_PROP_APPLICATION_NAME)) { - void *dl; - - if ((dl = dlopen("libglib-2.0", RTLD_NOLOAD))) { - const char *(*_g_get_application_name)(void); - - if ((*(void**) &_g_get_application_name = dlsym(dl, "g_get_application_name"))) - pa_proplist_sets(p, PA_PROP_APPLICATION_NAME, _g_get_application_name()); - - dlclose(dl); - } - } -#endif + add_glib_properties(p); + add_gtk_properties(p); if (!pa_proplist_contains(p, PA_PROP_APPLICATION_NAME)) { const char *t; @@ -155,4 +231,13 @@ void pa_init_proplist(pa_proplist *p) { pa_xfree(m); } } + + if (!pa_proplist_contains(p, PA_PROP_APPLICATION_PROCESS_SESSION_ID)) { + char *s; + + if ((s = pa_session_id())) { + pa_proplist_sets(p, PA_PROP_APPLICATION_PROCESS_SESSION_ID, s); + pa_xfree(s); + } + } }