Очень интересуюсь тем, как сделать меню 3-его уровня. Ниже приведу листинг, с помощью которого получилось сделать строку меню с пунктом меню, по нажатию которого появляется меню. И для этого меню, свои пункты меню.
#include <gtk/gtk.h>
gint32 delete_event(GtkWidget *widget, GdkEvent *event, gpointer data)
{
gtk_main_quit();
return FALSE;
}
int main(int argc, char *argv[])
{
GtkWidget *window;
GtkWidget *menu_bar;
GtkWidget *menu;
GtkWidget *box;
gtk_init(&argc, &argv);
window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
gtk_window_set_title(GTK_WINDOW(window), "menu");
gtk_container_set_border_width(GTK_CONTAINER(window), 10);
g_signal_connect(G_OBJECT(window), "delete_event", G_CALLBACK(delete_event), "NULL");
box = gtk_box_new(GTK_ORIENTATION_VERTICAL, 0);
gtk_container_add(GTK_CONTAINER(window), box);
menu = gtk_menu_new(); // меню
menu_bar = gtk_menu_bar_new(); // строка меню
// создаем новые пункты меню
GtkWidget *file_item = gtk_menu_item_new_with_label("file");
GtkWidget *open_item = gtk_menu_item_new_with_label("open");
GtkWidget *save_item = gtk_menu_item_new_with_label("save");
GtkWidget *quit_item = gtk_menu_item_new_with_label("quit");
// привязываем пункты меню к меню
gtk_menu_shell_append(GTK_MENU_SHELL(menu), open_item);
gtk_menu_shell_append(GTK_MENU_SHELL(menu), save_item);
gtk_menu_shell_append(GTK_MENU_SHELL(menu), quit_item);
// обработчики сигналов для пунктов меню
g_signal_connect_swapped(G_OBJECT(open_item), "activate", G_CALLBACK(delete_event), "NULL");
g_signal_connect_swapped(G_OBJECT(save_item), "activate", G_CALLBACK(delete_event), "NULL");
g_signal_connect_swapped(G_OBJECT(quit_item), "activate", G_CALLBACK(delete_event), "NULL");
gtk_menu_item_set_submenu(GTK_MENU_ITEM(file_item), menu);
gtk_menu_shell_append(GTK_MENU_SHELL(menu_bar), file_item);
gtk_box_pack_start(GTK_BOX(box), menu_bar, FALSE, FALSE, 3);
gtk_widget_show_all(window);
gtk_main();
return 0;
}