(init_environment): Default HOME directory to user's

appdata directory if possible.
This commit is contained in:
Jason Rumney 2005-07-14 22:32:50 +00:00
parent 58ba2f8f07
commit 2d5324c520
2 changed files with 42 additions and 2 deletions

View file

@ -1,3 +1,8 @@
2005-07-14 Jason Rumney <jasonr@gnu.org>
* w32.c (init_environment): Default HOME directory to user's
appdata directory if possible.
2005-07-14 Kim F. Storm <storm@cua.dk>
* .gdbinit (pitx): Fix output format. Print string charpos.

View file

@ -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,