base-dirs: add XDG_CONFIG/DATA_DIRS and CONFIGURATION & DATA groups

This adds support for the system-wide locations for configuration and
data files, as defined by the XDG Base Directory Specification.

In addition, it adds two flag groups, CONFIGURATION and DATA, to the
base-dirs system, so that we don't have to hard-code the combinations
of flags everywhere.
This commit is contained in:
George Kiagiadakis
2024-02-27 08:39:30 +02:00
parent a95cbda846
commit c8feaad7a9
3 changed files with 47 additions and 16 deletions

View File

@@ -62,13 +62,33 @@ lookup_dirs (guint flags)
dir = g_get_user_config_dir ();
g_ptr_array_add (dirs, g_build_filename (dir, "wireplumber", NULL));
}
if (flags & WP_BASE_DIRS_ETC)
if (flags & WP_BASE_DIRS_XDG_DATA_HOME) {
dir = g_get_user_data_dir ();
g_ptr_array_add (dirs, g_build_filename (dir, "wireplumber", NULL));
}
if (flags & WP_BASE_DIRS_XDG_CONFIG_DIRS) {
const gchar * const *xdg_dirs = g_get_system_config_dirs ();
for (guint i = 0; xdg_dirs[i]; i++) {
g_ptr_array_add (dirs, g_build_filename (xdg_dirs[i], "wireplumber",
NULL));
}
}
if (flags & WP_BASE_DIRS_ETC) {
g_ptr_array_add (dirs,
g_canonicalize_filename (WIREPLUMBER_DEFAULT_CONFIG_DIR, NULL));
if (flags & WP_BASE_DIRS_PREFIX_SHARE)
}
if (flags & WP_BASE_DIRS_XDG_DATA_DIRS) {
const gchar * const *xdg_dirs = g_get_system_data_dirs ();
for (guint i = 0; xdg_dirs[i]; i++) {
g_ptr_array_add (dirs, g_build_filename (xdg_dirs[i], "wireplumber",
NULL));
}
}
if (flags & WP_BASE_DIRS_PREFIX_SHARE) {
g_ptr_array_add (dirs,
g_canonicalize_filename(WIREPLUMBER_DEFAULT_DATA_DIR, NULL));
}
}
return g_steal_pointer (&dirs);
}

View File

@@ -22,9 +22,28 @@ typedef enum { /*< flags >*/
WP_BASE_DIRS_ENV_CONFIG = (1 << 0), /*!< $WIREPLUMBER_CONFIG_DIR */
WP_BASE_DIRS_ENV_DATA = (1 << 1), /*!< $WIREPLUMBER_DATA_DIR */
WP_BASE_DIRS_XDG_CONFIG_HOME = (1 << 10), /*!< XDG_CONFIG_HOME/wireplumber */
WP_BASE_DIRS_ETC = (1 << 11), /*!< ($prefix)/etc/wireplumber */
WP_BASE_DIRS_PREFIX_SHARE = (1 << 12), /*!< $prefix/share/wireplumber */
WP_BASE_DIRS_XDG_CONFIG_HOME = (1 << 8), /*!< XDG_CONFIG_HOME/wireplumber */
WP_BASE_DIRS_XDG_DATA_HOME = (1 << 9), /*!< XDG_DATA_HOME/wireplumber */
WP_BASE_DIRS_XDG_CONFIG_DIRS = (1 << 10), /*!< XDG_CONFIG_DIRS/wireplumber */
WP_BASE_DIRS_XDG_DATA_DIRS = (1 << 11), /*!< XDG_DATA_DIRS/wireplumber */
WP_BASE_DIRS_ETC = (1 << 16), /*!< ($prefix)/etc/wireplumber */
WP_BASE_DIRS_PREFIX_SHARE = (1 << 17), /*!< $prefix/share/wireplumber */
WP_BASE_DIRS_CONFIGURATION =
WP_BASE_DIRS_ENV_CONFIG |
WP_BASE_DIRS_XDG_CONFIG_HOME |
WP_BASE_DIRS_XDG_CONFIG_DIRS |
WP_BASE_DIRS_ETC |
WP_BASE_DIRS_XDG_DATA_DIRS |
WP_BASE_DIRS_PREFIX_SHARE,
WP_BASE_DIRS_DATA =
WP_BASE_DIRS_ENV_DATA |
WP_BASE_DIRS_XDG_DATA_HOME |
WP_BASE_DIRS_XDG_DATA_DIRS |
WP_BASE_DIRS_PREFIX_SHARE,
} WpBaseDirsFlags;
WP_API

View File

@@ -39,12 +39,8 @@ wp_lua_scripting_package_searcher (lua_State *L)
const gchar *name = luaL_checkstring (L, 1);
g_autoptr (GError) error = NULL;
g_autofree gchar *filename = g_strdup_printf ("%s.lua", name);
g_autofree gchar *script = wp_base_dirs_find_file (
WP_BASE_DIRS_ENV_DATA |
WP_BASE_DIRS_XDG_CONFIG_HOME |
WP_BASE_DIRS_ETC |
WP_BASE_DIRS_PREFIX_SHARE,
"scripts/lib", filename);
g_autofree gchar *script =
wp_base_dirs_find_file (WP_BASE_DIRS_DATA, "scripts/lib", filename);
if (!script) {
lua_pushliteral (L, "script not found");
@@ -142,11 +138,7 @@ find_script (const gchar * script, WpCore *core)
g_file_test (script, G_FILE_TEST_IS_REGULAR))
return g_strdup (script);
return wp_base_dirs_find_file (WP_BASE_DIRS_ENV_DATA |
WP_BASE_DIRS_XDG_CONFIG_HOME |
WP_BASE_DIRS_ETC |
WP_BASE_DIRS_PREFIX_SHARE,
"scripts", script);
return wp_base_dirs_find_file (WP_BASE_DIRS_DATA, "scripts", script);
}
static void