summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPaul Davis <paul@linuxaudiosystems.com>2015-07-27 10:50:35 -0400
committerPaul Davis <paul@linuxaudiosystems.com>2016-02-22 15:31:23 -0500
commit1be30e040169863006eb37d8ee2b8ad919febfa3 (patch)
treeca06e27b0c28d9a02d3f491f3c8fb6c1f6e6236e
parent58757ebd387ca6f46c365025daf5b3b65455279a (diff)
handle main window delete events sensibly
-rw-r--r--gtk2_ardour/ardour_ui.h2
-rw-r--r--gtk2_ardour/ardour_ui2.cc5
-rw-r--r--gtk2_ardour/ardour_ui_dependents.cc38
3 files changed, 44 insertions, 1 deletions
diff --git a/gtk2_ardour/ardour_ui.h b/gtk2_ardour/ardour_ui.h
index 6a91b6415a..d54063b782 100644
--- a/gtk2_ardour/ardour_ui.h
+++ b/gtk2_ardour/ardour_ui.h
@@ -839,6 +839,8 @@ class ARDOUR_UI : public Gtkmm2ext::UI, public ARDOUR::SessionHandlePtr
bool key_press_focus_accelerator_handler (Gtk::Window& window, GdkEventKey* ev, Gtkmm2ext::Bindings*);
bool try_gtk_accel_binding (GtkWindow* win, GdkEventKey* ev, bool translate, GdkModifierType modifier);
+ bool main_window_delete_event (GdkEventAny*);
+ bool idle_ask_about_quit ();
};
#endif /* __ardour_gui_h__ */
diff --git a/gtk2_ardour/ardour_ui2.cc b/gtk2_ardour/ardour_ui2.cc
index 925969869a..eaae3c0e03 100644
--- a/gtk2_ardour/ardour_ui2.cc
+++ b/gtk2_ardour/ardour_ui2.cc
@@ -184,9 +184,11 @@ ARDOUR_UI::setup_windows ()
build_menu_bar ();
setup_tooltips ();
+ _main_window.signal_delete_event().connect (sigc::mem_fun (*this, &ARDOUR_UI::main_window_delete_event));
+
/* pack the main vpacker into the main window and show everything
*/
-
+
_main_window.add (main_vpacker);
transport_frame.show_all ();
@@ -905,3 +907,4 @@ ARDOUR_UI::update_title ()
}
}
+
diff --git a/gtk2_ardour/ardour_ui_dependents.cc b/gtk2_ardour/ardour_ui_dependents.cc
index 97c81f187a..0d7b5a1353 100644
--- a/gtk2_ardour/ardour_ui_dependents.cc
+++ b/gtk2_ardour/ardour_ui_dependents.cc
@@ -155,3 +155,41 @@ ARDOUR_UI::tab_window_root_drop (GtkNotebook* src,
return 0; /* what was that? */
}
+
+bool
+ARDOUR_UI::idle_ask_about_quit ()
+{
+ if (_session && _session->dirty()) {
+ finish ();
+ } else {
+ /* no session or session not dirty, but still ask anyway */
+
+ Gtk::MessageDialog msg (string_compose ("Quit %1?", PROGRAM_NAME),
+ false, /* no markup */
+ Gtk::MESSAGE_INFO,
+ Gtk::BUTTONS_YES_NO,
+ true); /* modal */
+ msg.set_default_response (Gtk::RESPONSE_YES);
+
+ if (msg.run() == Gtk::RESPONSE_YES) {
+ finish ();
+ }
+ }
+
+ /* not reached but keep the compiler happy */
+
+ return false;
+}
+
+bool
+ARDOUR_UI::main_window_delete_event (GdkEventAny* ev)
+{
+ /* quit the application as soon as we go idle. If we call this here,
+ * the window manager/desktop can think we're taking too longer to
+ * handle the "delete" event
+ */
+
+ Glib::signal_idle().connect (sigc::mem_fun (*this, &ARDOUR_UI::idle_ask_about_quit));
+
+ return true;
+}