Mercurial > pidgin.yaz
diff src/win32/win32dep.c @ 10673:179b0245a2f7
[gaim-migrate @ 12213]
This is patches 1115963 and 1115968 from rlaager, implementation of wgaim_get_special_folder() and using it to specify a sane default for the file chooser.
committer: Tailor Script <tailor@pidgin.im>
author | Daniel Atallah <daniel.atallah@gmail.com> |
---|---|
date | Tue, 08 Mar 2005 03:15:37 +0000 |
parents | 0f7452b1f777 |
children | 2b772e7094ef |
line wrap: on
line diff
--- a/src/win32/win32dep.c Tue Mar 08 02:37:07 2005 +0000 +++ b/src/win32/win32dep.c Tue Mar 08 03:15:37 2005 +0000 @@ -27,7 +27,6 @@ #include <stdlib.h> #include <stdio.h> #include <winuser.h> -#include <shlobj.h> #include <gtk/gtk.h> #include <glib.h> @@ -53,6 +52,8 @@ #include <libintl.h> +#include "win32dep.h" + /* * DEFINES & MACROS */ @@ -83,7 +84,7 @@ /* * LOCALS */ -static char app_data_dir[MAX_PATH + 1] = "C:"; +static char *app_data_dir; static char install_dir[MAXPATHLEN]; static char lib_dir[MAXPATHLEN]; static char locale_dir[MAXPATHLEN]; @@ -99,8 +100,6 @@ * PROTOS */ LPFNFLASHWINDOWEX MyFlashWindowEx = NULL; -LPFNSHGETFOLDERPATHA MySHGetFolderPathA = NULL; -LPFNSHGETFOLDERPATHW MySHGetFolderPathW = NULL; FARPROC wgaim_find_and_loadproc(char*, char*); extern void wgaim_gtkspell_init(); @@ -233,6 +232,50 @@ /* Determine Gaim Paths during Runtime */ +/* Get paths to special Windows folders. */ +char *wgaim_get_special_folder(int folder_type) { + static LPFNSHGETFOLDERPATHA MySHGetFolderPathA = NULL; + char *retval = NULL; +#if GLIB_CHECK_VERSION(2,6,0) + static LPFNSHGETFOLDERPATHW MySHGetFolderPathW = NULL; + + if (!MySHGetFolderPathW) { + MySHGetFolderPathW = (LPFNSHGETFOLDERPATHW) + wgaim_find_and_loadproc("shfolder.dll", "SHGetFolderPathW"); + } + + if (MySHGetFolderPathW) { + wchar_t utf_16_dir[MAX_PATH + 1]; + + if (SUCCEEDED(MySHGetFolderPathW(NULL, folder_type, NULL, + SHGFP_TYPE_CURRENT, utf_16_dir))) { + retval = g_utf16_to_utf8(utf_16_dir, -1, NULL, NULL, NULL); + } + } +#endif + + if (!retval) { + if (!MySHGetFolderPathA) { + MySHGetFolderPathA = (LPFNSHGETFOLDERPATHA) + wgaim_find_and_loadproc("shfolder.dll", "SHGetFolderPathA"); + } + if (MySHGetFolderPathA) { + char locale_dir[MAX_PATH + 1]; + + if (SUCCEEDED(MySHGetFolderPathA(NULL, folder_type, NULL, + SHGFP_TYPE_CURRENT, locale_dir))) { +#if GLIB_CHECK_VERSION(2,6,0) + retval = g_locale_to_utf8(locale_dir, -1, NULL, NULL, NULL); +#else + retval = g_strdup(locale_dir); +#endif + } + } + } + + return retval; +} + char* wgaim_install_dir(void) { HMODULE hmod; char* buf; @@ -270,7 +313,7 @@ } char* wgaim_data_dir(void) { - return (char*)&app_data_dir; + return app_data_dir; } /* Miscellaneous */ @@ -452,40 +495,17 @@ g_free(newenv); /* Set app data dir, used by gaim_home_dir */ - newenv = (char*)g_getenv("GAIMHOME"); - if(!newenv) { -#if GLIB_CHECK_VERSION(2,6,0) - if ((MySHGetFolderPathW = (LPFNSHGETFOLDERPATHW) wgaim_find_and_loadproc("shfolder.dll", "SHGetFolderPathW"))) { - wchar_t utf_16_dir[MAX_PATH +1]; - char *temp; - MySHGetFolderPathW(NULL, CSIDL_APPDATA, NULL, - SHGFP_TYPE_CURRENT, utf_16_dir); - temp = g_utf16_to_utf8(utf_16_dir, -1, NULL, NULL, NULL); - g_strlcpy(app_data_dir, temp, sizeof(app_data_dir)); - g_free(temp); - } else if ((MySHGetFolderPathA = (LPFNSHGETFOLDERPATHA) wgaim_find_and_loadproc("shfolder.dll", "SHGetFolderPathA"))) { - char locale_dir[MAX_PATH + 1]; - char *temp; - MySHGetFolderPathA(NULL, CSIDL_APPDATA, NULL, - SHGFP_TYPE_CURRENT, locale_dir); - temp = g_locale_to_utf8(locale_dir, -1, NULL, NULL, NULL); - g_strlcpy(app_data_dir, temp, sizeof(app_data_dir)); - g_free(temp); - } -#else - if ((MySHGetFolderPathA = (LPFNSHGETFOLDERPATHA) wgaim_find_and_loadproc("shfolder.dll", "SHGetFolderPathA"))) { - MySHGetFolderPathA(NULL, CSIDL_APPDATA, NULL, - SHGFP_TYPE_CURRENT, app_data_dir); - } -#endif - else { - strcpy(app_data_dir, "C:"); + newenv = (char*) g_getenv("GAIMHOME"); + if (newenv) { + app_data_dir = g_strdup(newenv); + } else { + app_data_dir = wgaim_get_special_folder(CSIDL_APPDATA); + if (!app_data_dir) { + app_data_dir = g_strdup("C:"); } } - else { - g_strlcpy(app_data_dir, newenv, sizeof(app_data_dir)); - } - gaim_debug(GAIM_DEBUG_INFO, "wgaim", "Gaim settings dir: %s\n", app_data_dir); + + gaim_debug(GAIM_DEBUG_INFO, "wgaim", "Gaim settings dir: %s\n", app_data_dir); /* IdleTracker Initialization */ if(!wgaim_set_idlehooks()) @@ -505,6 +525,8 @@ /* Idle tracker cleanup */ wgaim_remove_idlehooks(); + + g_free(app_data_dir); } /* DLL initializer */