GtkWidget * libbalsa_window_get_menu_bar(GtkApplicationWindow * window, const GActionEntry * entries, gint n_entries, const gchar * ui_file, GError ** error, gpointer cb_data) { GActionMap *map = G_ACTION_MAP(window); GtkBuilder *builder; GtkWidget *menu_bar = NULL; g_action_map_add_action_entries(map, entries, n_entries, cb_data); builder = gtk_builder_new(); if (gtk_builder_add_from_file(builder, ui_file, error)) { GMenuModel *menu_model; menu_model = G_MENU_MODEL(gtk_builder_get_object(builder, "menubar")); menu_bar = gtk_menu_bar_new_from_model(menu_model); libbalsa_window_set_accels(window, menu_model); gtk_application_window_set_show_menubar(window, FALSE); } g_object_unref(builder); return menu_bar; }
static void gtk_application_window_update_menubar (GtkApplicationWindow *window) { gboolean should_have_menubar; gboolean have_menubar; have_menubar = window->priv->menubar != NULL; should_have_menubar = window->priv->show_menubar && (g_menu_model_get_n_items (G_MENU_MODEL (window->priv->app_menu_section)) || g_menu_model_get_n_items (G_MENU_MODEL (window->priv->menubar_section))); if (have_menubar && !should_have_menubar) { gtk_widget_unparent (window->priv->menubar); window->priv->menubar = NULL; gtk_widget_queue_resize (GTK_WIDGET (window)); } if (!have_menubar && should_have_menubar) { GMenu *combined; combined = g_menu_new (); g_menu_append_section (combined, NULL, G_MENU_MODEL (window->priv->app_menu_section)); g_menu_append_section (combined, NULL, G_MENU_MODEL (window->priv->menubar_section)); window->priv->menubar = gtk_menu_bar_new_from_model (G_MENU_MODEL (combined)); gtk_widget_set_parent (window->priv->menubar, GTK_WIDGET (window)); gtk_widget_show_all (window->priv->menubar); g_object_unref (combined); gtk_widget_queue_resize (GTK_WIDGET (window)); } }
static void do_appwindow (GSimpleAction *action, GVariant *parameter, gpointer user_data) { GtkWidget *window; GtkWidget *grid; GtkWidget *statusbar; GtkWidget *contents; GtkWidget *sw; GtkTextBuffer *buffer; GSimpleActionGroup *action_group; GtkBuilder *builder; GMenuModel *model; GtkWidget *menubar; GtkWidget *toolbar; /* Create the toplevel window */ ++window_count; aspect_on = FALSE; window = gtk_window_new (GTK_WINDOW_TOPLEVEL); gtk_window_set_title (GTK_WINDOW (window), "Application Window"); g_signal_connect (G_OBJECT (window), "destroy", G_CALLBACK (destroy_cb), NULL); grid = gtk_grid_new (); gtk_widget_set_vexpand (grid, TRUE); gtk_widget_set_hexpand (grid, TRUE); gtk_container_add (GTK_CONTAINER (window), grid); action_group = g_simple_action_group_new (); builder = gtk_builder_new_from_string (xml, -1); g_action_map_add_action_entries (G_ACTION_MAP (action_group), demo_entries, G_N_ELEMENTS (demo_entries), window); gtk_widget_insert_action_group (window, "demo", G_ACTION_GROUP (action_group)); /* Create the menubar */ model = G_MENU_MODEL (gtk_builder_get_object (builder, "menubar")); menubar = gtk_menu_bar_new_from_model (model); gtk_grid_attach (GTK_GRID (grid), menubar, 0, 0, 1, 1); gtk_widget_set_hexpand (menubar, TRUE); /* Create the toolbar */ toolbar = create_toolbar (); gtk_grid_attach (GTK_GRID (grid), toolbar, 0, 1, 1, 1); gtk_widget_set_hexpand (toolbar, TRUE); /* Create document */ contents = gtk_text_view_new (); sw = gtk_scrolled_window_new (NULL, NULL); gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (sw), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC); gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (sw), GTK_SHADOW_IN); gtk_grid_attach (GTK_GRID (grid), sw, 0, 2, 1, 1); gtk_widget_set_hexpand (sw, TRUE); gtk_widget_set_vexpand (sw, TRUE); gtk_window_set_default_size (GTK_WINDOW (window), 200, 200); gtk_text_view_set_wrap_mode (GTK_TEXT_VIEW (contents), PANGO_WRAP_WORD); gtk_container_add (GTK_CONTAINER (sw), contents); /* Create statusbar */ statusbar = gtk_statusbar_new (); gtk_grid_attach (GTK_GRID (grid), statusbar, 0, 3, 1, 1); gtk_widget_set_hexpand (statusbar, TRUE); /* Show text widget info in the statusbar */ buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (contents)); gtk_text_buffer_set_text (buffer, "This demo demonstrates various kinds of windows that " "window managers and window manager themes should handle. " "Be sure to tear off the menu and toolbar, those are also " "a special kind of window.", -1); g_signal_connect_object (buffer, "changed", G_CALLBACK (update_statusbar), statusbar, 0); g_signal_connect_object (buffer, "mark_set", /* cursor moved */ G_CALLBACK (mark_set_callback), statusbar, 0); update_statusbar (buffer, GTK_STATUSBAR (statusbar)); gtk_widget_show_all (window); g_object_unref (action_group); g_object_unref (builder); }
/*********************************************************************** Menu */ void bmd_construct_menu (GtkApplication *app, gpointer data) { GtkWidget *menubar; GMenu *menu, *filemenu, *editmenu, *helpmenu, *savemenu, *quitmenu; bmd_widgets *a = (bmd_widgets *) data; // define keyboard accelerators const gchar *open_accels[2] = { "<Ctrl>O", NULL }; const gchar *save_accels[2] = { "<Ctrl>S", NULL }; const gchar *quit_accels[2] = { "<Ctrl>Q", NULL }; const gchar *add_accels[2] = { "<Ctrl>A", NULL }; const gchar *del_accels[2] = { "<Ctrl>D", NULL }; const gchar *find_accels[2] = { "<Ctrl>F", NULL }; const gchar *help_accels[2] = { "F1", NULL }; /* map app entries to actions using the global structure */ g_action_map_add_action_entries (G_ACTION_MAP (app), app_entries, G_N_ELEMENTS (app_entries), (gpointer) a); /* create the menu */ menu = g_menu_new(); /* create the File menu */ filemenu = g_menu_new(); g_menu_append (filemenu, "_Open", "app.open"); savemenu = g_menu_new(); g_menu_append (savemenu, "_Save", "app.save"); g_menu_append (savemenu, "Save As ...", "app.saveAs"); g_menu_append_section (filemenu, NULL, G_MENU_MODEL (savemenu)); quitmenu = g_menu_new(); g_menu_append (quitmenu, "_Quit", "app.quit"); g_menu_append_section (filemenu, NULL, G_MENU_MODEL (quitmenu)); g_menu_insert_submenu (menu, 0, "_File", G_MENU_MODEL (filemenu)); g_object_unref (savemenu); g_object_unref (quitmenu); g_object_unref (filemenu); /* create the Edit menu */ editmenu = g_menu_new(); g_menu_append (editmenu, "_Find", "app.find"); g_menu_append (editmenu, "_Add", "app.add"); g_menu_append (editmenu, "_Delete", "app.delete"); g_menu_append_submenu (menu, "_Edit", G_MENU_MODEL (editmenu)); g_object_unref (editmenu); /* create the Help menu */ helpmenu = g_menu_new(); g_menu_append (helpmenu, "About", "app.about"); g_menu_append (helpmenu, "Help", "app.help"); g_menu_append_submenu (menu, "_Help", G_MENU_MODEL (helpmenu)); g_object_unref (helpmenu); /* create a menu bar and add the above menus */ menubar = gtk_menu_bar_new_from_model (G_MENU_MODEL (menu)); gtk_box_pack_start (GTK_BOX (a->box), menubar, FALSE, FALSE, 0); /* connect keyboard accelerators */ gtk_application_set_accels_for_action (GTK_APPLICATION (app), "app.open", open_accels); gtk_application_set_accels_for_action (GTK_APPLICATION (app), "app.save", save_accels); gtk_application_set_accels_for_action (GTK_APPLICATION (app), "app.quit", quit_accels); gtk_application_set_accels_for_action (GTK_APPLICATION (app), "app.add", add_accels); gtk_application_set_accels_for_action (GTK_APPLICATION (app), "app.delete", del_accels); gtk_application_set_accels_for_action (GTK_APPLICATION (app), "app.find", find_accels); gtk_application_set_accels_for_action (GTK_APPLICATION (app), "app.help", help_accels); }
void gw_window_load_menubar (GwWindow *window, const gchar* BASE_NAME) { //Declarations GwWindowPrivate *priv; GtkBuilder *builder; GtkApplication *application; GMenuModel *win_menu_model; gboolean loaded; gboolean os_shows_app_menu; gboolean os_shows_win_menu; gchar *filename; GtkWidget *menubar; GtkSettings *settings; //Initializations priv = window->priv; application = GTK_APPLICATION (gw_window_get_application (window)); menubar = NULL; loaded = FALSE; builder = NULL; filename = NULL; win_menu_model = NULL; settings = gtk_settings_get_default (); g_object_get (settings, "gtk-shell-shows-app-menu", &os_shows_app_menu, NULL); g_object_get (settings, "gtk-shell-shows-menubar", &os_shows_win_menu, NULL); builder = gtk_builder_new (); if (builder == NULL) goto errored; if (os_shows_app_menu && os_shows_win_menu) //Mac OS X style { filename = g_strjoin ("-", BASE_NAME, "menumodel", "macosx.ui", NULL); if (filename == NULL) goto errored; } else if (os_shows_app_menu != os_shows_win_menu) //Gnome 3 style { filename = g_strjoin ("-", BASE_NAME, "menumodel", "gnome.ui", NULL); if (filename == NULL) goto errored; } else //Windows style { filename = g_strjoin ("-", BASE_NAME, "menumodel", "standard.ui", NULL); if (filename == NULL) goto errored; } loaded = gw_application_load_xml (builder, filename); if (loaded == FALSE) goto errored; win_menu_model = G_MENU_MODEL (gtk_builder_get_object (builder, "menu")); if (win_menu_model == NULL) goto errored; //Set the whole menu to the window if appropriate if (os_shows_win_menu == FALSE) { menubar = gtk_menu_bar_new_from_model (win_menu_model); if (menubar == NULL) goto errored; gtk_box_pack_end (GTK_BOX (priv->toplevel), menubar, FALSE, FALSE, 0); gtk_widget_show_all (menubar); } gw_application_add_accelerators (GW_APPLICATION (application), win_menu_model); //Save the menu objects in the window if (priv->menu_model != NULL) g_object_unref (priv->menu_model); priv->menu_model = win_menu_model; win_menu_model = NULL; if (priv->menubar != NULL) gtk_widget_destroy (GTK_WIDGET (priv->menubar)); priv->menubar = GTK_MENU_BAR (menubar); menubar = NULL; errored: if (builder != NULL) g_object_unref (builder); builder = NULL; if (filename != NULL) g_free (filename); filename = NULL; if (win_menu_model != NULL) g_object_unref (G_OBJECT (win_menu_model)); if (menubar != NULL) { g_object_ref_sink (menubar); gtk_widget_destroy (menubar); }; }