Re: Optionmenuitem and labels

Alexander Nagel a écrit:
i build a option menu like in the gtk-docs and it works fine. Now i want to retrieve the label of the selected menuitem.
my code
ConfDatei.NewEntry ("Language", gtk_label_get_text (GTK_LABEL(gtk_bin_get_child(GTK_BIN(gtk_menu_get_active (GTK_MENU(General.LanguageSubMenu)))))));

Theoretically this should work and it should give me the label.
Compiling runs without any warning.
But i get this during execution:

(trollhunter:7444): Gtk-CRITICAL **: file ../../gtk/gtklabel.c: line 1142 (gtk_label_get_text): assertion `GTK_IS_LABEL (label)' failed
Aborted (core dumped)

Thanks for help
gtk-app-devel-list mailing list
gtk-app-devel-list gnome org



Sorry for the delay, I haven't read the list often recently.

It seems that nobody answered. If you haven't found yet, here is how I do the thing in a callback, connected to each menu item (it's with GTK 1.2.x,I don't know if it works with 2.x):

void omenu_callb(GtkWidget *wdg, gpointer data) {
        //      Set the current value from the option menu choice
        gchar *label;
        option_type *opt;
        opt = (option_type *) data;
        if (!GTK_CHECK_MENU_ITEM(wdg)->active) {
        if (!GTK_IS_LABEL(GTK_BIN(opt->widget)->child))
        // First call, label not available (!), opt->value is already initialized
        gtk_label_get(GTK_LABEL(GTK_BIN(opt->widget)->child ),&label);
        if (!strcmp(label,_(NO_VALUE)))
                opt->value[0] = '\0';  // Empty string
        // opt->value is already allocated with the max label length
                strcpy(opt->value, label);

Here is how I create the option menu (first item shown, I loop for the others after - it should be pretty standard):

        GSList *group = NULL;
        GtkWidget *menu, *menuitem;

        opt->widget = gtk_option_menu_new();
        menu = gtk_menu_new();
        gtk_option_menu_set_menu (GTK_OPTION_MENU(opt->widget),menu);
        menuitem = gtk_radio_menu_item_new_with_label (group,NO_VALUE);
        group =
        gtk_signal_connect(GTK_OBJECT(menuitem), "activate",
                GTK_SIGNAL_FUNC(omenu_callb), (gpointer) opt);

Now here is how I set the option menu item from a label - it could give you some hint on how you can "dig" inside the option menu:

void set_option_menu_from_label (GtkWidget *omenu, gchar *label) {
        GtkWidget *menu;
        GList *node;
        gchar *txt;
        if (GTK_IS_LABEL(GTK_BIN(omenu)->child)) {
                gtk_label_get(GTK_LABEL(GTK_BIN(omenu)->child), &txt);
                if (!strcmp(txt,label))  // Nothing to do, the label is already set
        menu = gtk_option_menu_get_menu(GTK_OPTION_MENU(omenu));
        node = GTK_MENU_SHELL(menu)->children;
        while (node) {
                if (GTK_IS_LABEL(GTK_BIN(node->data)->child)) {
                        gtk_label_get(GTK_LABEL(GTK_BIN(node->data)->child), &txt);
                        if (!strcmp(txt,label))
                } // If the child is not a label (typically it would be NULL),
                 // we skip it because the menu item is the current one
                node = node->next;
        if (node)       {       // Label found
                        g_list_index(GTK_MENU_SHELL(menu)->children, node->data));
        else {          // Label not found, revert to default

I wouldn't be able to explain all the details right away, I've done it by trial and error some time ago. Hoping this could help, BTW.

Best regards,

Patrice St-Gelais

[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]