diff -r 2dda1ad6dc7a -r 012418e7dc90 ui/gtk/menu.c --- a/ui/gtk/menu.c Wed Apr 02 20:31:47 2014 +0200 +++ b/ui/gtk/menu.c Thu Apr 03 11:12:22 2014 +0200 @@ -29,6 +29,7 @@ #include #include #include +#include #include "menu.h" #include "toolkit.h" @@ -80,6 +81,14 @@ } void ui_menuitem(char *label, ui_callback f, void *userdata) { + ui_menuitem_gr(label, f, userdata, -1); +} + +void ui_menuitem_st(char *stockid, ui_callback f, void *userdata) { + ui_menuitem_stgr(stockid, f, userdata, -1); +} + +void ui_menuitem_gr(char *label, ui_callback f, void *userdata, ...) { if(!current) { return; } @@ -90,12 +99,22 @@ item->label = label; item->userdata = userdata; item->callback = f; + item->groups = NULL; + + // add groups + va_list ap; + va_start(ap, userdata); + int group; + while((group = va_arg(ap, int)) != -1) { + item->groups = ucx_list_append(item->groups, (void*)(intptr_t)group); + } + va_end(ap); UiMenu *cm = current->data; cm->items = ucx_list_append(cm->items, item); } -void ui_menuitem_st(char *stockid, ui_callback f, void *userdata) { +void ui_menuitem_stgr(char *stockid, ui_callback f, void *userdata, ...) { if(!current) { return; } @@ -106,6 +125,16 @@ item->stockid = stockid; item->userdata = userdata; item->callback = f; + item->groups = NULL; + + // add groups + va_list ap; + va_start(ap, userdata); + int group; + while((group = va_arg(ap, int)) != -1) { + item->groups = ucx_list_append(item->groups, (void*)(intptr_t)group); + } + va_end(ap); UiMenu *cm = current->data; cm->items = ucx_list_append(cm->items, item); @@ -224,9 +253,18 @@ "activate", G_CALLBACK(ui_menu_event_wrapper), event); + g_signal_connect( + widget, + "destroy", + G_CALLBACK(ui_destroy_userdata), + event); } gtk_menu_shell_append(GTK_MENU_SHELL(parent), widget); + + if(i->groups) { + uic_add_group_widget(obj->ctx, widget, i->groups); + } } void add_menuitem_st_widget( @@ -251,9 +289,18 @@ "activate", G_CALLBACK(ui_menu_event_wrapper), event); + g_signal_connect( + widget, + "destroy", + G_CALLBACK(ui_destroy_userdata), + event); } gtk_menu_shell_append(GTK_MENU_SHELL(parent), widget); + + if(i->groups) { + uic_add_group_widget(obj->ctx, widget, i->groups); + } } void add_menuseparator_widget( @@ -284,6 +331,11 @@ "toggled", G_CALLBACK(ui_menu_event_toggled), event); + g_signal_connect( + widget, + "destroy", + G_CALLBACK(ui_destroy_userdata), + event); } } @@ -336,7 +388,8 @@ GList *mi = gtk_container_get_children(GTK_CONTAINER(list->menu)); while(mi) { if(i >= list->index && i < list->index + list->oldcount) { - gtk_container_remove(GTK_CONTAINER(list->menu), mi->data); + //gtk_container_remove(GTK_CONTAINER(list->menu), mi->data); + gtk_widget_destroy(mi->data); } mi = mi->next; i++; @@ -368,6 +421,11 @@ "activate", G_CALLBACK(ui_menu_event_wrapper), event); + g_signal_connect( + widget, + "destroy", + G_CALLBACK(ui_destroy_userdata), + event); } str = ui_list_next(list->list);