static void gimp_widget_accel_changed (GtkAccelGroup *accel_group, guint unused1, GdkModifierType unused2, GClosure *accel_closure, GtkWidget *widget) { GClosure *widget_closure; widget_closure = g_object_get_data (G_OBJECT (widget), "gimp-accel-closure"); if (accel_closure == widget_closure) { GtkAction *action; GtkAccelKey *accel_key; const gchar *tooltip; const gchar *help_id; action = g_object_get_data (G_OBJECT (widget), "gimp-accel-action"); tooltip = gtk_action_get_tooltip (action); help_id = g_object_get_qdata (G_OBJECT (action), GIMP_HELP_ID); accel_key = gtk_accel_group_find (accel_group, gimp_widget_accel_find_func, accel_closure); if (accel_key && accel_key->accel_key && accel_key->accel_flags & GTK_ACCEL_VISIBLE) { gchar *escaped = g_markup_escape_text (tooltip, -1); gchar *accel = gtk_accelerator_get_label (accel_key->accel_key, accel_key->accel_mods); gchar *tmp = g_strdup_printf ("%s <b>%s</b>", escaped, accel); g_free (accel); g_free (escaped); gimp_help_set_help_data_with_markup (widget, tmp, help_id); g_free (tmp); } else { gimp_help_set_help_data (widget, tooltip, help_id); } } }
GtkWidget * gimp_editor_add_action_button (GimpEditor *editor, const gchar *group_name, const gchar *action_name, ...) { GimpActionGroup *group; GtkAction *action; GtkWidget *button; GtkWidget *old_child; GtkWidget *image; GtkIconSize button_icon_size; GtkReliefStyle button_relief; const gchar *stock_id; gchar *tooltip; const gchar *help_id; GList *extended = NULL; va_list args; g_return_val_if_fail (GIMP_IS_EDITOR (editor), NULL); g_return_val_if_fail (action_name != NULL, NULL); g_return_val_if_fail (editor->ui_manager != NULL, NULL); group = gimp_ui_manager_get_action_group (editor->ui_manager, group_name); g_return_val_if_fail (group != NULL, NULL); action = gtk_action_group_get_action (GTK_ACTION_GROUP (group), action_name); g_return_val_if_fail (action != NULL, NULL); button_icon_size = gimp_editor_ensure_button_box (editor, &button_relief); if (GTK_IS_TOGGLE_ACTION (action)) button = gtk_toggle_button_new (); else button = gimp_button_new (); gtk_button_set_relief (GTK_BUTTON (button), button_relief); stock_id = gtk_action_get_stock_id (action); tooltip = g_strdup (gtk_action_get_tooltip (action)); old_child = gtk_bin_get_child (GTK_BIN (button)); if (old_child) gtk_container_remove (GTK_CONTAINER (button), old_child); image = gtk_image_new_from_stock (stock_id, button_icon_size); gtk_container_add (GTK_CONTAINER (button), image); gtk_widget_show (image); gtk_activatable_set_related_action (GTK_ACTIVATABLE (button), action); gtk_box_pack_start (GTK_BOX (editor->button_box), button, TRUE, TRUE, 0); gtk_widget_show (button); va_start (args, action_name); action_name = va_arg (args, const gchar *); while (action_name) { GdkModifierType mod_mask; mod_mask = va_arg (args, GdkModifierType); action = gtk_action_group_get_action (GTK_ACTION_GROUP (group), action_name); if (action && mod_mask) { ExtendedAction *ext = g_slice_new (ExtendedAction); ext->mod_mask = mod_mask; ext->action = action; extended = g_list_prepend (extended, ext); if (tooltip) { const gchar *ext_tooltip = gtk_action_get_tooltip (action); if (ext_tooltip) { gchar *tmp = g_strconcat (tooltip, "\n<b>", gimp_get_mod_string (mod_mask), "</b> ", ext_tooltip, NULL); g_free (tooltip); tooltip = tmp; } } } action_name = va_arg (args, const gchar *); } va_end (args); if (extended) { g_object_set_data_full (G_OBJECT (button), "extended-actions", extended, (GDestroyNotify) gimp_editor_button_extended_actions_free); g_signal_connect (button, "extended-clicked", G_CALLBACK (gimp_editor_button_extended_clicked), NULL); } help_id = g_object_get_qdata (G_OBJECT (action), GIMP_HELP_ID); if (tooltip || help_id) gimp_help_set_help_data_with_markup (button, tooltip, help_id); g_free (tooltip); return button; }