[pulseaudio-discuss] [PATCH v2] modules: support XDG_DATA_DIRS when find desktop files
Iceyer
iceyers at gmail.com
Sat Nov 18 07:33:51 UTC 2017
---
src/modules/module-augment-properties.c | 78 ++++++++++++++++++++++-----------
1 file changed, 53 insertions(+), 25 deletions(-)
diff --git a/src/modules/module-augment-properties.c b/src/modules/module-augment-properties.c
index 541f0e79..e1d99823 100644
--- a/src/modules/module-augment-properties.c
+++ b/src/modules/module-augment-properties.c
@@ -131,32 +131,21 @@ static int catch_all(pa_config_parser_state *state) {
return 0;
}
-static void update_rule(struct rule *r) {
- char *fn;
- struct stat st;
- static pa_config_item table[] = {
- { "Name", pa_config_parse_string, NULL, "Desktop Entry" },
- { "Icon", pa_config_parse_string, NULL, "Desktop Entry" },
- { "Type", check_type, NULL, "Desktop Entry" },
- { "X-PulseAudio-Properties", parse_properties, NULL, "Desktop Entry" },
- { "Categories", parse_categories, NULL, "Desktop Entry" },
- { NULL, catch_all, NULL, NULL },
- { NULL, NULL, NULL, NULL },
- };
- bool found = false;
+static char * find_desktop_file_in_dir(struct rule *r, const char *desktop_file_dir, struct stat *st) {
+ char *fn = NULL;
- pa_assert(r);
- fn = pa_sprintf_malloc(DESKTOPFILEDIR PA_PATH_SEP "%s.desktop", r->process_name);
+ pa_assert(st);
- if (stat(fn, &st) == 0)
- found = true;
- else {
+ fn = pa_sprintf_malloc("%s" PA_PATH_SEP "%s.desktop", desktop_file_dir, r->process_name);
+ if (stat(fn, st) == 0) {
+ return fn;
+ } else {
#ifdef DT_DIR
DIR *desktopfiles_dir;
struct dirent *dir;
/* Let's try a more aggressive search, but only one level */
- if ((desktopfiles_dir = opendir(DESKTOPFILEDIR))) {
+ if ((desktopfiles_dir = opendir(desktop_file_dir))) {
while ((dir = readdir(desktopfiles_dir))) {
if (dir->d_type != DT_DIR
|| pa_streq(dir->d_name, ".")
@@ -164,20 +153,59 @@ static void update_rule(struct rule *r) {
continue;
pa_xfree(fn);
- fn = pa_sprintf_malloc(DESKTOPFILEDIR PA_PATH_SEP "%s" PA_PATH_SEP "%s.desktop", dir->d_name, r->process_name);
+ fn = pa_sprintf_malloc("%s" PA_PATH_SEP "%s" PA_PATH_SEP "%s.desktop", desktop_file_dir, dir->d_name, r->process_name);
- if (stat(fn, &st) == 0) {
- found = true;
- break;
+ if (stat(fn, st) == 0) {
+ closedir(desktopfiles_dir);
+ return fn;
}
}
closedir(desktopfiles_dir);
}
#endif
}
- if (!found) {
+ return NULL;
+}
+
+static void update_rule(struct rule *r) {
+ char *fn;
+ struct stat st;
+ static pa_config_item table[] = {
+ { "Name", pa_config_parse_string, NULL, "Desktop Entry" },
+ { "Icon", pa_config_parse_string, NULL, "Desktop Entry" },
+ { "Type", check_type, NULL, "Desktop Entry" },
+ { "X-PulseAudio-Properties", parse_properties, NULL, "Desktop Entry" },
+ { "Categories", parse_categories, NULL, "Desktop Entry" },
+ { NULL, catch_all, NULL, NULL },
+ { NULL, NULL, NULL, NULL },
+ };
+ const char *state = NULL;
+ const char *xdg_data_dirs = NULL;
+ char *data_dir = NULL;
+ char *desktop_file_dir = NULL;
+
+ pa_assert(r);
+
+ if ((xdg_data_dirs = getenv("XDG_DATA_DIRS"))) {
+ while ((data_dir = pa_split(xdg_data_dirs, ":", &state))) {
+ desktop_file_dir = pa_sprintf_malloc("%s" PA_PATH_SEP "applications", data_dir);
+
+ pa_xfree(fn);
+ fn = find_desktop_file_in_dir(r, desktop_file_dir, &st);
+
+ pa_xfree(desktop_file_dir);
+ pa_xfree(data_dir);
+
+ if (fn) {
+ break;
+ }
+ }
+ } else {
+ fn = find_desktop_file_in_dir(r, DESKTOPFILEDIR, &st);
+ }
+
+ if (!fn) {
r->good = false;
- pa_xfree(fn);
return;
}
--
2.13.3
More information about the pulseaudio-discuss
mailing list