diff options
Diffstat (limited to 'src/w32.c')
-rw-r--r-- | src/w32.c | 42 |
1 files changed, 39 insertions, 3 deletions
diff --git a/src/w32.c b/src/w32.c index 77959037913..c7f6e3172f9 100644 --- a/src/w32.c +++ b/src/w32.c @@ -1,5 +1,6 @@ /* Utility and Unix shadow routines for GNU Emacs on the Microsoft W32 API. - Copyright (C) 1994, 1995, 2000, 2001 Free Software Foundation, Inc. + Copyright (C) 1994, 1995, 2000, 2001, 2002, 2003, 2004, + 2005 Free Software Foundation, Inc. This file is part of GNU Emacs. @@ -20,8 +21,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 +72,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 +100,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 +906,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 +947,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 +971,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, |