diff --git a/src/Makefile_Eina.am b/src/Makefile_Eina.am index 997c5262dd..965bff34ae 100644 --- a/src/Makefile_Eina.am +++ b/src/Makefile_Eina.am @@ -185,7 +185,8 @@ lib/eina/eina_bezier.c \ lib/eina/eina_safepointer.c \ lib/eina/eina_freeq.c \ lib/eina/eina_slstr.c \ -lib/eina/eina_vpath.c +lib/eina/eina_vpath.c \ +lib/eina/eina_vpath_xdg.c if HAVE_WIN32 diff --git a/src/lib/efreet/efreet.c b/src/lib/efreet/efreet.c index d17e1dabaf..091899f2b2 100644 --- a/src/lib/efreet/efreet.c +++ b/src/lib/efreet/efreet.c @@ -10,8 +10,6 @@ #include #include -#include "eina_internal.h" - /* define macros and variable for using the eina logging system */ #define EFREET_MODULE_LOG_DOM /* no logging in this file */ @@ -38,79 +36,6 @@ static uid_t ruid; static uid_t rgid; #endif -static void -_efreet_efreet_app_interface_set(void) -{ - char buf[PATH_MAX]; - char *s; - const char *home; - Eina_Vpath_Interface_User user; - - home = eina_vpath_resolve("(:home:)/"); - - memset(&user, 0, sizeof(Eina_Vpath_Interface_User)); - -# if defined(HAVE_GETUID) && defined(HAVE_GETEUID) -# define ENV_HOME_SET(_env, _dir, _meta) \ - if ((getuid() != geteuid()) || (!(s = getenv(_env)))) { \ - snprintf(buf, sizeof(buf), "%s/"_dir, home); \ - s = buf; \ - } \ - (&user)->_meta = s; -#else -# define ENV_HOME_SET(_env, _dir, _meta) \ - if (!(s = getenv(_env))) { \ - snprintf(buf, sizeof(buf), "%s/"_dir, home); \ - s = buf; \ - } \ - (&user)->_meta = s; -#endif - // $XDG_DESKTOP_DIR="$HOME/Desktop" - ENV_HOME_SET("XDG_DESKTOP_DIR", "Desktop", desktop); - // $XDG_DOCUMENTS_DIR="$HOME/Documents" - ENV_HOME_SET("XDG_DOCUMENTS_DIR", "Documents", documents); - // $XDG_DOWNLOAD_DIR="$HOME/Downloads" - ENV_HOME_SET("XDG_DOWNLOAD_DIR", "Downloads", downloads); - // $XDG_MUSIC_DIR="$HOME/Music" - ENV_HOME_SET("XDG_MUSIC_DIR", "Music", music); - // $XDG_PICTURES_DIR="$HOME/Pictures" - ENV_HOME_SET("XDG_PICTURES_DIR", "Pictures", pictures); - // $XDG_PUBLICSHARE_DIR="$HOME/Public" - ENV_HOME_SET("XDG_PUBLIC_DIR", "Public", pub); - // $XDG_TEMPLATES_DIR="$HOME/.Templates" - ENV_HOME_SET("XDG_TEMPLATES_DIR", ".Templates", templates); - // $XDG_VIDEOS_DIR="$HOME/Videos" - ENV_HOME_SET("XDG_VIDEOS_DIR", "Videos", videos); - // $XDG_DATA_HOME defines the base directory relative to which user - // specific data files should be stored. If $XDG_DATA_HOME is either - // not set or empty, a default equal to $HOME/.local/share should be - // used. - ENV_HOME_SET("XDG_DATA_HOME", ".local/share", data); - ENV_HOME_SET("XDG_TMP_HOME", ".local/tmp", tmp); - // $XDG_CONFIG_HOME defines the base directory relative to which user - // specific configuration files should be stored. If $XDG_CONFIG_HOME - // is either not set or empty, a default equal to $HOME/.config should - // be used. - ENV_HOME_SET("XDG_CONFIG_HOME", ".config", config); - // $XDG_CACHE_HOME defines the base directory relative to which - // user specific non-essential data files should be stored. If - // $XDG_CACHE_HOME is either not set or empty, a default equal to - // $HOME/.cache should be used. - ENV_HOME_SET("XDG_CACHE_HOME", ".cache", cache); - -#if defined(HAVE_GETUID) && defined(HAVE_GETEUID) - if ((getuid() != geteuid()) || (!(s = getenv("XDG_RUNTIME_DIR")))) -#else - if (!(s = getenv("XDG_RUNTIME_DIR"))) -#endif - user.run = NULL; - else - user.run = s; - - eina_vpath_interface_user_set(&user); -} - - EAPI int efreet_init(void) { @@ -145,9 +70,6 @@ efreet_init(void) if (!ecore_file_init()) goto shutdown_ecore; - //this needs to be early initializied efreet itself is using vpaths - _efreet_efreet_app_interface_set(); - if (!efreet_base_init()) goto shutdown_ecore_file; diff --git a/src/lib/eina/eina_internal.h b/src/lib/eina/eina_internal.h index 9fea25b1f0..9ae14df76b 100644 --- a/src/lib/eina/eina_internal.h +++ b/src/lib/eina/eina_internal.h @@ -99,6 +99,9 @@ EAPI void eina_vpath_interface_app_set(const char *app_name, Eina_Prefix *p); */ EAPI void eina_vpath_interface_user_set(Eina_Vpath_Interface_User *user); + +void eina_xdg_env_init(void); + #undef EAPI #define EAPI diff --git a/src/lib/eina/eina_vpath.c b/src/lib/eina/eina_vpath.c index bc7c4d0045..b1b6af5284 100644 --- a/src/lib/eina/eina_vpath.c +++ b/src/lib/eina/eina_vpath.c @@ -175,6 +175,7 @@ eina_vpath_init(void) vpath_data = eina_hash_string_superfast_new((Eina_Free_Cb)eina_stringshare_del); _eina_vpath_interface_sys_init(); + eina_xdg_env_init(); _eina_vpath_log_dom = eina_log_domain_register("vpath", "cyan"); return EINA_TRUE; diff --git a/src/lib/eina/eina_vpath_xdg.c b/src/lib/eina/eina_vpath_xdg.c new file mode 100644 index 0000000000..6a1d4d8248 --- /dev/null +++ b/src/lib/eina/eina_vpath_xdg.c @@ -0,0 +1,83 @@ +#ifdef HAVE_CONFIG_H +# include +#endif + +#include +#include + +#include + +#include "eina_internal.h" +#include "eina_private.h" + +void +eina_xdg_env_init(void) +{ + char buf[PATH_MAX]; + char *s; + const char *home; + Eina_Vpath_Interface_User user; + + home = eina_vpath_resolve("(:home:)/"); + + memset(&user, 0, sizeof(Eina_Vpath_Interface_User)); + +# if defined(HAVE_GETUID) && defined(HAVE_GETEUID) +# define ENV_HOME_SET(_env, _dir, _meta) \ + if ((getuid() != geteuid()) || (!(s = getenv(_env)))) { \ + snprintf(buf, sizeof(buf), "%s/"_dir, home); \ + s = buf; \ + } \ + (&user)->_meta = s; +#else +# define ENV_HOME_SET(_env, _dir, _meta) \ + if (!(s = getenv(_env))) { \ + snprintf(buf, sizeof(buf), "%s/"_dir, home); \ + s = buf; \ + } \ + (&user)->_meta = s; +#endif + // $XDG_DESKTOP_DIR="$HOME/Desktop" + ENV_HOME_SET("XDG_DESKTOP_DIR", "Desktop", desktop); + // $XDG_DOCUMENTS_DIR="$HOME/Documents" + ENV_HOME_SET("XDG_DOCUMENTS_DIR", "Documents", documents); + // $XDG_DOWNLOAD_DIR="$HOME/Downloads" + ENV_HOME_SET("XDG_DOWNLOAD_DIR", "Downloads", downloads); + // $XDG_MUSIC_DIR="$HOME/Music" + ENV_HOME_SET("XDG_MUSIC_DIR", "Music", music); + // $XDG_PICTURES_DIR="$HOME/Pictures" + ENV_HOME_SET("XDG_PICTURES_DIR", "Pictures", pictures); + // $XDG_PUBLICSHARE_DIR="$HOME/Public" + ENV_HOME_SET("XDG_PUBLIC_DIR", "Public", pub); + // $XDG_TEMPLATES_DIR="$HOME/.Templates" + ENV_HOME_SET("XDG_TEMPLATES_DIR", ".Templates", templates); + // $XDG_VIDEOS_DIR="$HOME/Videos" + ENV_HOME_SET("XDG_VIDEOS_DIR", "Videos", videos); + // $XDG_DATA_HOME defines the base directory relative to which user + // specific data files should be stored. If $XDG_DATA_HOME is either + // not set or empty, a default equal to $HOME/.local/share should be + // used. + ENV_HOME_SET("XDG_DATA_HOME", ".local/share", data); + ENV_HOME_SET("XDG_TMP_HOME", ".local/tmp", tmp); + // $XDG_CONFIG_HOME defines the base directory relative to which user + // specific configuration files should be stored. If $XDG_CONFIG_HOME + // is either not set or empty, a default equal to $HOME/.config should + // be used. + ENV_HOME_SET("XDG_CONFIG_HOME", ".config", config); + // $XDG_CACHE_HOME defines the base directory relative to which + // user specific non-essential data files should be stored. If + // $XDG_CACHE_HOME is either not set or empty, a default equal to + // $HOME/.cache should be used. + ENV_HOME_SET("XDG_CACHE_HOME", ".cache", cache); + +#if defined(HAVE_GETUID) && defined(HAVE_GETEUID) + if ((getuid() != geteuid()) || (!(s = getenv("XDG_RUNTIME_DIR")))) +#else + if (!(s = getenv("XDG_RUNTIME_DIR"))) +#endif + user.run = NULL; + else + user.run = s; + + eina_vpath_interface_user_set(&user); +}