/* UI Manager * * The GtkUIManager object allows the easy creation of menus * from an array of actions and a description of the menu hierarchy. */ #include static void activate_action (GtkAction *action) { g_message ("Action \"%s\" activated", gtk_action_get_name (action)); } static void activate_radio_action (GtkAction *action, GtkRadioAction *current) { g_message ("Radio action \"%s\" selected", gtk_action_get_name (GTK_ACTION (current))); } static GtkActionEntry entries[] = { { "FileMenu", NULL, "_File" }, /* name, stock id, label */ { "PreferencesMenu", NULL, "_Preferences" }, /* name, stock id, label */ { "ColorMenu", NULL, "_Color" }, /* name, stock id, label */ { "ShapeMenu", NULL, "_Shape" }, /* name, stock id, label */ { "HelpMenu", NULL, "_Help" }, /* name, stock id, label */ { "New", GTK_STOCK_NEW, /* name, stock id */ "_New", "N", /* label, accelerator */ "Create a new file", /* tooltip */ G_CALLBACK (activate_action) }, { "Open", GTK_STOCK_OPEN, /* name, stock id */ "_Open","O", /* label, accelerator */ "Open a file", /* tooltip */ G_CALLBACK (activate_action) }, { "Save", GTK_STOCK_SAVE, /* name, stock id */ "_Save","S", /* label, accelerator */ "Save current file", /* tooltip */ G_CALLBACK (activate_action) }, { "SaveAs", GTK_STOCK_SAVE, /* name, stock id */ "Save _As...", NULL, /* label, accelerator */ "Save to a file", /* tooltip */ G_CALLBACK (activate_action) }, { "Quit", GTK_STOCK_QUIT, /* name, stock id */ "_Quit", "Q", /* label, accelerator */ "Quit", /* tooltip */ G_CALLBACK (activate_action) }, { "About", NULL, /* name, stock id */ "_About", "A", /* label, accelerator */ "About", /* tooltip */ G_CALLBACK (activate_action) }, { "Logo", "demo-gtk-logo", /* name, stock id */ NULL, NULL, /* label, accelerator */ "GTK+", /* tooltip */ G_CALLBACK (activate_action) }, }; static guint n_entries = G_N_ELEMENTS (entries); static GtkToggleActionEntry toggle_entries[] = { { "Bold", GTK_STOCK_BOLD, /* name, stock id */ "_Bold", "B", /* label, accelerator */ "Bold", /* tooltip */ G_CALLBACK (activate_action), TRUE }, /* is_active */ }; static guint n_toggle_entries = G_N_ELEMENTS (toggle_entries); enum { COLOR_RED, COLOR_GREEN, COLOR_BLUE }; static GtkRadioActionEntry color_entries[] = { { "Red", NULL, /* name, stock id */ "_Red", "R", /* label, accelerator */ "Blood", COLOR_RED }, /* tooltip, value */ { "Green", NULL, /* name, stock id */ "_Green", "G", /* label, accelerator */ "Grass", COLOR_GREEN }, /* tooltip, value */ { "Blue", NULL, /* name, stock id */ "_Blue", "B", /* label, accelerator */ "Sky", COLOR_BLUE }, /* tooltip, value */ }; static guint n_color_entries = G_N_ELEMENTS (color_entries); enum { SHAPE_SQUARE, SHAPE_RECTANGLE, SHAPE_OVAL }; static GtkRadioActionEntry shape_entries[] = { { "Square", NULL, /* name, stock id */ "_Square", "S", /* label, accelerator */ "Square", SHAPE_SQUARE }, /* tooltip, value */ { "Rectangle", NULL, /* name, stock id */ "_Rectangle", "R", /* label, accelerator */ "Rectangle", SHAPE_RECTANGLE }, /* tooltip, value */ { "Oval", NULL, /* name, stock id */ "_Oval", "O", /* label, accelerator */ "Egg", SHAPE_OVAL }, /* tooltip, value */ }; static guint n_shape_entries = G_N_ELEMENTS (shape_entries); static const gchar *ui_info = "" " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " ""; GtkWidget * do_ui_manager (GtkWidget *do_widget) { static GtkWidget *window = NULL; if (!window) { GtkWidget *box1; GtkWidget *box2; GtkWidget *separator; GtkWidget *label; GtkWidget *button; GtkUIManager *ui; GtkActionGroup *actions; GError *error = NULL; window = gtk_window_new (GTK_WINDOW_TOPLEVEL); gtk_window_set_screen (GTK_WINDOW (window), gtk_widget_get_screen (do_widget)); g_signal_connect (window, "destroy", G_CALLBACK (gtk_widget_destroyed), &window); g_signal_connect (window, "delete-event", G_CALLBACK (gtk_true), NULL); actions = gtk_action_group_new ("Actions"); gtk_action_group_add_actions (actions, entries, n_entries, NULL); gtk_action_group_add_toggle_actions (actions, toggle_entries, n_toggle_entries, NULL); gtk_action_group_add_radio_actions (actions, color_entries, n_color_entries, COLOR_RED, G_CALLBACK (activate_radio_action), NULL); gtk_action_group_add_radio_actions (actions, shape_entries, n_shape_entries, SHAPE_OVAL, G_CALLBACK (activate_radio_action), NULL); ui = gtk_ui_manager_new (); gtk_ui_manager_insert_action_group (ui, actions, 0); g_object_unref (actions); gtk_window_add_accel_group (GTK_WINDOW (window), gtk_ui_manager_get_accel_group (ui)); gtk_window_set_title (GTK_WINDOW (window), "UI Manager"); gtk_container_set_border_width (GTK_CONTAINER (window), 0); if (!gtk_ui_manager_add_ui_from_string (ui, ui_info, -1, &error)) { g_message ("building menus failed: %s", error->message); g_error_free (error); } box1 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0); gtk_container_add (GTK_CONTAINER (window), box1); gtk_box_pack_start (GTK_BOX (box1), gtk_ui_manager_get_widget (ui, "/MenuBar"), FALSE, FALSE, 0); label = gtk_label_new ("Type\n\nto start"); gtk_widget_set_size_request (label, 200, 200); gtk_widget_set_halign (label, GTK_ALIGN_CENTER); gtk_widget_set_valign (label, GTK_ALIGN_CENTER); gtk_box_pack_start (GTK_BOX (box1), label, TRUE, TRUE, 0); separator = gtk_separator_new (GTK_ORIENTATION_HORIZONTAL); gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 0); box2 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 10); gtk_container_set_border_width (GTK_CONTAINER (box2), 10); gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, TRUE, 0); button = gtk_button_new_with_label ("close"); g_signal_connect_swapped (button, "clicked", G_CALLBACK (gtk_widget_destroy), window); gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0); gtk_widget_set_can_default (button, TRUE); gtk_widget_grab_default (button); gtk_widget_show_all (window); g_object_unref (ui); } else { gtk_widget_destroy (window); window = NULL; } return window; }