[PATCH] modules: support XDG_DATA_DIRS when find desktop files

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



---
 src/modules/module-augment-properties.c | 63 +++++++++++++++++++++------------
 1 file changed, 40 insertions(+), 23 deletions(-)

diff --git a/src/modules/module-augment-properties.c b/src/modules/module-augment-properties.c
index 541f0e79..56217d51 100644
--- a/src/modules/module-augment-properties.c
+++ b/src/modules/module-augment-properties.c
@@ -144,37 +144,54 @@ static void update_rule(struct rule *r) {
         { 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 {
+    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);
+        fn = pa_sprintf_malloc("%s" PA_PATH_SEP "%s.desktop", desktop_file_dir, r->process_name);
+        if (stat(fn, &st) == 0) {
+            found = true;
+            break;
+        } 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))) {
-            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(DESKTOPFILEDIR PA_PATH_SEP "%s" PA_PATH_SEP "%s.desktop", dir->d_name, r->process_name);
-
-                if (stat(fn, &st) == 0) {
-                    found = true;
-                    break;
+            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) {
+                        found = true;
+                        break;
+                    }
                 }
+                closedir(desktopfiles_dir);
+                if (found)
+                    break;
             }
-            closedir(desktopfiles_dir);
-        }
 #endif
+        }
+        pa_xfree(desktop_file_dir);
+      }
+
+      if (data_dir)
+          pa_xfree(data_dir);
     }
+
     if (!found) {
         r->good = false;
         pa_xfree(fn);
-- 
2.13.3



[Index of Archives]     [Linux Audio Users]     [AMD Graphics]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux