static void tm_populate(GtkWidget * toolbar, BalsaToolbarModel * model) { gboolean style_is_both; gboolean make_two_line; GArray *current; guint j; GActionMap *action_map = g_object_get_data(G_OBJECT(toolbar), BALSA_TOOLBAR_ACTION_MAP); style_is_both = (model->style == GTK_TOOLBAR_BOTH || (model->style == (GtkToolbarStyle) - 1 && tm_default_style() == GTK_TOOLBAR_BOTH)); make_two_line = style_is_both && tm_has_second_line(model); current = balsa_toolbar_model_get_current(model); for (j = 0; j < current->len; j++) { BalsaToolbarEntry *entry; GtkToolItem *item; entry = &g_array_index(current, BalsaToolbarEntry, j); if (!*entry->action) { item = gtk_separator_tool_item_new(); } else { GtkWidget *icon; GAction *action; const GVariantType *type; gchar *prefixed_action; icon = gtk_image_new_from_icon_name (balsa_icon_id(entry->icon), GTK_ICON_SIZE_SMALL_TOOLBAR); action = g_action_map_lookup_action(action_map, entry->action); if (action && (type = g_action_get_state_type(action)) && g_variant_type_equal(type, G_VARIANT_TYPE_BOOLEAN)) { item = gtk_toggle_tool_button_new(); g_object_set(G_OBJECT(item), "icon-widget", icon, "label", entry->action, NULL); } else { item = gtk_tool_button_new(icon, entry->action); } tm_set_tool_item_label(GTK_TOOL_ITEM(item), entry->icon, make_two_line); prefixed_action = g_strconcat(action ? "win." : "app.", entry->action, NULL); gtk_actionable_set_action_name(GTK_ACTIONABLE(item), prefixed_action); g_free(prefixed_action); } gtk_toolbar_insert((GtkToolbar *) toolbar, item, -1); } gtk_toolbar_set_style(GTK_TOOLBAR(toolbar), model->style != (GtkToolbarStyle) (-1) ? model->style : tm_default_style()); gtk_widget_show_all(toolbar); }
static void tm_set_style(GtkWidget * toolbar, BalsaToolbarModel * model) { gtk_toolbar_set_style(GTK_TOOLBAR(toolbar), model->style != (GtkToolbarStyle) (-1) ? model->style : tm_default_style()); }
static gboolean tm_do_popup_menu(GtkWidget * toolbar, GdkEventButton * event, toolbar_info * info) { GtkWidget *menu; #if !GTK_CHECK_VERSION(3, 22, 0) int button, event_time; #endif /*GTK_CHECK_VERSION(3, 22, 0) */ guint i; GSList *group = NULL; GtkToolbarStyle default_style = tm_default_style(); if (info->menu) return FALSE; info->menu = menu = gtk_menu_new(); g_signal_connect(menu, "deactivate", G_CALLBACK(tm_popup_deactivated_cb), info); /* ... add menu items ... */ for (i = 0; i < G_N_ELEMENTS(tm_toolbar_options); i++) { GtkWidget *item; if (!tm_toolbar_options[i].text) continue; item = gtk_radio_menu_item_new_with_mnemonic(group, _(tm_toolbar_options[i]. text)); group = gtk_radio_menu_item_get_group(GTK_RADIO_MENU_ITEM(item)); if (tm_toolbar_options[i].style == info->model->style) gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(item), TRUE); gtk_menu_shell_append(GTK_MENU_SHELL(menu), item); g_object_set_data(G_OBJECT(item), BALSA_TOOLBAR_STYLE, GINT_TO_POINTER(tm_toolbar_options[i].style)); g_signal_connect(item, "toggled", G_CALLBACK(menu_item_toggled_cb), info); } for (i = 0; i < G_N_ELEMENTS(tm_toolbar_options); i++) { if (!tm_toolbar_options[i].text) continue; if (tm_toolbar_options[i].style == default_style) { gchar *option_text, *text; GtkWidget *item; gtk_menu_shell_append(GTK_MENU_SHELL(menu), gtk_separator_menu_item_new()); option_text = tm_remove_underscore(_(tm_toolbar_options[i].text)); text = g_strdup_printf(_("Use Desktop _Default (%s)"), option_text); g_free(option_text); item = gtk_radio_menu_item_new_with_mnemonic(group, text); g_free(text); if (info->model->style == (GtkToolbarStyle) (-1)) gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM (item), TRUE); gtk_menu_shell_append(GTK_MENU_SHELL(menu), item); g_object_set_data(G_OBJECT(item), BALSA_TOOLBAR_STYLE, GINT_TO_POINTER(-1)); g_signal_connect(item, "toggled", G_CALLBACK(menu_item_toggled_cb), info); } } if (gtk_widget_is_sensitive(toolbar)) { /* This is a real toolbar, not the template from the * toolbar-prefs dialog. */ GtkWidget *item; gtk_menu_shell_append(GTK_MENU_SHELL(menu), gtk_separator_menu_item_new()); item = gtk_menu_item_new_with_mnemonic(_("_Customize Toolbars…")); g_signal_connect(item, "activate", G_CALLBACK(customize_dialog_cb), gtk_widget_get_toplevel(toolbar)); gtk_menu_shell_append(GTK_MENU_SHELL(menu), item); /* Pass the model type to the customize widget, so that it can * show the appropriate notebook page. */ g_object_set_data(G_OBJECT(item), BALSA_TOOLBAR_MODEL_TYPE, GINT_TO_POINTER(info->model->type)); } gtk_widget_show_all(menu); #if GTK_CHECK_VERSION(3, 22, 0) gtk_menu_attach_to_widget(GTK_MENU(menu), toolbar, NULL); if (event) gtk_menu_popup_at_pointer(GTK_MENU(menu), (GdkEvent *) event); else gtk_menu_popup_at_widget(GTK_MENU(menu), GTK_WIDGET(toolbar), GDK_GRAVITY_CENTER, GDK_GRAVITY_CENTER, NULL); #else /*GTK_CHECK_VERSION(3, 22, 0) */ if (event) { button = event->button; event_time = event->time; } else { button = 0; event_time = gtk_get_current_event_time(); } gtk_menu_attach_to_widget(GTK_MENU(menu), toolbar, NULL); if (button) gtk_menu_popup(GTK_MENU(menu), NULL, NULL, NULL, NULL, button, event_time); else gtk_menu_popup(GTK_MENU(menu), NULL, NULL, tm_popup_position_func, toolbar, button, event_time); #endif /*GTK_CHECK_VERSION(3, 22, 0) */ return TRUE; }