diff src/gtkdebug.c @ 9480:91856b52a391

[gaim-migrate @ 10305] Make the debug window's save button use the gtk 2.4 file chooser. I'll ChangeLog this when I'm done with all the dialogs. The code isn't the prettiest thing in the world... but I don't see a better way. And I'm about to test this on a gtk less than 2.4, once I commit it. committer: Tailor Script <tailor@pidgin.im>
author Mark Doliner <mark@kingant.net>
date Thu, 08 Jul 2004 01:24:48 +0000
parents 0277908e367d
children b917acdc982f
line wrap: on
line diff
--- a/src/gtkdebug.c	Wed Jul 07 22:06:44 2004 +0000
+++ b/src/gtkdebug.c	Thu Jul 08 01:24:48 2004 +0000
@@ -24,6 +24,7 @@
  */
 #include "gtkinternal.h"
 
+#include "notify.h"
 #include "prefs.h"
 #include "request.h"
 #include "util.h"
@@ -42,6 +43,7 @@
 	GtkWidget *window;
 	GtkWidget *text;
 	GtkWidget *find;
+	GtkWidget *save;
 
 	gboolean timestamps;
 	gboolean paused;
@@ -71,12 +73,14 @@
 {
 	if (debug_win->timestamps_handle != 0)
 		gaim_prefs_disconnect_callback(debug_win->timestamps_handle);
-
-	gaim_prefs_set_bool("/gaim/gtk/debug/enabled", FALSE);
+	if (debug_win->save != NULL)
+		gtk_widget_destroy(debug_win->save);
 
 	g_free(debug_win);
 	debug_win = NULL;
 
+	gaim_prefs_set_bool("/gaim/gtk/debug/enabled", FALSE);
+
 	return FALSE;
 }
 
@@ -168,73 +172,128 @@
 }
 
 static void
-do_save_cb(GtkWidget *wid)
+do_save_cb(GtkWidget *widget)
 {
-	DebugWindow *win = NULL;
 	const char *filename;
 	char *tmp;
 	FILE *fp;
 
-	win = g_object_get_data(G_OBJECT(GTK_FILE_SELECTION(wid)->ok_button),
-							"gaim_debugwin");
+	g_return_if_fail(debug_win != NULL);
 
-	filename = gtk_file_selection_get_filename(GTK_FILE_SELECTION(wid));
-	gtk_widget_destroy(wid);
+#if GTK_CHECK_VERSION(2,4,0) /* FILECHOOSER */
+	filename = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(debug_win->save));
+#else /* FILECHOOSER */
+	filename = gtk_file_selection_get_filename(GTK_FILE_SELECTION(debug_win->save));
+#endif /* FILECHOOSER */
 
-	if (filename == NULL)
+	if (filename == NULL) {
+		gaim_notify_error(NULL, NULL, _("Invalid file name."), NULL);
 		return;
-
-	if ((fp = fopen(filename, "w+")) == NULL)
-		return;
+	}
 
-	if (debug_win == NULL)
+	if ((fp = fopen(filename, "w+")) == NULL) {
+		gaim_notify_error(NULL, NULL, _("Unable to open file."), NULL);
 		return;
+	}
 
-	tmp = gtk_imhtml_get_text(GTK_IMHTML(win->text), NULL, NULL);
+	tmp = gtk_imhtml_get_text(GTK_IMHTML(debug_win->text), NULL, NULL);
 	fprintf(fp, "Gaim Debug log : %s\n", gaim_date_full());
 	fprintf(fp, "%s", tmp);
 	g_free(tmp);
 
 	fclose(fp);
+
+	gtk_widget_destroy(debug_win->save);
+	debug_win->save = NULL;
 }
 
+#if GTK_CHECK_VERSION(2,4,0) /* FILECHOOSER */
 static void
-do_check_save_cb(GtkObject *obj, GtkWidget *wid)
+do_check_save_cb(GtkWidget *widget, gint response, gpointer data)
+{
+	DebugWindow *win = (DebugWindow *)data;
+	const char *filename;
+
+	if (response != GTK_RESPONSE_ACCEPT) {
+		if (response == GTK_RESPONSE_CANCEL)
+			gtk_widget_destroy(win->save);
+		win->save = NULL;
+		return;
+	}
+
+	filename = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(win->save));
+#else /* FILECHOOSER */
+static void
+do_check_save_cb(GtkWidget *widget, DebugWindow *win)
 {
 	const char *filename;
 
-	filename = gtk_file_selection_get_filename(GTK_FILE_SELECTION(wid));
-	if (gaim_gtk_check_if_dir(filename, GTK_FILE_SELECTION(wid)))
+	filename = gtk_file_selection_get_filename(GTK_FILE_SELECTION(win->save));
+	if (gaim_gtk_check_if_dir(filename, GTK_FILE_SELECTION(win->save))) {
+		/* Descend into directory? */
 		return;
+	}
+#endif /* FILECHOOSER */
 
 	if (g_file_test(filename, G_FILE_TEST_EXISTS))
 	{
 		gaim_request_yes_no(NULL, NULL, _("That file already exists"),
-							_("Would you like to overwrite it?"), 1, wid,
-							G_CALLBACK(do_save_cb), NULL);
+							_("Would you like to overwrite it?"), 1,
+							win->save, G_CALLBACK(do_save_cb), NULL);
 	}
 	else
-		do_save_cb(wid);
+		do_save_cb(win->save);
 }
 
+#if !GTK_CHECK_VERSION(2,4,0) /* FILECHOOSER */
+static void
+cancel_save_cb(GtkWidget *widget, DebugWindow *win)
+{
+	if (win->save != NULL)
+		gtk_widget_destroy(win->save);
+
+	win->save = NULL;
+}
+#endif
+
 static void
 save_cb(GtkWidget *w, DebugWindow *win)
 {
-	char buf[BUF_LONG];
-	GtkWidget *window;
+	if (win->save != NULL) {
+		gtk_widget_show(win->save);
+		gdk_window_raise(win->save->window);
+		return;
+	}
 
-	window = gtk_file_selection_new(_("Save Debug Log"));
-	g_snprintf(buf, sizeof(buf), "%s" G_DIR_SEPARATOR_S "gaim-debug.log",
-			   gaim_home_dir());
-	gtk_file_selection_set_filename(GTK_FILE_SELECTION(window), buf);
-	g_object_set_data(G_OBJECT(GTK_FILE_SELECTION(window)->ok_button),
-					  "gaim_debugwin", win);
-	g_signal_connect(G_OBJECT(GTK_FILE_SELECTION(window)->ok_button),
-					 "clicked", G_CALLBACK(do_check_save_cb), window);
-	g_signal_connect_swapped(G_OBJECT(GTK_FILE_SELECTION(window)->cancel_button),
-							 "clicked", G_CALLBACK(gtk_widget_destroy), (gpointer)window);
+#if GTK_CHECK_VERSION(2,4,0) /* FILECHOOSER */
+	win->save = gtk_file_chooser_dialog_new(_("Save Conversation"),
+					GTK_WINDOW(win->window),
+					GTK_FILE_CHOOSER_ACTION_SAVE,
+					GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
+					GTK_STOCK_SAVE, GTK_RESPONSE_ACCEPT,
+					NULL);
+	gtk_dialog_set_default_response(GTK_DIALOG(win->save), GTK_RESPONSE_ACCEPT);
+	gtk_file_chooser_set_current_name(GTK_FILE_CHOOSER(win->save),
+									  "gaim-debug.log");
+	g_signal_connect(G_OBJECT(win->save),
+					 "response", G_CALLBACK(do_check_save_cb), win->save);
+#else /* FILECHOOSER */
+	gchar *buf;
 
-	gtk_widget_show(window);
+	win->save = gtk_file_selection_new(_("Save Debug Log"));
+	buf = g_strdup_printf("%s" G_DIR_SEPARATOR_S "gaim-debug.log",
+						  gaim_home_dir());
+	gtk_file_selection_set_filename(GTK_FILE_SELECTION(win->save), buf);
+	g_free(buf);
+	g_signal_connect(G_OBJECT(GTK_FILE_SELECTION(win->save)->ok_button),
+					 "clicked", G_CALLBACK(do_check_save_cb), win);
+	g_signal_connect(G_OBJECT(GTK_FILE_SELECTION(win->save)->cancel_button),
+					 "clicked", G_CALLBACK(cancel_save_cb), win);
+	g_signal_connect(G_OBJECT(win->save),
+					 "destroy", G_CALLBACK(cancel_save_cb), win);
+#endif /* FILECHOOSER */
+
+	gtk_widget_show(win->save);
 }
 
 static void