It works! This is very clever, nice one Artur! I wouldn't have come up with this on my own. For the reference a stripped down sample code provided below for a choice of 2 options: static void choose_handler(void*, gpointer); static gboolean idle_chooser(gpointer); static void choose_deactivate_handler(void*, gpointer); static void choose_handler(void*, gpointer); enum { FIRST_CHOICE = 1, SECOND_CHOICE, }; static gboolean has_chosen; void popup_chooser(void) { has_chosen = FALSE; GtkWidget *popup = = gtk_menu_new(); GtkWidget *first_choice = gtk_menu_item_new_with_mnemonic("_First choice"); GtkWidget *second_choice = gtk_menu_item_new_with_mnemonic("_Second choice"); // Connect the signals as normal: g_signal_connect (GTK_OBJECT (first_choice), "activate", G_CALLBACK (choose_handler), GINT_TO_POINTER(FIRST_CHOICE)); g_signal_connect (GTK_OBJECT (second_choice), "activate", G_CALLBACK (choose_handler), GINT_TO_POINTER(SECOND_CHOICE)); // Add a special handler on the menu for "deactivate": g_signal_connect (GTK_OBJECT (choose_popup), "deactivate", G_CALLBACK (choose_deactivate_handler), NULL); gtk_widget_show (first_choice); gtk_widget_show (second_choice); gtk_menu_attach( GTK_MENU(popup), first_choice, 0, 1, 0, 1); gtk_menu_attach( GTK_MENU(popup), first_choice, 0, 1, 1, 2); gtk_menu_popup ( GTK_MENU(popup), NULL, NULL, NULL, NULL, 0, gtk_get_current_event_time()); } // Define the handlers static gboolean idle_chooser(gpointer trash) { if ( ! has_chosen) { printf("User has NOT chosen!\n"); // now make a choice [...] } else { printf("User chose\n"); } return FALSE; } static void choose_deactivate_handler(void *GtkWidget, gpointer value) { g_idle_add(idle_chooser, NULL); } static void choose_handler(void *GtkWidget, gpointer value) { has_chosen = TRUE; } Thanks a ton Artur! Julien From: artur-pub@xxxxxxxxx To: julien_bramary@xxxxxxx CC: gtk-list@xxxxxxxxx Subject: Re: GtkMenu question Date: Sun, 13 Dec 2009 22:20:28 +0300 13.12.09, 22:12, "Artur Galyamov" <artur-pub@xxxxxxxxx>: same iteration of main loop -- if so, you can play with g_idle_add() to set final value: before popup -> set default value to tmp on optional activate -> set activated value to tmp ... (iteration ends) on high-priority idle -> set final value from tmp Sorry.. forgot it: set idle callback at "hide" emission. -- Artur _________________________________________________________________ Windows Live: Friends get your Flickr, Yelp, and Digg updates when they e-mail you. http://www.microsoft.com/middleeast/windows/windowslive/see-it-in-action/social-network-basics.aspx?ocid=PID23461::T:WLMTAGL:ON:WL:en-xm:SI_SB_3:092010 _______________________________________________ gtk-list mailing list gtk-list@xxxxxxxxx http://mail.gnome.org/mailman/listinfo/gtk-list