augment-properties: support XDG_DATA_DIRS when find desktop files

This commit is contained in:
Iceyer 2017-11-18 15:33:51 +08:00 committed by Tanu Kaskinen
parent f5f44950c2
commit 10010f81e8

View file

@ -131,8 +131,44 @@ static int catch_all(pa_config_parser_state *state) {
return 0; 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) { static void update_rule(struct rule *r) {
char *fn; char *fn = NULL;
struct stat st; struct stat st;
static pa_config_item table[] = { static pa_config_item table[] = {
{ "Name", pa_config_parse_string, NULL, "Desktop Entry" }, { "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, catch_all, NULL, NULL },
{ NULL, NULL, 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); pa_assert(r);
fn = pa_sprintf_malloc(DESKTOPFILEDIR PA_PATH_SEP "%s.desktop", r->process_name);
if (stat(fn, &st) == 0) if ((xdg_data_dirs = getenv("XDG_DATA_DIRS"))) {
found = true; while ((data_dir = pa_split(xdg_data_dirs, ":", &state))) {
else { desktop_file_dir = pa_sprintf_malloc("%s" PA_PATH_SEP "applications", data_dir);
#ifdef DT_DIR
DIR *desktopfiles_dir;
struct dirent *dir;
/* Let's try a more aggressive search, but only one level */ pa_xfree(fn);
if ((desktopfiles_dir = opendir(DESKTOPFILEDIR))) { fn = find_desktop_file_in_dir(r, desktop_file_dir, &st);
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); pa_xfree(desktop_file_dir);
fn = pa_sprintf_malloc(DESKTOPFILEDIR PA_PATH_SEP "%s" PA_PATH_SEP "%s.desktop", dir->d_name, r->process_name); pa_xfree(data_dir);
if (stat(fn, &st) == 0) { if (fn) {
found = true; break;
break;
}
} }
closedir(desktopfiles_dir);
} }
#endif } else {
fn = find_desktop_file_in_dir(r, DESKTOPFILEDIR, &st);
} }
if (!found) {
if (!fn) {
r->good = false; r->good = false;
pa_xfree(fn);
return; return;
} }