diff --git a/README b/README index 29f1af1bff..552e3cf3e8 100644 --- a/README +++ b/README @@ -77,12 +77,12 @@ The look of GIMP's interface can be customized like any other GTK app by editing the ~/.gtkrc-2.0 file or by using "themes" (ready-made customizations). For downloadable themes and further details, see http://art.gnome.org/themes/gtk2 . Additionally, GIMP reads the file -~/.gimp-2.8/gtkrc so you can have settings that only apply to GIMP. +~/.config/GIMP/2.8/gtkrc so you can have settings that only apply to GIMP. Included is a set of keybindings similar to those in Adobe Photoshop. You can find them in the ps-menurc file. To use them, copy this file -to ~/.gimp-2.8/menurc. You can also manually change the keybindings to -any of your choice by editing ~/.gimp-2.8/menurc. +to ~/.config/GIMP/2.8/menurc. You can also manually change the keybindings to +any of your choice by editing ~/.config/GIMP/2.8/menurc. Have fun, diff --git a/app/core/gimp-user-install.c b/app/core/gimp-user-install.c index 66251f4c5c..3ea5542567 100644 --- a/app/core/gimp-user-install.c +++ b/app/core/gimp-user-install.c @@ -110,8 +110,10 @@ gimp_user_install_items[] = }; -static gboolean gimp_user_install_detect_old (GimpUserInstall *install, +static gboolean user_install_detect_old (GimpUserInstall *install, const gchar *gimp_dir); +static gchar * user_install_old_style_gimpdir (void); + static void user_install_log (GimpUserInstall *install, const gchar *format, ...) G_GNUC_PRINTF (2, 3); @@ -134,6 +136,7 @@ static gboolean user_install_create_files (GimpUserInstall *install); static gboolean user_install_migrate_files (GimpUserInstall *install); +/* public functions */ GimpUserInstall * gimp_user_install_new (gboolean verbose) @@ -142,20 +145,17 @@ gimp_user_install_new (gboolean verbose) install->verbose = verbose; - gimp_user_install_detect_old (install, gimp_directory ()); + user_install_detect_old (install, gimp_directory ()); -#ifdef PLATFORM_OSX if (! install->old_dir) { - /* if the default old gimpdir was not found, try the "classic" one - * in the home folder + /* if the default XDG-style config directory was not found, try + * the "old-style" path in the home folder. */ - gchar *dir = g_strdup_printf ("%s/.gimp-%s", - g_get_home_dir (), GIMP_APP_VERSION); - gimp_user_install_detect_old (install, dir); + gchar *dir = user_install_old_style_gimpdir (); + user_install_detect_old (install, dir); g_free (dir); } -#endif return install; } @@ -220,8 +220,8 @@ gimp_user_install_set_log_handler (GimpUserInstall *install, /* Local functions */ static gboolean -gimp_user_install_detect_old (GimpUserInstall *install, - const gchar *gimp_dir) +user_install_detect_old (GimpUserInstall *install, + const gchar *gimp_dir) { gchar *dir = g_strdup (gimp_dir); gchar *version; @@ -266,6 +266,52 @@ gimp_user_install_detect_old (GimpUserInstall *install, return migrate; } +static gchar * +user_install_old_style_gimpdir (void) +{ + const gchar *home_dir = g_get_home_dir (); + gchar *gimp_dir = NULL; + + if (home_dir) + { + gimp_dir = g_build_filename (home_dir, ".gimp-" GIMP_APP_VERSION, NULL); + } + else + { + gchar *user_name = g_strdup (g_get_user_name ()); + gchar *subdir_name; + +#ifdef G_OS_WIN32 + gchar *p = user_name; + + while (*p) + { + /* Replace funny characters in the user name with an + * underscore. The code below also replaces some + * characters that in fact are legal in file names, but + * who cares, as long as the definitely illegal ones are + * caught. + */ + if (!g_ascii_isalnum (*p) && !strchr ("-.,@=", *p)) + *p = '_'; + p++; + } +#endif + +#ifndef G_OS_WIN32 + g_message ("warning: no home directory."); +#endif + subdir_name = g_strconcat (".gimp-" GIMP_APP_VERSION ".", user_name, NULL); + gimp_dir = g_build_filename (gimp_data_directory (), + subdir_name, + NULL); + g_free (user_name); + g_free (subdir_name); + } + + return gimp_dir; +} + static void user_install_log (GimpUserInstall *install, const gchar *format, diff --git a/configure.ac b/configure.ac index 05af74b21d..6b7c6c6311 100644 --- a/configure.ac +++ b/configure.ac @@ -1985,8 +1985,8 @@ AM_CONDITIONAL(ENABLE_GIMP_CONSOLE, test "x$enable_gimp_console" != xno) # Possibly change default gimpdir from .gimp-major.minor -gimpdir=.gimp-gimp_user_version -AC_ARG_WITH(gimpdir, [ --with-gimpdir=DIR change default gimpdir from .gimp-gimp_user_version to DIR], +gimpdir=GIMP +AC_ARG_WITH(gimpdir, [ --with-gimpdir=DIR change default gimpdir from $XDG_CONFIG_HOME/GIMP/gimp_user_version to $XDG_CONFIG_HOME/DIR/gimp_user_version], if eval "test x$with_gimpdir != x"; then if eval "test x$with_gimpdir != xyes"; then gimpdir=$with_gimpdir diff --git a/libgimpbase/gimpenv.c b/libgimpbase/gimpenv.c index bc25f4a89f..71384d81af 100644 --- a/libgimpbase/gimpenv.c +++ b/libgimpbase/gimpenv.c @@ -63,6 +63,20 @@ #define gid_t gint #define geteuid() 0 #define getegid() 0 + +/* This is a hack for Windows known directory support. + * DATADIR (autotools-generated constant) is a type defined in objidl.h + * so we must #undef it before including shlobj.h in order to avoid a + * name clash. */ +static const char* datadir = DATADIR; +#undef DATADIR +#include +#define DATADIR datadir +/* Constant available since Shell32.dll 4.72 */ +#ifndef CSIDL_APPDATA +#define CSIDL_APPDATA 0x001a +#endif + #endif @@ -76,8 +90,11 @@ **/ -static gchar * gimp_env_get_dir (const gchar *gimp_env_name, - const gchar *env_dir); +static gchar * gimp_env_get_dir (const gchar *gimp_env_name, + const gchar *env_dir); +#ifdef G_OS_WIN32 +static gchar * get_special_folder (gint csidl); +#endif const guint gimp_major_version = GIMP_MAJOR_VERSION; @@ -146,15 +163,26 @@ gimp_env_init (gboolean plug_in) * to be a subdirectory of gimp_data_directory(). * * The usual case is that no GIMP2_DIRECTORY environment variable - * exists, and then we use the GIMPDIR subdirectory of the home - * directory. If no home directory exists, we use a per-user - * subdirectory of gimp_data_directory(). In any case, we always - * return some non-empty string, whether it corresponds to an existing - * directory or not. + * exists, and then we use the GIMPDIR subdirectory of the local + * configuration directory: + * + * - UNIX: $XDG_CONFIG_HOME (defaults to $HOME/.config/) + * + * - Windows: CSIDL_APPDATA + * + * - OSX (UNIX exception): the Application Support Directory. + * + * If neither the configuration nor home directory exist, + * g_get_user_config_dir() will return {tmp}/{user_name}/.config/ where + * the temporary directory {tmp} and the {user_name} are determined + * according to platform rules. + * + * In any case, we always return some non-empty string, whether it + * corresponds to an existing directory or not. * * The returned string is owned by GIMP and must not be modified or * freed. The returned string is in the encoding used for filenames by - * GLib, which isn't necessarily UTF-8. (On Windows it always is + * GLib, which isn't necessarily UTF-8 (on Windows it is always * UTF-8.) * * Returns: The user-specific GIMP settings directory. @@ -166,7 +194,6 @@ gimp_directory (void) static gchar *last_env_gimp_dir = NULL; const gchar *env_gimp_dir; - const gchar *home_dir; env_gimp_dir = g_getenv ("GIMP2_DIRECTORY"); @@ -205,8 +232,6 @@ gimp_directory (void) g_free (last_env_gimp_dir); last_env_gimp_dir = g_strdup (env_gimp_dir); - home_dir = g_get_home_dir (); - if (env_gimp_dir) { if (g_path_is_absolute (env_gimp_dir)) @@ -215,17 +240,12 @@ gimp_directory (void) } else { + const gchar *home_dir = g_get_home_dir (); + if (home_dir) - { - gimp_dir = g_build_filename (home_dir, - env_gimp_dir, - NULL); - } + gimp_dir = g_build_filename (home_dir, env_gimp_dir, NULL); else - { - gimp_dir = g_build_filename (gimp_data_directory (), - env_gimp_dir, NULL); - } + gimp_dir = g_build_filename (gimp_data_directory (), env_gimp_dir, NULL); } } else @@ -243,49 +263,25 @@ gimp_directory (void) library_dir = [path objectAtIndex:0]; gimp_dir = g_build_filename ([library_dir UTF8String], - "GIMP", GIMP_USER_VERSION, - NULL); + GIMPDIR, GIMP_USER_VERSION, NULL); [pool drain]; -#else /* ! PLATFORM_OSX */ +#elif defined G_OS_WIN32 - if (home_dir) - { - gimp_dir = g_build_filename (home_dir, GIMPDIR, NULL); - } - else - { - gchar *user_name = g_strdup (g_get_user_name ()); - gchar *subdir_name; + gchar *conf_dir = get_special_folder (CSIDL_APPDATA); -#ifdef G_OS_WIN32 - gchar *p = user_name; + gimp_dir = g_build_filename (conf_dir, + GIMPDIR, GIMP_USER_VERSION, NULL); + g_free(conf_dir); - while (*p) - { - /* Replace funny characters in the user name with an - * underscore. The code below also replaces some - * characters that in fact are legal in file names, but - * who cares, as long as the definitely illegal ones are - * caught. - */ - if (!g_ascii_isalnum (*p) && !strchr ("-.,@=", *p)) - *p = '_'; - p++; - } -#endif +#else /* UNIX */ -#ifndef G_OS_WIN32 - g_message ("warning: no home directory."); -#endif - subdir_name = g_strconcat (GIMPDIR ".", user_name, NULL); - gimp_dir = g_build_filename (gimp_data_directory (), - subdir_name, - NULL); - g_free (user_name); - g_free (subdir_name); - } + /* g_get_user_config_dir () always returns a path as a non-null + * and non-empty string + */ + gimp_dir = g_build_filename (g_get_user_config_dir (), + GIMPDIR, GIMP_USER_VERSION, NULL); #endif /* PLATFORM_OSX */ } @@ -295,6 +291,28 @@ gimp_directory (void) #ifdef G_OS_WIN32 +/* Taken and slightly modified from glib 2.34.0 code. */ +static gchar * +get_special_folder (int csidl) +{ + wchar_t path[MAX_PATH+1]; + HRESULT hr; + LPITEMIDLIST pidl = NULL; + BOOL b; + gchar *retval = NULL; + + hr = SHGetFolderLocation (NULL, csidl, NULL, 0, &pidl); + if (hr == S_OK) + { + b = SHGetPathFromIDListW (pidl, path); + if (b) + retval = g_utf16_to_utf8 (path, -1, NULL, NULL, NULL); + CoTaskMemFree (pidl); + } + + return retval; +} + static HMODULE libgimpbase_dll = NULL; /* Minimal DllMain that just stores the handle to this DLL */