From 8b257dca7cebd4c727023a4c30daac0f8666101a Mon Sep 17 00:00:00 2001 From: Cody Russell Date: Fri, 12 Feb 2010 15:10:40 -0600 Subject: Handle menuitem visibility changes, and additions/removals from menus. --- src/libappindicator/app-indicator.c | 29 ++++++++++++++++++++++++++--- 1 file changed, 26 insertions(+), 3 deletions(-) diff --git a/src/libappindicator/app-indicator.c b/src/libappindicator/app-indicator.c index d179df7..9a6498e 100644 --- a/src/libappindicator/app-indicator.c +++ b/src/libappindicator/app-indicator.c @@ -1125,6 +1125,12 @@ widget_notify_cb (GtkWidget *widget, DBUSMENU_MENUITEM_PROP_LABEL, gtk_menu_item_get_label (GTK_MENU_ITEM (widget))); } + else if (pspec->name == g_intern_static_string ("visible")) + { + dbusmenu_menuitem_property_set (child, + DBUSMENU_MENUITEM_PROP_VISIBLE, + gtk_widget_get_visible (widget)); + } } static void @@ -1259,14 +1265,22 @@ setup_dbusmenu (AppIndicator *self) return; } +static void +client_menu_changed (GtkWidget *widget, + GtkWidget *child, + AppIndicator *indicator) +{ + setup_dbusmenu (indicator); +} + /** app_indicator_set_menu: @self: The #AppIndicator @menu: A #GtkMenu to set - Sets the menu that should be shown when the Application Indicator - is clicked on in the panel. An application indicator will not - be rendered unless it has a menu. + Sets the menu that should be shown when the Application Indicator + is clicked on in the panel. An application indicator will not + be rendered unless it has a menu. **/ void app_indicator_set_menu (AppIndicator *self, GtkMenu *menu) @@ -1287,6 +1301,15 @@ app_indicator_set_menu (AppIndicator *self, GtkMenu *menu) priv->menu = GTK_WIDGET (menu); g_object_ref (priv->menu); + g_signal_connect (menu, + "add", + G_CALLBACK (client_menu_changed), + self); + g_signal_connect (menu, + "remove", + G_CALLBACK (client_menu_changed), + self); + setup_dbusmenu (self); check_connect (self); -- cgit v1.2.3 From 02b61440e93c17963c76f1423b29fd83e7cea78a Mon Sep 17 00:00:00 2001 From: Cody Russell Date: Fri, 12 Feb 2010 15:27:40 -0600 Subject: Use dbusmenu_menuitem_property_set_bool(), and also fix some indenting. --- src/libappindicator/app-indicator.c | 32 ++++++++++++++++---------------- 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/src/libappindicator/app-indicator.c b/src/libappindicator/app-indicator.c index 9a6498e..49c0903 100644 --- a/src/libappindicator/app-indicator.c +++ b/src/libappindicator/app-indicator.c @@ -506,11 +506,11 @@ app_indicator_set_property (GObject * object, guint prop_id, const GValue * valu break; case PROP_ICON_THEME_PATH: - if (priv->icon_path != NULL) { - g_free(priv->icon_path); - } - priv->icon_path = g_value_dup_string(value); - break; + if (priv->icon_path != NULL) { + g_free(priv->icon_path); + } + priv->icon_path = g_value_dup_string(value); + break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); @@ -556,14 +556,14 @@ app_indicator_get_property (GObject * object, guint prop_id, GValue * value, GPa break; case PROP_MENU: - if (priv->menuservice != NULL) { - GValue strval = {0}; - g_value_init(&strval, G_TYPE_STRING); - g_object_get_property (G_OBJECT (priv->menuservice), DBUSMENU_SERVER_PROP_DBUS_OBJECT, &strval); - g_value_set_boxed(value, g_value_get_string(&strval)); - g_value_unset(&strval); - } - break; + if (priv->menuservice != NULL) { + GValue strval = { 0 }; + g_value_init(&strval, G_TYPE_STRING); + g_object_get_property (G_OBJECT (priv->menuservice), DBUSMENU_SERVER_PROP_DBUS_OBJECT, &strval); + g_value_set_boxed(value, g_value_get_string(&strval)); + g_value_unset(&strval); + } + break; case PROP_CONNECTED: g_value_set_boolean (value, priv->watcher_proxy != NULL ? TRUE : FALSE); @@ -1127,9 +1127,9 @@ widget_notify_cb (GtkWidget *widget, } else if (pspec->name == g_intern_static_string ("visible")) { - dbusmenu_menuitem_property_set (child, - DBUSMENU_MENUITEM_PROP_VISIBLE, - gtk_widget_get_visible (widget)); + dbusmenu_menuitem_property_set_bool (child, + DBUSMENU_MENUITEM_PROP_VISIBLE, + gtk_widget_get_visible (widget)); } } -- cgit v1.2.3 From 1c7a301a115fd4b333fea061c48fa6065316cd80 Mon Sep 17 00:00:00 2001 From: Cody Russell Date: Fri, 12 Feb 2010 15:38:02 -0600 Subject: Just to be safe, let's connect these at the end. --- example/simple-client.c | 10 +++++++++- src/libappindicator/app-indicator.c | 8 ++++---- 2 files changed, 13 insertions(+), 5 deletions(-) diff --git a/example/simple-client.c b/example/simple-client.c index 997a446..ee7bad2 100644 --- a/example/simple-client.c +++ b/example/simple-client.c @@ -68,11 +68,18 @@ image_clicked_cb (GtkWidget *widget, gpointer data) GTK_STOCK_OPEN, GTK_ICON_SIZE_MENU); } +static void +item_clicked_2_cb (GtkWidget *widget, GtkWidget *old) +{ + gtk_widget_set_sensitive (old, FALSE); +} + static void append_submenu (GtkWidget *item) { GtkWidget *menu; GtkWidget *mi; + GtkWidget *prev_mi; menu = gtk_menu_new (); @@ -81,10 +88,11 @@ append_submenu (GtkWidget *item) g_signal_connect (mi, "activate", G_CALLBACK (item_clicked_cb), "Sub 1"); + prev_mi = mi; mi = gtk_menu_item_new_with_label ("Sub 2"); gtk_menu_shell_append (GTK_MENU_SHELL (menu), mi); g_signal_connect (mi, "activate", - G_CALLBACK (item_clicked_cb), "Sub 2"); + G_CALLBACK (item_clicked_2_cb), prev_mi); mi = gtk_menu_item_new_with_label ("Sub 3"); gtk_menu_shell_append (GTK_MENU_SHELL (menu), mi); diff --git a/src/libappindicator/app-indicator.c b/src/libappindicator/app-indicator.c index 49c0903..1f39f57 100644 --- a/src/libappindicator/app-indicator.c +++ b/src/libappindicator/app-indicator.c @@ -1301,6 +1301,10 @@ app_indicator_set_menu (AppIndicator *self, GtkMenu *menu) priv->menu = GTK_WIDGET (menu); g_object_ref (priv->menu); + setup_dbusmenu (self); + + check_connect (self); + g_signal_connect (menu, "add", G_CALLBACK (client_menu_changed), @@ -1309,10 +1313,6 @@ app_indicator_set_menu (AppIndicator *self, GtkMenu *menu) "remove", G_CALLBACK (client_menu_changed), self); - - setup_dbusmenu (self); - - check_connect (self); } /** -- cgit v1.2.3 From e18cf834e60e61bc836d42b6ae1201b595591ce3 Mon Sep 17 00:00:00 2001 From: Cody Russell Date: Fri, 12 Feb 2010 15:38:37 -0600 Subject: Change the indentation for this case to be the same as the others. --- src/libappindicator/app-indicator.c | 34 +++++++++++++++++----------------- 1 file changed, 17 insertions(+), 17 deletions(-) diff --git a/src/libappindicator/app-indicator.c b/src/libappindicator/app-indicator.c index 1f39f57..b73ce05 100644 --- a/src/libappindicator/app-indicator.c +++ b/src/libappindicator/app-indicator.c @@ -447,23 +447,23 @@ app_indicator_set_property (GObject * object, guint prop_id, const GValue * valu switch (prop_id) { case PROP_ID: - if (priv->id != NULL) { - g_warning ("Resetting ID value when I already had a value of: %s", priv->id); - break; - } - - priv->id = g_strdup (g_value_get_string (value)); - - priv->clean_id = g_strdup(priv->id); - gchar * cleaner; - for (cleaner = priv->clean_id; *cleaner != '\0'; cleaner++) { - if (!g_ascii_isalnum(*cleaner)) { - *cleaner = '_'; - } - } - - check_connect (self); - break; + if (priv->id != NULL) { + g_warning ("Resetting ID value when I already had a value of: %s", priv->id); + break; + } + + priv->id = g_strdup (g_value_get_string (value)); + + priv->clean_id = g_strdup(priv->id); + gchar * cleaner; + for (cleaner = priv->clean_id; *cleaner != '\0'; cleaner++) { + if (!g_ascii_isalnum(*cleaner)) { + *cleaner = '_'; + } + } + + check_connect (self); + break; case PROP_CATEGORY: enum_val = g_enum_get_value_by_nick ((GEnumClass *) g_type_class_ref (APP_INDICATOR_TYPE_INDICATOR_CATEGORY), -- cgit v1.2.3 From 84137b6a811bda3e3e9c0457fba32fc7294d45d6 Mon Sep 17 00:00:00 2001 From: Cody Russell Date: Fri, 12 Feb 2010 15:41:48 -0600 Subject: Minor cleanup --- example/simple-client.c | 9 +-------- 1 file changed, 1 insertion(+), 8 deletions(-) diff --git a/example/simple-client.c b/example/simple-client.c index ee7bad2..a698b48 100644 --- a/example/simple-client.c +++ b/example/simple-client.c @@ -57,7 +57,6 @@ toggle_sensitivity_cb (GtkWidget *widget, gpointer data) { GtkWidget *target = (GtkWidget *)data; - gtk_menu_item_set_label (GTK_MENU_ITEM (target), "modified!!"); gtk_widget_set_sensitive (target, !GTK_WIDGET_IS_SENSITIVE (target)); } @@ -68,12 +67,6 @@ image_clicked_cb (GtkWidget *widget, gpointer data) GTK_STOCK_OPEN, GTK_ICON_SIZE_MENU); } -static void -item_clicked_2_cb (GtkWidget *widget, GtkWidget *old) -{ - gtk_widget_set_sensitive (old, FALSE); -} - static void append_submenu (GtkWidget *item) { @@ -92,7 +85,7 @@ append_submenu (GtkWidget *item) mi = gtk_menu_item_new_with_label ("Sub 2"); gtk_menu_shell_append (GTK_MENU_SHELL (menu), mi); g_signal_connect (mi, "activate", - G_CALLBACK (item_clicked_2_cb), prev_mi); + G_CALLBACK (toggle_sensitivity_cb), prev_mi); mi = gtk_menu_item_new_with_label ("Sub 3"); gtk_menu_shell_append (GTK_MENU_SHELL (menu), mi); -- cgit v1.2.3