Revision: 4483 http://geany.svn.sourceforge.net/geany/?rev=4483&view=rev Author: ntrel Date: 2009-12-08 16:26:11 +0000 (Tue, 08 Dec 2009)
Log Message: ----------- Refactor quitting code into main_save() and main_finalize() (patch by Eugene Arshinov, thanks).
Modified Paths: -------------- branches/sm/ChangeLog branches/sm/src/callbacks.c branches/sm/src/document.c branches/sm/src/document.h branches/sm/src/main.c branches/sm/src/main.h branches/sm/src/project.c branches/sm/src/project.h
Modified: branches/sm/ChangeLog =================================================================== --- branches/sm/ChangeLog 2009-12-08 16:06:57 UTC (rev 4482) +++ branches/sm/ChangeLog 2009-12-08 16:26:11 UTC (rev 4483) @@ -1,8 +1,12 @@ 2009-12-08 Nick Treleaven <nick(dot)treleaven(at)btinternet(dot)com>
* src/Makefile.am, configure.in, wscript: - Apply patch from Eugene Arshinov to detect libSM (X session management - library, thanks). + Detect libSM X session management library (patch by Eugene Arshinov, + thanks). + * src/project.c, src/project.h, src/callbacks.c, src/document.c, + src/document.h, src/main.c, src/main.h: + Refactor quitting code into main_save() and main_finalize() (patch by + Eugene Arshinov, thanks).
2009-12-08 Nick Treleaven <nick(dot)treleaven(at)btinternet(dot)com>
Modified: branches/sm/src/callbacks.c =================================================================== --- branches/sm/src/callbacks.c 2009-12-08 16:06:57 UTC (rev 4482) +++ branches/sm/src/callbacks.c 2009-12-08 16:26:11 UTC (rev 4483) @@ -90,21 +90,6 @@ /*static gboolean switch_tv_notebook_page = FALSE; */
-static gboolean check_no_unsaved(void) -{ - guint i; - - for (i = 0; i < documents_array->len; i++) - { - if (documents[i]->is_valid && documents[i]->changed) - { - return FALSE; - } - } - return TRUE; /* no unsaved edits */ -} - - /* set editor_info.click_pos to the current cursor position if insert_callback_from_menu is TRUE * to prevent invalid cursor positions which can cause segfaults */ static void verify_click_pos(GeanyDocument *doc) @@ -117,42 +102,26 @@ }
-/* should only be called from on_exit_clicked */ -static void quit_app(void) -{ - configuration_save(); - - if (app->project != NULL) - project_close(FALSE); /* save project session files */ - - document_close_all(); - - main_status.quitting = TRUE; - - main_quit(); -} - - /* wrapper function to abort exit process if cancel button is pressed */ gboolean on_exit_clicked (GtkWidget *widget, gpointer gdata) { + gboolean quit = TRUE; + main_status.quitting = TRUE;
- if (! check_no_unsaved()) + if (!document_any_unsaved() && prefs.confirm_exit) { - if (document_account_for_unsaved()) - { - quit_app(); - return FALSE; - } - } - else - if (! prefs.confirm_exit || - dialogs_show_question_full(NULL, GTK_STOCK_QUIT, GTK_STOCK_CANCEL, NULL, + /* Ask for confirmation only if there are no unsaved documents. + * If any documents are unsaved, user will be asked in main_save(). */ + if (!dialogs_show_question_full(NULL, GTK_STOCK_QUIT, GTK_STOCK_CANCEL, NULL, _("Do you really want to quit?"))) + quit = FALSE; + } + + if (quit && main_save(TRUE)) { - quit_app(); + main_finalize(); return FALSE; }
@@ -239,7 +208,7 @@ on_close_all1_activate (GtkMenuItem *menuitem, gpointer user_data) { - document_close_all(); + document_close_all(FALSE); }
@@ -1824,7 +1793,7 @@ on_project_close1_activate (GtkMenuItem *menuitem, gpointer user_data) { - project_close(TRUE); + project_close(TRUE, TRUE); }
Modified: branches/sm/src/document.c =================================================================== --- branches/sm/src/document.c 2009-12-08 16:06:57 UTC (rev 4482) +++ branches/sm/src/document.c 2009-12-08 16:26:11 UTC (rev 4483) @@ -2850,6 +2850,18 @@ }
+/* @return TRUE if there are some unsaved documents */ +gboolean document_any_unsaved(void) +{ + guint i; + + foreach_document(i) + if (documents[i]->changed) + return TRUE; + return FALSE; +} + + /* @note If successful, this should always be followed up with a call to * document_close_all(). * @return TRUE if all files were saved or had their changes discarded. */ @@ -2904,13 +2916,12 @@ }
-gboolean document_close_all(void) +gboolean document_close_all(gboolean force) { - if (! document_account_for_unsaved()) + if (!force && !document_account_for_unsaved()) return FALSE;
force_close_all(); - return TRUE; }
Modified: branches/sm/src/document.h =================================================================== --- branches/sm/src/document.h 2009-12-08 16:06:57 UTC (rev 4482) +++ branches/sm/src/document.h 2009-12-08 16:26:11 UTC (rev 4483) @@ -196,9 +196,11 @@
gboolean document_close(GeanyDocument *doc);
+gboolean document_any_unsaved(void); + gboolean document_account_for_unsaved(void);
-gboolean document_close_all(void); +gboolean document_close_all(gboolean force);
GeanyDocument *document_clone(GeanyDocument *old_doc, const gchar *utf8_filename);
Modified: branches/sm/src/main.c =================================================================== --- branches/sm/src/main.c 2009-12-08 16:06:57 UTC (rev 4482) +++ branches/sm/src/main.c 2009-12-08 16:26:11 UTC (rev 4483) @@ -1095,10 +1095,28 @@ }
-void main_quit() +gboolean main_save(gboolean interactive) { + if (interactive && !document_account_for_unsaved()) + return FALSE; + + configuration_save(); + + if (app->project) + project_save(FALSE); + + return TRUE; +} + + +void main_finalize() +{ geany_debug("Quitting...");
+ if (app->project) + project_close(FALSE, FALSE); + document_close_all(TRUE); + #ifdef HAVE_SOCKET socket_finalize(); #endif
Modified: branches/sm/src/main.h =================================================================== --- branches/sm/src/main.h 2009-12-08 16:06:57 UTC (rev 4482) +++ branches/sm/src/main.h 2009-12-08 16:26:11 UTC (rev 4483) @@ -56,8 +56,10 @@
gchar *main_get_argv_filename(const gchar *filename);
-void main_quit(void); +gboolean main_save(gboolean interactive);
+void main_finalize(void); + gboolean main_handle_filename(const gchar *locale_filename);
void main_reload_configuration(void);
Modified: branches/sm/src/project.c =================================================================== --- branches/sm/src/project.c 2009-12-08 16:06:57 UTC (rev 4482) +++ branches/sm/src/project.c 2009-12-08 16:26:11 UTC (rev 4483) @@ -335,15 +335,22 @@ }
+void project_save(gboolean emit_signal) +{ + write_config(emit_signal); +} + + /* open_default will make function reload default session files on close */ -void project_close(gboolean open_default) +void project_close(gboolean save_config, gboolean open_default) { g_return_if_fail(app->project != NULL);
ui_set_statusbar(TRUE, _("Project "%s" closed."), app->project->name);
/* use write_config() to save project session files */ - write_config(FALSE); + if (save_config) + write_config(FALSE);
/* remove project filetypes build entries */ if (app->project->build_filetypes_list != NULL) @@ -370,7 +377,7 @@ if (project_prefs.project_session) { /* close all existing tabs first */ - document_close_all(); + document_close_all(FALSE);
/* after closing all tabs let's open the tabs found in the default config */ if (open_default && cl_options.load_session) @@ -601,7 +608,7 @@ _("Do you want to close it before proceeding?"), _("The '%s' project is already open."), app->project->name)) { - project_close(FALSE); + project_close(TRUE, FALSE); return TRUE; } else @@ -976,7 +983,7 @@ /* save current (non-project) session (it could has been changed since program startup) */ configuration_save_default_session(); /* now close all open files */ - document_close_all(); + document_close_all(FALSE); /* read session files so they can be opened with configuration_open_files() */ configuration_load_session_files(config, FALSE); }
Modified: branches/sm/src/project.h =================================================================== --- branches/sm/src/project.h 2009-12-08 16:06:57 UTC (rev 4482) +++ branches/sm/src/project.h 2009-12-08 16:26:11 UTC (rev 4483) @@ -68,8 +68,10 @@
void project_open(void);
-void project_close(gboolean open_default); +void project_save(gboolean emit_signal);
+void project_close(gboolean save_config, gboolean open_default); + void project_properties(void);
gboolean project_ask_close(void);
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.