GNOME has introduced the AppMenu for some of its core applications starting with GNOME 3.4. This means that part of the menu or the whole menu is displayed as a drop-down on the top GNOME Shell bar.
Some applications now have two menus: an AppMenu that's displayed on the top GNOME Shell bar which is used for actions that affect the entire application and another menu that's displayed in the application window, which affects the currently focused window.
Some GNOME applications only use an AppMenu, without a secondary window menu.
Here a simple c program that shows the AppMenu (without menu separators) that shows how it looks like:
Code: Select all
#include <gtk/gtk.h>
static void preferences (GSimpleAction *action, GVariant *parameter, gpointer user_data)
{
g_print ("This does nothing. It is only a demonstration.\n");
}
static void help (GSimpleAction *action, GVariant *parameter, gpointer user_data)
{
g_print ("This does nothing. It is only a demonstration.\n");
}
static void about (GSimpleAction *action, GVariant *parameter, gpointer user_data)
{
g_print ("This does nothing. It is only a demonstration.\n");
}
static void quit (GSimpleAction *action, GVariant *parameter, gpointer user_data)
{
GApplication *application = user_data;
g_application_quit (application);
}
static void startup (GtkApplication *application, gpointer user_data)
{
static const GActionEntry actions[] = {
{ "preferences", preferences },
{ "help", help },
{ "about", about },
{ "quit", quit }
};
GMenu *menu;
g_action_map_add_action_entries (G_ACTION_MAP (application), actions, G_N_ELEMENTS (actions), application);
menu = g_menu_new ();
g_menu_append (menu, "Preferences", "app.preferences");
g_menu_append (menu, "Help", "app.help");
g_menu_append (menu, "About", "app.about");
g_menu_append (menu, "Quit", "app.quit");
gtk_application_set_app_menu (application, G_MENU_MODEL (menu));
g_object_unref (menu);
}
static void activate (GtkApplication *app, gpointer user_data)
{
GtkWidget *window;
window = gtk_application_window_new (app);
gtk_window_set_application (GTK_WINDOW (window), GTK_APPLICATION (app));
gtk_window_set_title (GTK_WINDOW (window), "Hello GNOME");
gtk_widget_show_all (GTK_WIDGET (window));
}
int main (int argc, char **argv)
{
GtkApplication *app;
int status;
app = gtk_application_new ("org.gtk.example",G_APPLICATION_FLAGS_NONE);
g_signal_connect (app, "startup",
G_CALLBACK (startup), NULL);
g_signal_connect (app, "activate", G_CALLBACK (activate), NULL);
status = g_application_run (G_APPLICATION (app), argc, argv);
g_object_unref (app);
return status;
}
Code: Select all
#include <gtk/gtk.h>
/* Callback function for the undo action */
static void item2_callback (GSimpleAction *simple, GVariant *parameter, gpointer user_data)
{
g_print ("You clicked \"Item 2\"\n");
}
static void activate (GtkApplication *app, gpointer user_data)
{
GMenu *submenu;
GtkWidget *grid;
GMenu *menumodel;
GtkWidget *window;
GtkWidget *menubutton;
GSimpleAction *item2_action;
window = gtk_application_window_new (app);
grid = gtk_grid_new ();
gtk_window_set_title (GTK_WINDOW (window), "MenuButton Example");
gtk_window_set_default_size (GTK_WINDOW (window), 600, 400);
menubutton = gtk_menu_button_new ();
gtk_widget_set_size_request (menubutton, 80, 35);
gtk_grid_attach (GTK_GRID (grid), menubutton, 0, 0, 1, 1);
gtk_container_add (GTK_CONTAINER (window), grid);
menumodel = g_menu_new ();
g_menu_append (menumodel, "Item 1", "app.item1");
g_menu_append (menumodel, "Item 2", "win.item2");
submenu = g_menu_new ();
g_menu_append_submenu (menumodel, "Other", G_MENU_MODEL (submenu));
g_menu_append (submenu, "Quit", "app.quit");
gtk_menu_button_set_menu_model (GTK_MENU_BUTTON (menubutton), G_MENU_MODEL (menumodel));
item2_action = g_simple_action_new ("item2", NULL);
g_signal_connect (item2_action, "activate", G_CALLBACK (item2_callback), GTK_WINDOW (window));
g_action_map_add_action (G_ACTION_MAP (window), G_ACTION (item2_action));
gtk_widget_show_all (window);
}
static void item1_callback (GSimpleAction *simple, GVariant *parameter, gpointer user_data)
{
g_print ("You clicked \"Item 1\"\n");
}
static void quit_callback (GSimpleAction *simple, GVariant *parameter, gpointer user_data)
{
GApplication *application = user_data;
g_application_quit (application);
}
static void startup (GApplication *app, gpointer user_data)
{
GSimpleAction *item1_action;
GSimpleAction *quit_action;
item1_action = g_simple_action_new ("item1", NULL);
g_signal_connect (item1_action, "activate", G_CALLBACK (item1_callback), app);
g_action_map_add_action (G_ACTION_MAP (app), G_ACTION (item1_action));
quit_action = g_simple_action_new ("quit", NULL);
g_signal_connect (quit_action, "activate", G_CALLBACK (quit_callback), app);
g_action_map_add_action (G_ACTION_MAP (app), G_ACTION (quit_action));
}
int main (int argc, char **argv)
{
GtkApplication *app;
int status;
app = gtk_application_new ("org.gtk.example", G_APPLICATION_FLAGS_NONE);
g_signal_connect (app, "activate", G_CALLBACK (activate), NULL);
g_signal_connect (app, "startup", G_CALLBACK (startup), NULL);
status = g_application_run (G_APPLICATION (app), argc, argv);
g_object_unref (app);
return status;
}