summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRobin Gareus <robin@gareus.org>2018-11-29 14:25:22 +0100
committerRobin Gareus <robin@gareus.org>2018-11-29 14:25:22 +0100
commite42699600b92db69a428979dc0412c96f7494141 (patch)
treedd220f5a98060dcb446733f3013eaed0b6596e87
parentfc24b9f0b7027fe516565eae85857be06d1f1e1d (diff)
Delete temporary Window Proxy for dialogs
There are two cases: (A) Proxy is created first, dialog is created later on demand (B) Dialog is created and directly registers its window as proxy In (B) the dialog is usually on the stack and destroyed when the ArdourDialog instances leaves scope. In that case ~ArdourDialog() is called and the proxy remained. Destroying the proxy does destroy the registered window in ~WindowProxy() If ArdourDialog's d'tor itself deletes the proxy it would recurse into itself. Existing APIs e.g. drop_window() likewise delete the window and cannot be safely called from ~ArdourDialog.
-rw-r--r--gtk2_ardour/ardour_dialog.cc2
-rw-r--r--gtk2_ardour/window_manager.cc5
-rw-r--r--gtk2_ardour/window_manager.h3
3 files changed, 4 insertions, 6 deletions
diff --git a/gtk2_ardour/ardour_dialog.cc b/gtk2_ardour/ardour_dialog.cc
index 1c9da0112f..68f388682a 100644
--- a/gtk2_ardour/ardour_dialog.cc
+++ b/gtk2_ardour/ardour_dialog.cc
@@ -45,6 +45,7 @@ ArdourDialog::ArdourDialog (string title, bool modal, bool use_seperator)
ArdourDialog::ArdourDialog (Gtk::Window& parent, string title, bool modal, bool use_seperator)
: Dialog (title, parent, modal, use_seperator)
+ , proxy (0)
, _splash_pushed (false)
{
init ();
@@ -56,6 +57,7 @@ ArdourDialog::~ArdourDialog ()
pop_splash ();
Keyboard::the_keyboard().focus_out_window (0, this);
WM::Manager::instance().remove (proxy);
+ proxy->explicit_delete ();
}
void
diff --git a/gtk2_ardour/window_manager.cc b/gtk2_ardour/window_manager.cc
index 1d63751c5e..cdb83fba8b 100644
--- a/gtk2_ardour/window_manager.cc
+++ b/gtk2_ardour/window_manager.cc
@@ -255,11 +255,6 @@ ProxyTemporary::ProxyTemporary (const string& name, Gtk::Window* win)
_window = win;
}
-ProxyTemporary::~ProxyTemporary ()
-{
-}
-
-
ARDOUR::SessionHandlePtr*
ProxyTemporary::session_handle()
{
diff --git a/gtk2_ardour/window_manager.h b/gtk2_ardour/window_manager.h
index a5a9714cc8..93d71add92 100644
--- a/gtk2_ardour/window_manager.h
+++ b/gtk2_ardour/window_manager.h
@@ -97,7 +97,6 @@ class ProxyTemporary: public ProxyBase
{
public:
ProxyTemporary (const std::string& name, Gtk::Window* win);
- ~ProxyTemporary();
Gtk::Window* get (bool create = false) {
(void) create;
@@ -109,6 +108,8 @@ public:
}
ARDOUR::SessionHandlePtr* session_handle ();
+
+ void explicit_delete () { _window = 0 ; delete this; }
};
template<typename T>