finch/libgnt/gntmenu.c

changeset 35918
3f84738fbc15
parent 35917
76b701912a9d
child 36257
c5445f25f90f
--- a/finch/libgnt/gntmenu.c	Sat Apr 26 19:55:55 2014 +0200
+++ b/finch/libgnt/gntmenu.c	Sat Apr 26 20:39:33 2014 +0200
@@ -89,7 +89,11 @@
 			GntMenuItem *item = GNT_MENU_ITEM(iter->data);
 			if (!gnt_menuitem_is_visible(item))
 				continue;
-			type = ' ' | gnt_color_pair(GNT_COLOR_HIGHLIGHT);
+			type = ' ';
+			if (item->callback || item->submenu)
+				type |= gnt_color_pair(GNT_COLOR_HIGHLIGHT);
+			else
+				type |= gnt_color_pair(GNT_COLOR_DISABLED);
 			if (i == menu->selected)
 				type |= A_REVERSE;
 			item->priv.x = getcurx(widget->window) + widget->priv.x;
@@ -121,7 +125,7 @@
 static void
 menu_tree_add(GntMenu *menu, GntMenuItem *item, GntMenuItem *parent)
 {
-	char trigger[4] = "\0 )\0";
+	char trigger[] = "\0 )\0";
 
 	g_return_if_fail(item != NULL);
 
@@ -132,9 +136,12 @@
 		gnt_tree_add_choice(GNT_TREE(menu), item,
 			gnt_tree_create_row(GNT_TREE(menu), item->text, trigger, " "), parent, NULL);
 		gnt_tree_set_choice(GNT_TREE(menu), item, gnt_menuitem_check_get_checked(GNT_MENU_ITEM_CHECK(item)));
-	} else
+	} else {
 		gnt_tree_add_row_last(GNT_TREE(menu), item,
 			gnt_tree_create_row(GNT_TREE(menu), item->text, trigger, item->submenu ? ">" : " "), parent);
+		if (!item->callback && !item->submenu)
+			gnt_tree_set_row_color(GNT_TREE(menu), item, GNT_COLOR_DISABLED);
+	}
 
 	if (0 && item->submenu) {
 		GntMenu *sub = GNT_MENU(item->submenu);
@@ -307,15 +314,25 @@
 	}
 
 	if (menu->type == GNT_MENU_TOPLEVEL) {
+		GntMenuItem *item;
+		GList *it;
 		if (strcmp(text, GNT_KEY_LEFT) == 0) {
-			if (menu->selected == 0)
-				menu->selected = g_list_length(menu->list) - 1;
-			else
-				menu->selected--;
+			do {
+				if (menu->selected == 0)
+					menu->selected = g_list_length(menu->list) - 1;
+				else
+					menu->selected--;
+				it = g_list_nth(menu->list, menu->selected);
+				item = it ? it->data : NULL;
+			} while (!gnt_menuitem_is_visible(item));
 		} else if (strcmp(text, GNT_KEY_RIGHT) == 0) {
-			menu->selected++;
-			if (menu->selected >= g_list_length(menu->list))
-				menu->selected = 0;
+			do {
+				menu->selected++;
+				if (menu->selected >= g_list_length(menu->list))
+					menu->selected = 0;
+				it = g_list_nth(menu->list, menu->selected);
+				item = it ? it->data : NULL;
+			} while (!gnt_menuitem_is_visible(item));
 		} else if (strcmp(text, GNT_KEY_ENTER) == 0 ||
 				strcmp(text, GNT_KEY_DOWN) == 0) {
 			gnt_widget_activate(widget);

mercurial