changeset 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 0925c898b73c
children 9aa1d4adf3e9
files src/gtkrequest.c src/win32/win32dep.c src/win32/win32dep.h
diffstat 3 files changed, 84 insertions(+), 42 deletions(-) [+]
line wrap: on
line diff
--- a/src/gtkrequest.c	Tue Mar 08 02:37:07 2005 +0000
+++ b/src/gtkrequest.c	Tue Mar 08 03:15:37 2005 +0000
@@ -1654,6 +1654,9 @@
 	GaimGtkRequestData *data;
 	GtkWidget *filesel;
 	const gchar *current_folder;
+#if GTK_CHECK_VERSION(2,4,0)
+	gboolean folder_set = FALSE;
+#endif
 
 	data = g_new0(GaimGtkRequestData, 1);
 	data->type = GAIM_REQUEST_FILE;
@@ -1683,17 +1686,32 @@
 	} else {
 		current_folder = gaim_prefs_get_string("/gaim/gtk/filelocations/last_open_folder");
 	}
+
 	if (filename != NULL)
 		gtk_file_chooser_set_current_name(GTK_FILE_CHOOSER(filesel), filename);
-	if ((current_folder != NULL) && (*current_folder != '\0'))
-		gtk_file_chooser_set_current_folder(GTK_FILE_CHOOSER(filesel), current_folder);
+	if ((current_folder != NULL) && (*current_folder != '\0')) {
+		folder_set = gtk_file_chooser_set_current_folder(GTK_FILE_CHOOSER(filesel), current_folder);
+	}
+
+#ifdef _WIN32
+	if (!folder_set) {
+		char *my_documents = wgaim_get_special_folder(CSIDL_PERSONAL);
 
+		if (my_documents != NULL) {
+			gtk_file_chooser_set_current_folder(
+					GTK_FILE_CHOOSER(filesel), my_documents);
+
+			g_free(my_documents);
+		}
+	}
+
+#endif
 	g_signal_connect(G_OBJECT(GTK_FILE_CHOOSER(filesel)), "response",
 					 G_CALLBACK(file_ok_check_if_exists_cb), data);
 #else /* FILECHOOSER */
-	filesel = gtk_file_selection_new(title ? title
-										   : (savedialog ? _("Save File...")
-														 : _("Open File...")));
+	filesel = gtk_file_selection_new(
+			title ? title : (savedialog ? _("Save File...")
+				: _("Open File...")));
 	if (savedialog) {
 		current_folder = gaim_prefs_get_string("/gaim/gtk/filelocations/last_save_folder");
 	} else {
--- 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 */
--- a/src/win32/win32dep.h	Tue Mar 08 02:37:07 2005 +0000
+++ b/src/win32/win32dep.h	Tue Mar 08 03:15:37 2005 +0000
@@ -22,6 +22,7 @@
  */
 #ifndef _WIN32DEP_H_
 #define _WIN32DEP_H_
+#include <shlobj.h>
 #include <winsock2.h>
 #include <process.h>
 #include <gtk/gtk.h>
@@ -42,6 +43,7 @@
 extern gboolean  wgaim_read_reg_string(HKEY key, char* sub_key, char* val_name, LPBYTE data, LPDWORD data_len);
 extern char*     wgaim_escape_dirsep(char*);
 /* Determine Gaim paths */
+extern char*     wgaim_get_special_folder(int folder_type); /* needs to be g_free'd */
 extern char*     wgaim_install_dir(void);
 extern char*     wgaim_lib_dir(void);
 extern char*     wgaim_locale_dir(void);