diff --git a/src/Application.vala b/src/Application.vala index afbf15e31..78ae34713 100644 --- a/src/Application.vala +++ b/src/Application.vala @@ -199,6 +199,41 @@ namespace Scratch { return windows.length () > 0 ? windows.last ().data as MainWindow : null; } + public async void handle_quit_window (MainWindow window_to_close) { + if (!yield window_to_close.check_unsaved_changes ()) { + return; + } + + unowned List windows = get_windows (); + var n_windows = windows.length (); + + if (n_windows == 1) { + // Close app as usual + window_to_close.before_quit (); // Update settings + quit (); + } else { + // Find window to move docs into + unowned var windows_head = windows.first (); + var target_window = (MainWindow)(windows_head.data); + if (target_window == window_to_close) { + target_window = (MainWindow)(windows_head.next.data); + } + + // Reopen each doc in target window (we know they have been saved) + var doc_list = window_to_close.document_view.docs.copy (); + foreach (var doc in doc_list) { + var new_doc = new Services.Document ( + target_window.actions, + doc.file + ); + yield target_window.open_document (new_doc, false); + } + + remove_window (window_to_close); + window_to_close.destroy (); + } + } + public static int main (string[] args) { return new Application ().run (args); } diff --git a/src/MainWindow.vala b/src/MainWindow.vala index 10e02af36..b08067e65 100644 --- a/src/MainWindow.vala +++ b/src/MainWindow.vala @@ -808,7 +808,7 @@ namespace Scratch { } // Check that there no unsaved changes and all saves are successful - private async bool check_unsaved_changes () { + public async bool check_unsaved_changes () { document_view.is_closing = true; foreach (var doc in document_view.docs) { if (!yield (doc.do_close (true))) { @@ -845,7 +845,7 @@ namespace Scratch { } } - private void update_saved_state () { + private void update_window_state_setting () { // Save window state var state = get_window ().get_state (); if (Gdk.WindowState.MAXIMIZED in state) { @@ -872,9 +872,9 @@ namespace Scratch { } // For exit cleanup - private void handle_quit () { - document_view.save_opened_files (); - update_saved_state (); + public void before_quit () { + document_view.update_opened_files_setting (); + update_window_state_setting (); } public void set_default_zoom () { @@ -962,12 +962,7 @@ namespace Scratch { } private void action_quit () { - handle_quit (); - check_unsaved_changes.begin ((obj, res) => { - if (check_unsaved_changes.end (res)) { - app.quit (); - } - }); + app.handle_quit_window (this); } private void action_open () { diff --git a/src/Widgets/DocumentView.vala b/src/Widgets/DocumentView.vala index 30fa7f56c..9b572e1ef 100644 --- a/src/Widgets/DocumentView.vala +++ b/src/Widgets/DocumentView.vala @@ -133,7 +133,7 @@ public class Scratch.Widgets.DocumentView : Gtk.Box { var should_close = doc.do_close.end (res); // Ensure removed doc is saved by handling this first if (!is_closing) { - save_opened_files (); + update_opened_files_setting (); } //`page-detached` handler will perform rest of necessary cleanup tab_view.close_page_finish (tab, should_close); @@ -337,7 +337,7 @@ public class Scratch.Widgets.DocumentView : Gtk.Box { if (range != SelectionRange.EMPTY) { Idle.add_full (GLib.Priority.LOW, () => { // This helps ensures new tab is drawn before opening document. current_document.source_view.select_range (range); - save_opened_files (); + update_opened_files_setting (); return false; }); @@ -364,7 +364,7 @@ public class Scratch.Widgets.DocumentView : Gtk.Box { doc.source_view.cursor_position = cursor_position; } - save_opened_files (); + update_opened_files_setting (); } public void next_document () { @@ -399,7 +399,7 @@ public class Scratch.Widgets.DocumentView : Gtk.Box { } } - public void save_opened_files () { + public void update_opened_files_setting () { if (privacy_settings.get_boolean ("remember-recent-files")) { var vb = new VariantBuilder (new VariantType ("a(si)")); docs.foreach ((doc) => { @@ -542,7 +542,7 @@ public class Scratch.Widgets.DocumentView : Gtk.Box { current_document = doc; } - save_opened_files (); + update_opened_files_setting (); } private unowned Hdy.TabView? on_doc_to_new_window (Hdy.TabView tab_view) {