Revision: 972 http://svn.sourceforge.net/geany/?rev=972&view=rev Author: ntrel Date: 2006-11-07 03:24:22 -0800 (Tue, 07 Nov 2006)
Log Message: ----------- Don't close any tabs when quitting until all unsaved changes have been accounted for; switch to each unsaved file before showing the unsaved dialog. Remove limit of ~256 chars for session filenames. Make dialogs_show_unsaved_file() fail if the Save As dialog was cancelled.
Modified Paths: -------------- trunk/ChangeLog trunk/src/callbacks.c trunk/src/dialogs.c trunk/src/dialogs.h trunk/src/keyfile.c trunk/src/win32.c trunk/src/win32.h
Modified: trunk/ChangeLog =================================================================== --- trunk/ChangeLog 2006-11-06 21:02:03 UTC (rev 971) +++ trunk/ChangeLog 2006-11-07 11:24:22 UTC (rev 972) @@ -1,3 +1,15 @@ +2006-11-07 Nick Treleaven nick.treleaven@btinternet.com + + * src/win32.c, src/win32.h, src/callbacks.c, src/keyfile.c, + src/dialogs.c, src/dialogs.h: + Don't close any tabs when quitting until all unsaved changes have + been accounted for; switch to each unsaved file before showing the + unsaved dialog. + Remove limit of ~256 chars for session filenames. + Make dialogs_show_unsaved_file() fail if the Save As dialog was + cancelled. + + 2006-11-06 Enrico Tröger enrico.troeger@uvena.de
* data/filetypes.java, src/highlighting.c:
Modified: trunk/src/callbacks.c =================================================================== --- trunk/src/callbacks.c 2006-11-06 21:02:03 UTC (rev 971) +++ trunk/src/callbacks.c 2006-11-07 11:24:22 UTC (rev 972) @@ -84,79 +84,79 @@ }
-// wrapper function to abort exit process if cancel button is pressed -gboolean -on_exit_clicked (GtkWidget *widget, gpointer gdata) +static gboolean check_no_unsaved() { - app->quitting = TRUE; + guint i;
- if (gtk_notebook_get_n_pages(GTK_NOTEBOOK(app->notebook)) > 0) + for (i = 0; i < doc_array->len; i++) { - guint i; - gboolean has_dirty_editors = FALSE; - - for (i = 0; i < doc_array->len; i++) + if (doc_list[i].is_valid && doc_list[i].changed) { - if (doc_list[i].is_valid && doc_list[i].changed) - { - has_dirty_editors = TRUE; - break; - } + return FALSE; } - if (has_dirty_editors) + } + return TRUE; // no unsaved edits +} + + +static gboolean account_for_unsaved() +{ + gint p; + + for (p = 0; p < gtk_notebook_get_n_pages(GTK_NOTEBOOK(app->notebook)); p++) + { + gint idx = document_get_n_idx(p); + + if (doc_list[idx].changed) { - // there is the chance that the user cancel the exit process while closing open - // files, so save the configuration(i.e. the list of open files) first - configuration_save(); - if (on_close_all1_activate(NULL, NULL)) - { - destroyapp(NULL, gdata); - } - else app->quitting = FALSE; + gtk_notebook_set_current_page(GTK_NOTEBOOK(app->notebook), p); + if (! dialogs_show_unsaved_file(idx)) + return FALSE; } - else - { - if (app->pref_main_confirm_exit) - { - if (dialogs_show_question_full(GTK_STOCK_QUIT, GTK_STOCK_CANCEL, NULL, - _("Do you really want to quit?")) && on_close_all1_activate(NULL, NULL)) - { - configuration_save(); - destroyapp(NULL, gdata); - } - else app->quitting = FALSE; - } - else - { - // there is the chance that the user cancel the exit process while closing open - // files, so save the configuration(i.e. the list of open files) first - configuration_save(); - if (on_close_all1_activate(NULL, NULL)) - { - destroyapp(NULL, gdata); - } - else app->quitting = FALSE; - } - } } - else + return TRUE; +} + + +// should only be called from on_exit_clicked +static void quit_app() +{ + guint i; + + configuration_save(); + + // force close all tabs + for (i = 0; i < doc_array->len; i++) { - if (app->pref_main_confirm_exit) + if (doc_list[i].is_valid && doc_list[i].changed) { - if (dialogs_show_question_full(GTK_STOCK_QUIT, GTK_STOCK_CANCEL, NULL, - _("Do you really want to quit?"))) - { - configuration_save(); - destroyapp(NULL, gdata); - } - else app->quitting = FALSE; + doc_list[i].changed = FALSE; // ignore changes (already asked user in on_exit_clicked) } - else - { - configuration_save(); - destroyapp(NULL, gdata); - } } + on_close_all1_activate(NULL, NULL); + + destroyapp(NULL, NULL); +} + + +// wrapper function to abort exit process if cancel button is pressed +gboolean +on_exit_clicked (GtkWidget *widget, gpointer gdata) +{ + app->quitting = TRUE; + + if (! check_no_unsaved()) + { + if (account_for_unsaved()) + quit_app(); + } + else + if (! app->pref_main_confirm_exit || + dialogs_show_question_full(GTK_STOCK_QUIT, GTK_STOCK_CANCEL, NULL, + _("Do you really want to quit?"))) + quit_app(); + + app->quitting = FALSE; return TRUE; }
Modified: trunk/src/dialogs.c =================================================================== --- trunk/src/dialogs.c 2006-11-06 21:02:03 UTC (rev 971) +++ trunk/src/dialogs.c 2006-11-07 11:24:22 UTC (rev 972) @@ -246,13 +246,14 @@ #endif
-/* This shows the file selection dialog to save a file. */ -void dialogs_show_save_as() +/* This shows the file selection dialog to save a file, returning TRUE if + * the file was saved. */ +gboolean dialogs_show_save_as() { #ifdef G_OS_WIN32 - win32_show_file_dialog(FALSE); + return win32_show_file_dialog(FALSE); #else - gint idx = document_get_cur_idx(); + gint idx = document_get_cur_idx(), resp;
if (app->save_filesel == NULL) { @@ -299,7 +300,8 @@ }
// Run the dialog synchronously, pausing this function call - gtk_dialog_run(GTK_DIALOG(app->save_filesel)); + resp = gtk_dialog_run(GTK_DIALOG(app->save_filesel)); + return (resp == GTK_RESPONSE_ACCEPT); #endif }
@@ -384,8 +386,7 @@ { if (doc_list[idx].file_name == NULL) { - dialogs_show_save_as(); - ret = TRUE; + ret = dialogs_show_save_as(); } else // document_save_file() returns the status if the file could be saved
Modified: trunk/src/dialogs.h =================================================================== --- trunk/src/dialogs.h 2006-11-06 21:02:03 UTC (rev 971) +++ trunk/src/dialogs.h 2006-11-07 11:24:22 UTC (rev 972) @@ -28,7 +28,7 @@ void dialogs_show_open_file();
/* This shows the file selection dialog to save a file. */ -void dialogs_show_save_as(); +gboolean dialogs_show_save_as();
gboolean dialogs_show_unsaved_file(gint idx);
Modified: trunk/src/keyfile.c =================================================================== --- trunk/src/keyfile.c 2006-11-06 21:02:03 UTC (rev 971) +++ trunk/src/keyfile.c 2006-11-07 11:24:22 UTC (rev 972) @@ -58,7 +58,6 @@ gchar *configfile = g_strconcat(app->configdir, G_DIR_SEPARATOR_S, "geany.conf", NULL); gchar *data, *tmp; gchar *entry = g_malloc(14); - gchar *fname = g_malloc0(256); gchar **recent_files = g_new0(gchar*, app->mru_length + 1); GtkTextBuffer *buffer; GtkTextIter start, end; @@ -212,10 +211,16 @@ idx = document_get_n_idx(i); if (idx >= 0 && doc_list[idx].file_name) { + gchar *fname; + filetype *ft = doc_list[idx].file_type; + + if (ft == NULL) // can happen when saving a new file when quitting + ft = filetypes[GEANY_FILETYPES_ALL]; g_snprintf(entry, 13, "FILE_NAME_%d", j); - g_snprintf(fname, 255, "%d:%d:%s", sci_get_current_position(doc_list[idx].sci), - doc_list[idx].file_type->uid, doc_list[idx].file_name); + fname = g_strdup_printf("%d:%d:%s", sci_get_current_position(doc_list[idx].sci), + ft->uid, doc_list[idx].file_name); g_key_file_set_string(config, "files", entry, fname); + g_free(fname); j++; } } @@ -247,7 +252,6 @@ g_key_file_free(config); g_free(configfile); g_free(entry); - g_free(fname); g_free(scribble_text); }
Modified: trunk/src/win32.c =================================================================== --- trunk/src/win32.c 2006-11-06 21:02:03 UTC (rev 971) +++ trunk/src/win32.c 2006-11-07 11:24:22 UTC (rev 972) @@ -83,7 +83,8 @@ }
-void win32_show_file_dialog(gboolean file_open) +// return TRUE if the dialog was not cancelled. +gboolean win32_show_file_dialog(gboolean file_open) { OPENFILENAME of; gint retval; @@ -134,7 +135,7 @@ win32_message_dialog(GTK_MESSAGE_ERROR, error); } g_free(fname); - return; + return FALSE; }
if (file_open) @@ -169,6 +170,7 @@ document_save_file(idx, TRUE); } g_free(fname); + return (retval != 0); }
Modified: trunk/src/win32.h =================================================================== --- trunk/src/win32.h 2006-11-06 21:02:03 UTC (rev 971) +++ trunk/src/win32.h 2006-11-07 11:24:22 UTC (rev 972) @@ -26,7 +26,7 @@
void win32_show_pref_file_dialog(GtkEntry *item);
-void win32_show_file_dialog(gboolean file_open); +gboolean win32_show_file_dialog(gboolean file_open);
void win32_show_font_dialog(void);
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.