diff options
author | Jason Rumney <jasonr@gnu.org> | 2005-07-14 22:32:50 +0000 |
---|---|---|
committer | Jason Rumney <jasonr@gnu.org> | 2005-07-14 22:32:50 +0000 |
commit | 2d5324c520af20bfb115b7c1318a22437b24dbdd (patch) | |
tree | 83337195d7016e8839ba88337a9c80c3da0483f8 /src/w32.c | |
parent | 58ba2f8f07424c7cbbc74fb62276e33de8142d21 (diff) | |
download | emacs-2d5324c520af20bfb115b7c1318a22437b24dbdd.tar.gz emacs-2d5324c520af20bfb115b7c1318a22437b24dbdd.tar.bz2 emacs-2d5324c520af20bfb115b7c1318a22437b24dbdd.zip |
(init_environment): Default HOME directory to user's
appdata directory if possible.
Diffstat (limited to 'src/w32.c')
-rw-r--r-- | src/w32.c | 39 |
1 files changed, 37 insertions, 2 deletions
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 <stddef.h> /* for offsetof */ #include <stdlib.h> #include <stdio.h> @@ -73,6 +71,7 @@ Boston, MA 02110-1301, USA. #define _ANONYMOUS_STRUCT #endif #include <windows.h> +#include <shlobj.h> #ifdef HAVE_SOCKETS /* TCP connection support, if kernel can do it */ #include <sys/socket.h> @@ -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, |