static GtkWidget * menu_find_path (GtkWidget *menu, char *path) { GtkMenuItem *item; char *s; char name[128]; int len; /* grab the next part of the path */ s = strchr (path, '/'); len = s - path; if (!s) len = strlen (path); len = MIN (len, sizeof (name) - 1); memcpy (name, path, len); name[len] = 0; item = menu_find_item (menu, name); if (!item) return NULL; menu = gtk_menu_item_get_submenu (item); if (!menu) return NULL; path += len; if (*path == 0) return menu; return menu_find_path (menu, path + 1); }
static GtkWidget * menu_find (GtkWidget *menu, char *path, char *label) { GtkWidget *item = NULL; if (path[0] != 0) menu = menu_find_path (menu, path); if (menu) item = (GtkWidget *)menu_find_item (menu, label); return item; }
static GtkWidget * menu_add_toggle(GtkWidget *menu, menu_entry * me) { GtkWidget *item = NULL; char *path = me->path + me->root_offset; if (path[0] != 0) menu = menu_find_path(menu, path); if (menu) { item = menu_toggle_item(me->label, menu, menu_toggle_cb, me, me->state); menu_reorder(GTK_MENU(menu), item, me->pos); } return item; }
static GtkWidget * menu_add_item (GtkWidget *menu, menu_entry *me, char *target) { GtkWidget *item = NULL; char *path = me->path + me->root_offset; if (path[0] != 0) menu = menu_find_path (menu, path); if (menu) { item = menu_quick_item (me->cmd, me->label, menu, me->markup ? XCMENU_MARKUP|XCMENU_MNEMONIC : XCMENU_MNEMONIC, target, me->icon); menu_reorder (GTK_MENU (menu), item, me->pos); } return item; }
static GtkWidget *menu_add_sub(GtkWidget *menu, menu_entry *me) { GtkWidget *item = NULL; char *path = me->path + me->root_offset; int pos; if (path[0] != 0) menu = menu_find_path(menu, path); if (menu) { pos = me->pos; if (pos < 0) /* position offset from end/bottom */ pos = g_list_length(GTK_MENU_SHELL(menu)->children) + pos; menu_quick_sub(me->label, menu, &item, me->markup ? XCMENU_MARKUP | XCMENU_MNEMONIC : XCMENU_MNEMONIC, pos); } return item; }