Revision: 4615 http://geany.svn.sourceforge.net/geany/?rev=4615&view=rev Author: eht16 Date: 2010-01-31 16:28:21 +0000 (Sun, 31 Jan 2010)
Log Message: ----------- Backport from trunk: Only set the menu of the button if a non-empty GtkMenu is passed to geany_menu_button_action_set_menu() so the menu arrow keeps insensitive.
Modified Paths: -------------- branches/geany-0.18.1/ChangeLog branches/geany-0.18.1/src/geanymenubuttonaction.c
Modified: branches/geany-0.18.1/ChangeLog =================================================================== --- branches/geany-0.18.1/ChangeLog 2010-01-31 16:28:04 UTC (rev 4614) +++ branches/geany-0.18.1/ChangeLog 2010-01-31 16:28:21 UTC (rev 4615) @@ -43,6 +43,10 @@ could be loaded which is only displayed *if* libvte.so is loaded. * src/editor.c: Allow autocompletion for HTML entities even within a word. + * src/geanymenubuttonaction.c: + Only set the menu of the button if a non-empty GtkMenu is passed to + geany_menu_button_action_set_menu() so the menu arrow keeps + insensitive.
2009-10-26 Nick Treleaven <nick(dot)treleaven(at)btinternet(dot)com>
Modified: branches/geany-0.18.1/src/geanymenubuttonaction.c =================================================================== --- branches/geany-0.18.1/src/geanymenubuttonaction.c 2010-01-31 16:28:04 UTC (rev 4614) +++ branches/geany-0.18.1/src/geanymenubuttonaction.c 2010-01-31 16:28:21 UTC (rev 4615) @@ -44,7 +44,6 @@ enum { BUTTON_CLICKED, - LAST_SIGNAL }; static guint signals[LAST_SIGNAL]; @@ -126,20 +125,55 @@ }
-void geany_menu_button_action_set_menu(GeanyMenubuttonAction *action, GtkWidget *menu) +static void menu_items_changed_cb(GtkContainer *container, GtkWidget *widget, GeanyMenubuttonAction *action) { GeanyMenubuttonActionPrivate *priv; + gboolean enable; GSList *l;
g_return_if_fail(action != NULL); - g_return_if_fail(menu != NULL);
priv = GEANY_MENU_BUTTON_ACTION_GET_PRIVATE(action); + if (priv->menu != NULL) + enable = (g_list_length(gtk_container_get_children(GTK_CONTAINER(priv->menu))) > 0); + else + enable = FALSE;
- priv->menu = menu; + if (enable) + { + foreach_slist(l, gtk_action_get_proxies(GTK_ACTION(action))) + { + if (gtk_menu_tool_button_get_menu(GTK_MENU_TOOL_BUTTON(l->data)) == NULL) + gtk_menu_tool_button_set_menu(GTK_MENU_TOOL_BUTTON(l->data), priv->menu); + } + } + else + { + foreach_slist(l, gtk_action_get_proxies(GTK_ACTION(action))) + { + gtk_menu_tool_button_set_menu(GTK_MENU_TOOL_BUTTON(l->data), NULL); + } + } +}
- foreach_slist(l, gtk_action_get_proxies(GTK_ACTION(action))) + +void geany_menu_button_action_set_menu(GeanyMenubuttonAction *action, GtkWidget *menu) +{ + GeanyMenubuttonActionPrivate *priv; + + g_return_if_fail(action != NULL); + + priv = GEANY_MENU_BUTTON_ACTION_GET_PRIVATE(action); + + if (priv->menu != NULL) + g_signal_handlers_disconnect_by_func(priv->menu, menu_items_changed_cb, action); + if (menu != NULL) { - gtk_menu_tool_button_set_menu(GTK_MENU_TOOL_BUTTON(l->data), priv->menu); + g_signal_connect(menu, "add", G_CALLBACK(menu_items_changed_cb), action); + g_signal_connect(menu, "remove", G_CALLBACK(menu_items_changed_cb), action); } + + priv->menu = menu; + + menu_items_changed_cb(GTK_CONTAINER(menu), NULL, action); }
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.