brute force approach to stopping GTK shutdown from causing a crash as we try to manip...
authorPaul Davis <paul@linuxaudiosystems.com>
Fri, 2 Apr 2010 18:56:56 +0000 (18:56 +0000)
committerPaul Davis <paul@linuxaudiosystems.com>
Fri, 2 Apr 2010 18:56:56 +0000 (18:56 +0000)
git-svn-id: svn://localhost/ardour2/branches/2.0-ongoing@6842 d708f5d6-7413-0410-9779-e7cbd77b26cf

gtk2_ardour/main.cc
libs/gtkmm2ext/application.cc
libs/gtkmm2ext/gtkapplication_quartz.mm
libs/gtkmm2ext/gtkmm2ext/application.h

index 1963fee62b204bf1d60da46bdf1b606a0bce80f7..7a34e9339044a76dc6789a0775e72cea2adf8fc4 100644 (file)
@@ -37,6 +37,8 @@
 #include <ardour/audioengine.h>
 
 #include <gtkmm/main.h>
+
+#include <gtkmm2ext/application.h>
 #include <gtkmm2ext/popup.h>
 #include <gtkmm2ext/utils.h>
 
@@ -394,6 +396,7 @@ int main (int argc, char* argv[])
        }
 
        ui->run (text_receiver);
+       Gtkmm2ext::Application::instance()->cleanup();
        ui = 0;
 
        ARDOUR::cleanup ();
index 2a72c5bf4bc0dc0a36cc67d96d9569ddfb1f0d1e..54efb4773fbf51bac160378076a96ab7cba2a77a 100644 (file)
@@ -58,6 +58,12 @@ Application::ready ()
        gtk_application_ready ();
 }
 
+void
+Application::cleanup ()
+{
+       gtk_application_cleanup ();
+}
+
 void
 Application::set_menu_bar (MenuShell& shell)
 {
index b6d6b71d5d39202e7e1c78d133604d000485c551..c5fb8b12e23c41c2857c17dd35655dd7745789ab 100644 (file)
@@ -50,6 +50,8 @@
  *
  */
 
+static gint _exiting = 0;
+
 static guint
 gdk_quartz_keyval_to_ns_keyval (guint keyval)
 {
@@ -891,9 +893,13 @@ cocoa_menu_item_accel_changed (GtkAccelGroup   *accel_group,
                                GClosure        *accel_closure,
                                GtkWidget       *widget)
 {
-  GNSMenuItem *cocoa_item = cocoa_menu_item_get (widget);
+  GNSMenuItem *cocoa_item;
   GtkWidget      *label;
 
+  if (_exiting) 
+    return;
+
+  cocoa_item = cocoa_menu_item_get (widget);
   get_menu_label_text (widget, &label);
 
   if (GTK_IS_ACCEL_LABEL (label) &&
@@ -945,7 +951,12 @@ cocoa_menu_item_notify_label (GObject    *object,
                               GParamSpec *pspec,
                               gpointer    data)
 {
-  GNSMenuItem *cocoa_item = cocoa_menu_item_get (GTK_WIDGET (object));
+  GNSMenuItem *cocoa_item;
+
+  if (_exiting) 
+    return;
+
+  cocoa_item = cocoa_menu_item_get (GTK_WIDGET (object));
 
   if (!strcmp (pspec->name, "label"))
     {
@@ -964,6 +975,9 @@ cocoa_menu_item_notify (GObject        *object,
                        GParamSpec     *pspec,
                        NSMenuItem *cocoa_item)
 {
+  if (_exiting)
+    return;
+
   if (!strcmp (pspec->name, "sensitive") ||
       !strcmp (pspec->name, "visible"))
     {
@@ -1449,10 +1463,18 @@ gtk_application_ready ()
 extern "C" void
 gtk_application_cleanup()
 {
-       if (_window_menu)
+       _exiting = 1;
+
+       if (_window_menu) {
                [ _window_menu release ];
-       if (_app_menu)
+               _window_menu = 0;
+       }
+       if (_app_menu) {
                [ _app_menu release ];
-       if (_main_menubar)
+               _app_menu = 0;
+       }
+       if (_main_menubar) {
                [ _main_menubar release ];
+               _main_menubar = 0;
+       }
 }
index 346f76d2f0641a3eab431cc4c0389d0a5e8ec051..3fb107b78322e6ff0f8c3ab2f70f7412a5ddf26d 100644 (file)
@@ -43,6 +43,7 @@ public:
     ~Application ();
 
     void                     ready ();
+    void                     cleanup ();
     void                     set_menu_bar (Gtk::MenuShell&);
     GtkApplicationMenuGroup* add_app_menu_group ();
     void                     add_app_menu_item (GtkApplicationMenuGroup*, Gtk::MenuItem*);