[gtk-mac-integration] Suppress NULL object warning in cocoa_menu_item_update_accel_closure



commit 32bb85d44e62a5dc3061753fa739f962b0441fb7
Author: John Ralls <jralls ceridwen us>
Date:   Sat Jul 6 15:43:23 2013 -0700

    Suppress NULL object warning in cocoa_menu_item_update_accel_closure
    
    Ensure accel_group exists before attempting to connect or disconnect
    signal handlers

 src/cocoa_menu_item.c          |   18 ++++++++++--------
 src/gtkosxapplication_quartz.c |   13 +++++++++++--
 src/gtkosxapplicationprivate.h |    1 +
 src/test-integration.c         |   19 +++++++++++++++++++
 4 files changed, 41 insertions(+), 10 deletions(-)
---
diff --git a/src/cocoa_menu_item.c b/src/cocoa_menu_item.c
index 8068039..025c409 100644
--- a/src/cocoa_menu_item.c
+++ b/src/cocoa_menu_item.c
@@ -342,10 +342,10 @@ cocoa_menu_item_update_accel_closure (_GNSMenuItem *cocoa_item,
   if (cocoa_item->accel_closure)
     {
       group = gtk_accel_group_from_accel_closure (cocoa_item->accel_closure);
-
-      g_signal_handlers_disconnect_by_func (group,
-                                            (void*) cocoa_menu_item_accel_changed,
-                                            widget);
+      if (group)
+       g_signal_handlers_disconnect_by_func (group,
+                                             (void*) cocoa_menu_item_accel_changed,
+                                             widget);
 
       g_closure_unref (cocoa_item->accel_closure);
       cocoa_item->accel_closure = NULL;
@@ -361,10 +361,10 @@ cocoa_menu_item_update_accel_closure (_GNSMenuItem *cocoa_item,
       g_closure_ref (cocoa_item->accel_closure);
 
       group = gtk_accel_group_from_accel_closure (cocoa_item->accel_closure);
-
-      g_signal_connect_object (group, "accel-changed",
-                               G_CALLBACK (cocoa_menu_item_accel_changed),
-                               widget, (GConnectFlags) 0);
+      if (group)
+       g_signal_connect_object (group, "accel-changed",
+                                G_CALLBACK (cocoa_menu_item_accel_changed),
+                                widget, (GConnectFlags) 0);
     }
 
   cocoa_menu_item_update_accelerator (cocoa_item, widget);
@@ -517,6 +517,7 @@ cocoa_menu_item_add_item_image (_GNSMenuItem* cocoa_item, GtkWidget* menu_item)
     [cocoa_item setImage: image];
 }
 #endif
+
 /*
  * Public Functions
  */
@@ -653,6 +654,7 @@ cocoa_menu_item_add_submenu (GtkMenuShell *menu_shell,
         continue;
       /*OK, this must be a new one. Add it. */
       cocoa_menu_item_add_item (cocoa_menu, menu_item, index++);
+
     }
   /* Iterate over the cocoa menu again removing anything that's still marked */
   for (index = 0; index < [cocoa_menu numberOfItems]; index++)
diff --git a/src/gtkosxapplication_quartz.c b/src/gtkosxapplication_quartz.c
index 0386c39..c96eb51 100644
--- a/src/gtkosxapplication_quartz.c
+++ b/src/gtkosxapplication_quartz.c
@@ -217,8 +217,11 @@ create_apple_menu (GtkosxApplication *self)
   [menuitem setTarget: NSApp];
   [app_menu addItem: menuitem];
   [menuitem release];
-
-  [NSApp performSelector: @selector (setAppleMenu: ) withObject: app_menu];
+  if (!self->priv->app_menu_set)
+    {
+      [NSApp performSelector: @selector (setAppleMenu: ) withObject: app_menu];
+      self->priv->app_menu_set = TRUE;
+    }
   return add_to_menubar (self, app_menu, 0);
 }
 
@@ -483,6 +486,7 @@ gtkosx_application_init (GtkosxApplication *self)
   self->priv->notify = [[GtkApplicationNotificationObject alloc] init];
   [NSApp setDelegate: [GtkApplicationDelegate new]];
   self->priv->delegate = [NSApp delegate];
+  self->priv->app_menu_set = FALSE;
 }
 
 static void
@@ -613,6 +617,11 @@ gtkosx_application_class_init (GtkosxApplicationClass *klass)
 void
 gtkosx_application_ready (GtkosxApplication *self)
 {
+  if (!self->priv->app_menu_set)
+    {
+      create_apple_menu (self);
+      self->priv->app_menu_set = TRUE;
+    }
   [NSApp finishLaunching];
 }
 
diff --git a/src/gtkosxapplicationprivate.h b/src/gtkosxapplicationprivate.h
index bf9cf25..145f338 100644
--- a/src/gtkosxapplicationprivate.h
+++ b/src/gtkosxapplicationprivate.h
@@ -37,6 +37,7 @@ struct _GtkosxApplicationPrivate
   NSMenu *dock_menu;
   GtkApplicationNotificationObject *notify;
   GtkApplicationDelegate *delegate;
+  gboolean app_menu_set;
 };
 
 #endif
diff --git a/src/test-integration.c b/src/test-integration.c
index 0d6678b..33866c1 100644
--- a/src/test-integration.c
+++ b/src/test-integration.c
@@ -459,6 +459,15 @@ change_icon_cb (GtkWidget  *button,
 {
 }
 #endif //GTKMACINTEGRATION
+static void
+window_change_title_cb (GtkWidget *button, gpointer user_data)
+{
+  GtkWidget *window = gtk_widget_get_toplevel (button);
+  gchar *old_title = gtk_window_get_title (GTK_WINDOW (window));
+  gchar *new_title = g_strdup_printf ("New %s", old_title);
+  gtk_window_set_title (GTK_WINDOW (window), new_title);
+  g_free (new_title);
+}
 
 static void
 change_menu_cb (GtkWidget  *button,
@@ -706,6 +715,13 @@ create_window (const gchar *title)
                       button,
                       FALSE, FALSE, 0);
 
+  button = gtk_button_new_with_label ("Change Title");
+  g_signal_connect (button, "clicked", G_CALLBACK (window_change_title_cb),
+                   NULL);
+  gtk_box_pack_start (GTK_BOX (bbox),
+                      button,
+                      FALSE, FALSE, 0);
+
   gtk_widget_show_all (window);
 #if defined GTK_MAC_MENU || defined GTKOSXAPPLICATION
   gtk_widget_hide (menubar);
@@ -751,6 +767,8 @@ create_window (const gchar *title)
     menu_items_quark = g_quark_from_static_string ("MenuItem");
   g_object_set_qdata_full (G_OBJECT (window), menu_items_quark,
                            items, (GDestroyNotify)menu_items_destroy);
+  //  gtk_widget_set_sensitive(items->preferences_item, FALSE);
+  g_object_set (items->preferences_item, "visible", FALSE, NULL);
   return window;
 }
 
@@ -812,6 +830,7 @@ main (int argc, char **argv)
   gtkosx_application_set_use_quartz_accelerators (theApp, FALSE);
 # endif //QUARTZ_HANDLERS
   gtkosx_application_ready (theApp);
+
   {
     const gchar *id = gtkosx_application_get_bundle_id ();
     if (id != NULL)



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]