From: Jason Rumney Date: Thu, 14 Jul 2005 22:32:50 +0000 (+0000) Subject: (init_environment): Default HOME directory to user's X-Git-Tag: emacs-pretest-22.0.90~8143 X-Git-Url: http://git.eshelyaron.com/gitweb/?a=commitdiff_plain;h=2d5324c520af20bfb115b7c1318a22437b24dbdd;p=emacs.git (init_environment): Default HOME directory to user's appdata directory if possible. --- diff --git a/src/ChangeLog b/src/ChangeLog index 193ba688082..98799338e4c 100644 --- a/src/ChangeLog +++ b/src/ChangeLog @@ -1,3 +1,8 @@ +2005-07-14 Jason Rumney + + * w32.c (init_environment): Default HOME directory to user's + appdata directory if possible. + 2005-07-14 Kim F. Storm * .gdbinit (pitx): Fix output format. Print string charpos. diff --git a/src/w32.c b/src/w32.c index 77959037913..25283c3b4c6 100644 --- a/src/w32.c +++ b/src/w32.c @@ -20,8 +20,6 @@ Boston, MA 02110-1301, USA. Geoff Voelker (voelker@cs.washington.edu) 7-29-94 */ - - #include /* for offsetof */ #include #include @@ -73,6 +71,7 @@ Boston, MA 02110-1301, USA. #define _ANONYMOUS_STRUCT #endif #include +#include #ifdef HAVE_SOCKETS /* TCP connection support, if kernel can do it */ #include @@ -100,6 +99,9 @@ Boston, MA 02110-1301, USA. #include "w32heap.h" #include "systime.h" +typedef HRESULT (WINAPI * ShGetFolderPath_fn) + (IN HWND, IN int, IN HANDLE, IN DWORD, OUT char *); + void globals_of_w32 (); extern Lisp_Object Vw32_downcase_file_names; @@ -903,7 +905,9 @@ init_environment (char ** argv) static const char * const tempdirs[] = { "$TMPDIR", "$TEMP", "$TMP", "c:/" }; + int i; + const int imax = sizeof (tempdirs) / sizeof (tempdirs[0]); /* Make sure they have a usable $TMPDIR. Many Emacs functions use @@ -942,6 +946,8 @@ init_environment (char ** argv) LPBYTE lpval; DWORD dwType; char locale_name[32]; + struct stat ignored; + char default_home[MAX_PATH]; static struct env_entry { @@ -964,6 +970,35 @@ init_environment (char ** argv) {"LANG", NULL}, }; + /* For backwards compatibility, check if a .emacs file exists in C:/ + If not, then we can try to default to the appdata directory under the + user's profile, which is more likely to be writable. */ + if (stat ("C:/.emacs", &ignored) < 0) + { + HRESULT profile_result; + /* Dynamically load ShGetFolderPath, as it won't exist on versions + of Windows 95 and NT4 that have not been updated to include + MSIE 5. Also we don't link with shell32.dll by default. */ + HMODULE shell32_dll; + ShGetFolderPath_fn get_folder_path; + shell32_dll = GetModuleHandle ("shell32.dll"); + get_folder_path = (ShGetFolderPath_fn) + GetProcAddress (shell32_dll, "SHGetFolderPathA"); + + if (get_folder_path != NULL) + { + profile_result = get_folder_path (NULL, CSIDL_APPDATA, NULL, + 0, default_home); + + /* If we can't get the appdata dir, revert to old behaviour. */ + if (profile_result == S_OK) + env_vars[0].def_value = default_home; + } + + /* Unload shell32.dll, it is not needed anymore. */ + FreeLibrary (shell32_dll); + } + /* Get default locale info and use it for LANG. */ if (GetLocaleInfo (LOCALE_USER_DEFAULT, LOCALE_SABBREVLANGNAME | LOCALE_USE_CP_ACP,