From 10010f81e8c84c185f8d610a6190c3b943a289f9 Mon Sep 17 00:00:00 2001 From: Iceyer Date: Sat, 18 Nov 2017 15:33:51 +0800 Subject: [PATCH] augment-properties: support XDG_DATA_DIRS when find desktop files --- src/modules/module-augment-properties.c | 80 +++++++++++++++++-------- 1 file changed, 54 insertions(+), 26 deletions(-) diff --git a/src/modules/module-augment-properties.c b/src/modules/module-augment-properties.c index 541f0e795..f0584328d 100644 --- a/src/modules/module-augment-properties.c +++ b/src/modules/module-augment-properties.c @@ -131,8 +131,44 @@ static int catch_all(pa_config_parser_state *state) { return 0; } +static char * find_desktop_file_in_dir(struct rule *r, const char *desktop_file_dir, struct stat *st) { + char *fn = NULL; + + pa_assert(st); + + 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(desktop_file_dir))) { + while ((dir = readdir(desktopfiles_dir))) { + if (dir->d_type != DT_DIR + || pa_streq(dir->d_name, ".") + || pa_streq(dir->d_name, "..")) + continue; + + pa_xfree(fn); + 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) { + closedir(desktopfiles_dir); + return fn; + } + } + closedir(desktopfiles_dir); + } +#endif + } + return NULL; +} + static void update_rule(struct rule *r) { - char *fn; + char *fn = NULL; struct stat st; static pa_config_item table[] = { { "Name", pa_config_parse_string, NULL, "Desktop Entry" }, @@ -143,41 +179,33 @@ static void update_rule(struct rule *r) { { NULL, catch_all, NULL, NULL }, { NULL, NULL, NULL, NULL }, }; - bool found = false; + const char *state = NULL; + const char *xdg_data_dirs = NULL; + char *data_dir = NULL; + char *desktop_file_dir = NULL; pa_assert(r); - fn = pa_sprintf_malloc(DESKTOPFILEDIR PA_PATH_SEP "%s.desktop", r->process_name); - if (stat(fn, &st) == 0) - found = true; - else { -#ifdef DT_DIR - DIR *desktopfiles_dir; - struct dirent *dir; + 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); - /* Let's try a more aggressive search, but only one level */ - if ((desktopfiles_dir = opendir(DESKTOPFILEDIR))) { - while ((dir = readdir(desktopfiles_dir))) { - if (dir->d_type != DT_DIR - || pa_streq(dir->d_name, ".") - || pa_streq(dir->d_name, "..")) - continue; + pa_xfree(fn); + fn = find_desktop_file_in_dir(r, desktop_file_dir, &st); - pa_xfree(fn); - fn = pa_sprintf_malloc(DESKTOPFILEDIR PA_PATH_SEP "%s" PA_PATH_SEP "%s.desktop", dir->d_name, r->process_name); + pa_xfree(desktop_file_dir); + pa_xfree(data_dir); - if (stat(fn, &st) == 0) { - found = true; - break; - } + if (fn) { + break; } - closedir(desktopfiles_dir); } -#endif + } else { + fn = find_desktop_file_in_dir(r, DESKTOPFILEDIR, &st); } - if (!found) { + + if (!fn) { r->good = false; - pa_xfree(fn); return; }