diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/modules/module-augment-properties.c | 44 |
1 files changed, 39 insertions, 5 deletions
diff --git a/src/modules/module-augment-properties.c b/src/modules/module-augment-properties.c index 15aa3a1e..f80c9ce7 100644 --- a/src/modules/module-augment-properties.c +++ b/src/modules/module-augment-properties.c @@ -24,6 +24,7 @@ #endif #include <sys/stat.h> +#include <dirent.h> #include <pulse/xmalloc.h> #include <pulse/volume.h> @@ -168,20 +169,53 @@ static void update_rule(struct rule *r) { { NULL, catch_all, NULL, NULL }, { NULL, NULL, NULL, NULL }, }; + pa_bool_t found = FALSE; pa_assert(r); fn = pa_sprintf_malloc(DESKTOPFILEDIR PA_PATH_SEP "%s.desktop", r->process_name); - if (stat(fn, &st) < 0) { + if (stat(fn, &st) == 0) + found = TRUE; + else { + DIR *desktopfiles_dir; + struct dirent *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 + || strcmp(dir->d_name, ".") == 0 + || strcmp(dir->d_name, "..") == 0) + continue; + + pa_xfree(fn); + fn = pa_sprintf_malloc(DESKTOPFILEDIR + PA_PATH_SEP "%s" PA_PATH_SEP "%s.desktop", + dir->d_name, r->process_name); + + if (stat(fn, &st) == 0) { + found = TRUE; + break; + } + } + closedir(desktopfiles_dir); + } + } + if (!found) { r->good = FALSE; pa_xfree(fn); return; } - if (r->good && st.st_mtime == r->mtime) { - pa_xfree(fn); - return; - } + if (r->good) + if (st.st_mtime == r->mtime) { + /* Theoretically the filename could have changed, but if so + having the same mtime is very unlikely so not worth tracking it in r */ + pa_xfree(fn); + return; + } + else + pa_log_debug("Found %s.", fn); r->good = TRUE; r->mtime = st.st_mtime; |