# HG changeset patch # User Herman Bloggs # Date 1063661437 0 # Node ID 060aa79a733e30d8af4a24534df77fd5c9fe0327 # Parent 7de1b559cbbb43148f34c5630e2fbc0a18a1f812 [gaim-migrate @ 7393] Using SHGetFolderPath to determine windows gaim home directory committer: Tailor Script diff -r 7de1b559cbbb -r 060aa79a733e gaim-installer.nsi --- a/gaim-installer.nsi Mon Sep 15 13:29:22 2003 +0000 +++ b/gaim-installer.nsi Mon Sep 15 21:30:37 2003 +0000 @@ -348,6 +348,14 @@ File ..\win32-dev\drmingw\exchndl.dll !endif + ; Install shfolder.dll if need be.. + SearchPath $R4 "shfolder.dll" + StrCmp $R4 "" 0 got_shfolder + SetOutPath "$SYSDIR" + File ..\win32-dev\ms-deps\shfolder.dll + SetOutPath "$INSTDIR" + got_shfolder: + ; Check if Perl is installed, If not remove perl plugin ReadRegStr $R2 HKLM ${PERL_REG_KEY} "" StrCmp $R2 "" 0 perl_exists diff -r 7de1b559cbbb -r 060aa79a733e src/util.c --- a/src/util.c Mon Sep 15 13:29:22 2003 +0000 +++ b/src/util.c Mon Sep 15 21:30:37 2003 +0000 @@ -641,16 +641,14 @@ const gchar *gaim_home_dir() { +#ifndef _WIN32 if(g_get_home_dir()) return g_get_home_dir(); else -#ifndef _WIN32 return NULL; #else - /* Win9x and WinME don't have a home dir */ - return "C:"; + return wgaim_data_dir(); #endif - } /* returns a string of the form ~/.gaim, where ~ is replaced by the user's home diff -r 7de1b559cbbb -r 060aa79a733e src/win32/win32dep.c --- a/src/win32/win32dep.c Mon Sep 15 13:29:22 2003 +0000 +++ b/src/win32/win32dep.c Mon Sep 15 21:30:37 2003 +0000 @@ -60,6 +60,7 @@ /* * LOCALS */ +static char app_data_dir[MAX_PATH]; static char install_dir[MAXPATHLEN]; static char lib_dir[MAXPATHLEN]; static char locale_dir[MAXPATHLEN]; @@ -75,6 +76,8 @@ * PROTOS */ BOOL (*MyFlashWindowEx)(PFLASHWINFO pfwi)=NULL; +HRESULT (*SHGetFolderPath)(HWND, int, HANDLE, DWORD, LPTSTR) = NULL; + FARPROC wgaim_find_and_loadproc(char*, char*); extern void wgaim_gtkspell_init(); @@ -208,6 +211,10 @@ return (char*)&locale_dir; } +char* wgaim_data_dir(void) { + return (char*)&app_data_dir; +} + /* Miscellaneous */ gboolean wgaim_read_reg_string(HKEY key, char* sub_key, char* val_name, LPBYTE data, LPDWORD data_len) { @@ -411,6 +418,12 @@ } /* Windows Initializations */ +typedef enum { + SHGFP_TYPE_CURRENT = 0, // current value for user, verify it exists + SHGFP_TYPE_DEFAULT = 1, // default value, may not exist +} SHGFP_TYPE; + +#define CSIDL_APPDATA 0x001a void wgaim_pre_plugin_init(void) { char *perlenv, *newenv; @@ -425,6 +438,42 @@ if(putenv(newenv)<0) gaim_debug(GAIM_DEBUG_WARNING, "wgaim", "putenv failed\n"); g_free(newenv); + + /* Set app data dir, where to save Gaim user settings */ + newenv = (char*)g_getenv("HOME"); + if(!newenv) { + SHGetFolderPath = (void*)wgaim_find_and_loadproc("shfolder.dll", "SHGetFolderPathA"); + if(SHGetFolderPath) { + HRESULT hrResult = SHGetFolderPath(NULL, CSIDL_APPDATA, NULL, SHGFP_TYPE_CURRENT, app_data_dir); + if(hrResult != S_FALSE && hrResult != E_FAIL && hrResult != E_INVALIDARG) { + gaim_debug(GAIM_DEBUG_INFO, "wgaim", "APP DATA PATH set to: %s\n", app_data_dir); + } + else + strcpy(app_data_dir, "C:"); + } + + /* As of 0.69, using SHGetFolderPath to determine app settings directory. + Move app settings to new location if need be. */ + { + char *old_home = g_strdup_printf("%s%s", g_get_home_dir() ? g_get_home_dir() : "C:", "\\.gaim"); + char *new_home = g_strdup_printf("%s\\.gaim", wgaim_data_dir()); + GDir *dir_old, *dir_new; + + dir_old = g_dir_open(old_home, 0, NULL); + dir_new = g_dir_open(new_home, 0, NULL); + if(dir_old && !dir_new) { + if(MoveFile(old_home, new_home) != 0) + gaim_debug(GAIM_DEBUG_INFO, "wgaim", "Success moving '.gaim' directory\n"); + } + g_free(new_home); + g_free(old_home); + g_dir_close(dir_old); + g_dir_close(dir_new); + } + } + else { + strcpy(app_data_dir, newenv); + } } void wgaim_init(void) { diff -r 7de1b559cbbb -r 060aa79a733e src/win32/win32dep.h --- a/src/win32/win32dep.h Mon Sep 15 13:29:22 2003 +0000 +++ b/src/win32/win32dep.h Mon Sep 15 21:30:37 2003 +0000 @@ -44,6 +44,7 @@ extern char* wgaim_install_dir(void); extern char* wgaim_lib_dir(void); extern char* wgaim_locale_dir(void); +extern char* wgaim_data_dir(void); extern char* wgaim_escape_dirsep(char*); /* UI related */ extern void wgaim_im_blink(GtkWidget*);