[gthumb] use the default save question dialog on a quit session signal



commit 0a974f348e62f20518adee7021b66cc6eb7b4da8
Author: Paolo Bacchilega <paobac src gnome org>
Date:   Thu Jan 6 20:47:11 2011 +0100

    use the default save question dialog on a quit session signal

 gthumb/gth-browser.c |   31 +++++++++---------
 gthumb/gth-browser.h |    8 ++++-
 gthumb/main.c        |   84 ++++++++++++++++++++++++++++----------------------
 3 files changed, 70 insertions(+), 53 deletions(-)
---
diff --git a/gthumb/gth-browser.c b/gthumb/gth-browser.c
index 4f71c75..e6a2913 100644
--- a/gthumb/gth-browser.c
+++ b/gthumb/gth-browser.c
@@ -76,7 +76,6 @@
 #define MIN_VIEWER_SIZE 256
 #define STATUSBAR_SEPARATOR " · "
 
-typedef void (*GthBrowserCallback) (GthBrowser *, gboolean cancelled, gpointer user_data);
 
 enum {
 	LOCATION_READY,
@@ -1840,7 +1839,7 @@ _gth_browser_load (GthBrowser *browser,
 }
 
 
-/* -- _gth_browser_ask_whether_to_save -- */
+/* -- gth_browser_ask_whether_to_save -- */
 
 
 typedef struct {
@@ -1901,10 +1900,10 @@ ask_whether_to_save__response_cb (GtkWidget   *dialog,
 }
 
 
-static void
-_gth_browser_ask_whether_to_save (GthBrowser         *browser,
-				  GthBrowserCallback  callback,
-				  gpointer            user_data)
+void
+gth_browser_ask_whether_to_save (GthBrowser         *browser,
+				 GthBrowserCallback  callback,
+				 gpointer            user_data)
 {
 	AskSaveData *data;
 	char        *title;
@@ -1915,6 +1914,8 @@ _gth_browser_ask_whether_to_save (GthBrowser         *browser,
 	data->callback = callback;
 	data->user_data = user_data;
 
+	gtk_window_present (GTK_WINDOW (browser));
+
 	title = g_strdup_printf (_("Save changes to file '%s'?"), g_file_info_get_display_name (browser->priv->current_file->info));
 	d = _gtk_message_dialog_new (GTK_WINDOW (browser),
 				     GTK_DIALOG_MODAL,
@@ -2110,9 +2111,9 @@ _gth_browser_close (GthWindow *window)
 	if (eel_gconf_get_boolean (PREF_MSG_SAVE_MODIFIED_IMAGE, DEFAULT_MSG_SAVE_MODIFIED_IMAGE)
 	    && gth_browser_get_file_modified (browser))
 	{
-		_gth_browser_ask_whether_to_save (browser,
-						  close__file_saved_cb,
-						  NULL);
+		gth_browser_ask_whether_to_save (browser,
+						 close__file_saved_cb,
+						 NULL);
 	}
 	else
 		_gth_browser_real_close (browser);
@@ -2246,9 +2247,9 @@ _gth_browser_set_current_page (GthWindow *window,
 	if (eel_gconf_get_boolean (PREF_MSG_SAVE_MODIFIED_IMAGE, DEFAULT_MSG_SAVE_MODIFIED_IMAGE)
 	    && gth_browser_get_file_modified (browser))
 	{
-		_gth_browser_ask_whether_to_save (browser,
-						  set_current_page__file_saved_cb,
-						  GINT_TO_POINTER (page));
+		gth_browser_ask_whether_to_save (browser,
+						 set_current_page__file_saved_cb,
+						 GINT_TO_POINTER (page));
 	}
 	else
 		_gth_browser_real_set_current_page (window, page);
@@ -5342,9 +5343,9 @@ load_file_delayed_cb (gpointer user_data)
 	    && gth_browser_get_file_modified (browser))
 	{
 		load_file_data_ref (data);
-		_gth_browser_ask_whether_to_save (browser,
-						  load_file__previuos_file_saved_cb,
-						  data);
+		gth_browser_ask_whether_to_save (browser,
+						 load_file__previuos_file_saved_cb,
+						 data);
 	}
 	else
 		_gth_browser_load_file (data->browser, data->file_data, data->view);
diff --git a/gthumb/gth-browser.h b/gthumb/gth-browser.h
index 11c4632..db4cbcf 100644
--- a/gthumb/gth-browser.h
+++ b/gthumb/gth-browser.h
@@ -42,6 +42,8 @@ typedef struct _GthBrowser            GthBrowser;
 typedef struct _GthBrowserClass       GthBrowserClass;
 typedef struct _GthBrowserPrivateData GthBrowserPrivateData;
 
+typedef void (*GthBrowserCallback) (GthBrowser *, gboolean cancelled, gpointer user_data);
+
 typedef enum { /*< skip >*/
 	GTH_BROWSER_PAGE_BROWSER = 0,
 	GTH_BROWSER_PAGE_VIEWER,
@@ -177,7 +179,11 @@ void             gth_browser_fullscreen             (GthBrowser       *browser);
 void             gth_browser_unfullscreen           (GthBrowser       *browser);
 void             gth_browser_file_menu_popup        (GthBrowser       *browser,
 						     GdkEventButton   *event);
-GthFileData *    gth_browser_get_folder_popup_file_data (GthBrowser *browser);
+GthFileData *    gth_browser_get_folder_popup_file_data (GthBrowser   *browser);
+void             gth_browser_ask_whether_to_save    (GthBrowser       *browser,
+				 	 	     GthBrowserCallback
+				 	 	     	     	       callback,
+				 	 	     gpointer          user_data);
 
 /* protected methods */
 
diff --git a/gthumb/main.c b/gthumb/main.c
index 33fd1d7..1ea5522 100644
--- a/gthumb/main.c
+++ b/gthumb/main.c
@@ -141,41 +141,27 @@ gth_save_state (EggSMClient *client,
 }
 
 
-static void
-dialog_response (GtkDialog *dialog, int response, gpointer user_data)
-{
-	EggSMClient *client = user_data;
+/* quit_requested handler for the master client */
 
-	gtk_widget_destroy (GTK_WIDGET (dialog));
-	egg_sm_client_will_quit (client, (response != GTK_RESPONSE_NO));
-}
+
+static GList *client_window = NULL;
+
+
+static void modified_file_saved_cb (GthBrowser  *browser,
+				    gboolean     cancelled,
+				    gpointer     user_data);
 
 
-/* quit_requested handler for the master client */
 static void
-client_quit_requested_cb (EggSMClient *client, gpointer data)
+check_whether_to_save (EggSMClient *client)
 {
-	GList      *scan;
-	gboolean    modified_file;
-	for (scan = gth_window_get_window_list (); scan; scan = scan->next) {
-		GtkWidget *window = scan->data;
-
-		g_assert (GTH_IS_BROWSER (window));
-		modified_file = gth_browser_get_file_modified (GTH_BROWSER (window));
-
-		if (modified_file) {
-			GtkWidget *dialog;
-
-			dialog = gtk_message_dialog_new (GTK_WINDOW (window),
-							 GTK_DIALOG_MODAL,
-							 GTK_MESSAGE_QUESTION,
-							 GTK_BUTTONS_YES_NO,
-							 N_("There are unsaved changes, you want to log out?"));
-			g_signal_connect (dialog,
-					  "response",
-					  G_CALLBACK (dialog_response),
-					  client);
-			gtk_widget_show (GTK_WIDGET (dialog));
+	for (/* void */; client_window; client_window = client_window->next) {
+		GtkWidget *window = client_window->data;
+
+		if (gth_browser_get_file_modified (GTH_BROWSER (window))) {
+			gth_browser_ask_whether_to_save (GTH_BROWSER (window),
+							 modified_file_saved_cb,
+							 client);
 			return;
 		}
 	}
@@ -184,9 +170,35 @@ client_quit_requested_cb (EggSMClient *client, gpointer data)
 }
 
 
-/* quit handler for the master client */
 static void
-client_quit_cb (EggSMClient *client, gpointer data)
+modified_file_saved_cb (GthBrowser *browser,
+			gboolean    cancelled,
+			gpointer    user_data)
+{
+	EggSMClient *client = user_data;
+
+	if (cancelled) {
+		egg_sm_client_will_quit (client, FALSE);
+	}
+	else {
+		client_window = client_window->next;
+		check_whether_to_save (client);
+	}
+}
+
+
+static void
+client_quit_requested_cb (EggSMClient *client,
+			  gpointer     data)
+{
+	client_window = gth_window_get_window_list ();
+	check_whether_to_save (client);
+}
+
+
+static void
+client_quit_cb (EggSMClient *client,
+		gpointer     data)
 {
 	gtk_main_quit ();
 }
@@ -196,22 +208,20 @@ static void
 gth_session_manager_init (void)
 {
 	EggSMClient *client = NULL;
-	client = egg_sm_client_get ();
 
+	client = egg_sm_client_get ();
 	g_signal_connect (client,
 			  "save_state",
 			  G_CALLBACK (gth_save_state),
 			  NULL);
-
 	g_signal_connect (client,
 			  "quit_requested",
 			  G_CALLBACK (client_quit_requested_cb),
 			  NULL);
-
 	g_signal_connect (client,
 			  "quit",
 			  G_CALLBACK (client_quit_cb),
-			  NULL);	
+			  NULL);
 }
 
 
@@ -219,7 +229,7 @@ static void
 gth_restore_session (EggSMClient *client)
 {
 	GKeyFile *state = NULL;
-	guint i;
+	guint     i;
 
 	state = egg_sm_client_get_state_file (client);
 



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]