#include static void action_activated (GSimpleAction *action, GVariant *parameter, gpointer user_data) { GtkWindow *parent = user_data; GtkWidget *dialog; dialog = gtk_message_dialog_new (parent, GTK_DIALOG_DESTROY_WITH_PARENT, GTK_MESSAGE_INFO, GTK_BUTTONS_CLOSE, "Activated action `%s`", g_action_get_name (G_ACTION (action))); g_signal_connect_swapped (dialog, "response", G_CALLBACK (gtk_window_destroy), dialog); gtk_widget_show (dialog); } static GActionEntry doc_entries[] = { { "save", action_activated }, { "print", action_activated }, { "share", action_activated } }; static GActionEntry win_entries[] = { { "fullscreen", action_activated }, { "close", action_activated }, }; const gchar *menu_ui = "" " " "
" " " " _Save" " save" " " " " " _Print" " print" " " " " " _Share" " share" " " "
" "
" " " "
" " " " _Fullscreen" " fullscreen" " " " " " _Close" " close" " " "
" "
" "
"; static void activate (GApplication *app, gpointer user_data) { GtkWidget *win; GtkWidget *button; GSimpleActionGroup *doc_actions; GtkBuilder *builder; GMenuModel *doc_menu; GMenuModel *win_menu; GMenu *button_menu; GMenuItem *section; if (gtk_application_get_windows (GTK_APPLICATION (app)) != NULL) return; win = gtk_application_window_new (GTK_APPLICATION (app)); gtk_window_set_default_size (GTK_WINDOW (win), 200, 300); doc_actions = g_simple_action_group_new (); g_action_map_add_action_entries (G_ACTION_MAP (doc_actions), doc_entries, G_N_ELEMENTS (doc_entries), win); g_action_map_add_action_entries (G_ACTION_MAP (win), win_entries, G_N_ELEMENTS (win_entries), win); builder = gtk_builder_new (); gtk_builder_add_from_string (builder, menu_ui, -1, NULL); doc_menu = G_MENU_MODEL (gtk_builder_get_object (builder, "doc-menu")); win_menu = G_MENU_MODEL (gtk_builder_get_object (builder, "win-menu")); button_menu = g_menu_new (); section = g_menu_item_new_section (NULL, doc_menu); g_menu_item_set_attribute (section, "action-namespace", "s", "doc"); g_menu_append_item (button_menu, section); g_object_unref (section); section = g_menu_item_new_section (NULL, win_menu); g_menu_item_set_attribute (section, "action-namespace", "s", "win"); g_menu_append_item (button_menu, section); g_object_unref (section); button = gtk_menu_button_new (); gtk_button_set_label (GTK_BUTTON (button), "Menu"); gtk_widget_insert_action_group (button, "doc", G_ACTION_GROUP (doc_actions)); gtk_menu_button_set_menu_model (GTK_MENU_BUTTON (button), G_MENU_MODEL (button_menu)); gtk_widget_set_halign (GTK_WIDGET (button), GTK_ALIGN_CENTER); gtk_widget_set_valign (GTK_WIDGET (button), GTK_ALIGN_START); gtk_window_set_child (GTK_WINDOW (window), button); gtk_widget_show (win); g_object_unref (button_menu); g_object_unref (doc_actions); g_object_unref (builder); } int main(int argc, char **argv) { GtkApplication *app; app = gtk_application_new ("org.gtk.Example", 0); g_signal_connect (app, "activate", G_CALLBACK (activate), NULL); return g_application_run (G_APPLICATION (app), argc, argv); }