--- a/src/xdg-desktop-portal.c +++ b/src/xdg-desktop-portal.c @@ -177,38 +177,50 @@ static void load_installed_portals (void) { - const char *portal_dir = PKGDATADIR "/portals"; - g_autoptr(GFile) dir = g_file_new_for_path (portal_dir); - g_autoptr(GFileEnumerator) enumerator = NULL; - enumerator = g_file_enumerate_children (dir, "*", G_FILE_QUERY_INFO_NONE, NULL, NULL); + g_auto(GStrv) portal_dir_list; + int i; + const char *portal_dir = g_getenv ("XDG_DESKTOP_PORTAL_PATH"); + + if (portal_dir == NULL) + portal_dir = PKGDATADIR "/portals"; - if (enumerator == NULL) - return; + portal_dir_list = g_strsplit (portal_dir, G_SEARCHPATH_SEPARATOR_S, 0); - while (TRUE) + for (i = 0; portal_dir_list[i] != NULL; i++) { - g_autoptr(GFileInfo) info = g_file_enumerator_next_file (enumerator, NULL, NULL); - g_autoptr(GFile) child = NULL; - g_autofree char *path = NULL; - const char *name; - g_autoptr(GError) error = NULL; + portal_dir = portal_dir_list[i]; + g_autoptr(GFile) dir = g_file_new_for_path (portal_dir); + g_autoptr(GFileEnumerator) enumerator = NULL; + enumerator = g_file_enumerate_children (dir, "*", G_FILE_QUERY_INFO_NONE, NULL, NULL); - if (info == NULL) - break; + if (enumerator == NULL) + continue; - name = g_file_info_get_name (info); + while (TRUE) + { + g_autoptr(GFileInfo) info = g_file_enumerator_next_file (enumerator, NULL, NULL); + g_autoptr(GFile) child = NULL; + g_autofree char *path = NULL; + const char *name; + g_autoptr(GError) error = NULL; - if (!g_str_has_suffix (name, ".portal")) - continue; + if (info == NULL) + break; - child = g_file_enumerator_get_child (enumerator, info); - path = g_file_get_path (child); + name = g_file_info_get_name (info); - if (!register_portal (path, &error)) - { - g_warning ("Error loading %s: %s", path, error->message); - continue; + if (!g_str_has_suffix (name, ".portal")) + continue; + + child = g_file_enumerator_get_child (enumerator, info); + path = g_file_get_path (child); + + if (!register_portal (path, &error)) + { + g_warning ("Error loading %s: %s", path, error->message); + continue; + } } }