#include <config.h>
-#include "gtkalias.h"
#include "gtkaction.h"
#include "gtkactiongroup.h"
#include "gtkaccellabel.h"
#include "gtktearoffmenuitem.h"
#include "gtktoolbutton.h"
#include "gtktoolbar.h"
+#include "gtkprivate.h"
+#include "gtkalias.h"
#define GTK_ACTION_GET_PRIVATE(obj) (G_TYPE_INSTANCE_GET_PRIVATE ((obj), GTK_TYPE_ACTION, GtkActionPrivate))
static void gtk_action_class_init (GtkActionClass *class);
static GQuark accel_path_id = 0;
-static const gchar *accel_path_key = "GtkAction::accel_path";
+static const gchar accel_path_key[] = "GtkAction::accel_path";
GType
gtk_action_get_type (void)
};
type = g_type_register_static (G_TYPE_OBJECT,
- "GtkAction",
+ I_("GtkAction"),
&type_info, 0);
}
return type;
P_("Name"),
P_("A unique name for the action."),
NULL,
- G_PARAM_READWRITE |
+ GTK_PARAM_READWRITE |
G_PARAM_CONSTRUCT_ONLY));
g_object_class_install_property (gobject_class,
PROP_LABEL,
P_("The label used for menu items and buttons "
"that activate this action."),
NULL,
- G_PARAM_READWRITE));
+ GTK_PARAM_READWRITE));
g_object_class_install_property (gobject_class,
PROP_SHORT_LABEL,
- g_param_spec_string ("short_label",
+ g_param_spec_string ("short-label",
P_("Short label"),
P_("A shorter label that may be used on toolbar buttons."),
NULL,
- G_PARAM_READWRITE));
+ GTK_PARAM_READWRITE));
g_object_class_install_property (gobject_class,
PROP_TOOLTIP,
g_param_spec_string ("tooltip",
P_("Tooltip"),
P_("A tooltip for this action."),
NULL,
- G_PARAM_READWRITE));
+ GTK_PARAM_READWRITE));
g_object_class_install_property (gobject_class,
PROP_STOCK_ID,
- g_param_spec_string ("stock_id",
+ g_param_spec_string ("stock-id",
P_("Stock Icon"),
P_("The stock icon displayed in widgets representing "
"this action."),
NULL,
- G_PARAM_READWRITE));
+ GTK_PARAM_READWRITE));
g_object_class_install_property (gobject_class,
PROP_VISIBLE_HORIZONTAL,
- g_param_spec_boolean ("visible_horizontal",
+ g_param_spec_boolean ("visible-horizontal",
P_("Visible when horizontal"),
P_("Whether the toolbar item is visible when the toolbar "
"is in a horizontal orientation."),
TRUE,
- G_PARAM_READWRITE));
+ GTK_PARAM_READWRITE));
/**
* GtkAction:visible-overflown:
*
*/
g_object_class_install_property (gobject_class,
PROP_VISIBLE_OVERFLOWN,
- g_param_spec_boolean ("visible_overflown",
+ g_param_spec_boolean ("visible-overflown",
P_("Visible when overflown"),
P_("When TRUE, toolitem proxies for this action "
"are represented in the toolbar overflow menu."),
TRUE,
- G_PARAM_READWRITE));
+ GTK_PARAM_READWRITE));
g_object_class_install_property (gobject_class,
PROP_VISIBLE_VERTICAL,
- g_param_spec_boolean ("visible_vertical",
+ g_param_spec_boolean ("visible-vertical",
P_("Visible when vertical"),
P_("Whether the toolbar item is visible when the toolbar "
"is in a vertical orientation."),
TRUE,
- G_PARAM_READWRITE));
+ GTK_PARAM_READWRITE));
g_object_class_install_property (gobject_class,
PROP_IS_IMPORTANT,
- g_param_spec_boolean ("is_important",
+ g_param_spec_boolean ("is-important",
P_("Is important"),
P_("Whether the action is considered important. "
"When TRUE, toolitem proxies for this action "
"show text in GTK_TOOLBAR_BOTH_HORIZ mode."),
FALSE,
- G_PARAM_READWRITE));
+ GTK_PARAM_READWRITE));
g_object_class_install_property (gobject_class,
PROP_HIDE_IF_EMPTY,
- g_param_spec_boolean ("hide_if_empty",
+ g_param_spec_boolean ("hide-if-empty",
P_("Hide if empty"),
P_("When TRUE, empty menu proxies for this action are hidden."),
TRUE,
- G_PARAM_READWRITE));
+ GTK_PARAM_READWRITE));
g_object_class_install_property (gobject_class,
PROP_SENSITIVE,
g_param_spec_boolean ("sensitive",
P_("Sensitive"),
P_("Whether the action is enabled."),
TRUE,
- G_PARAM_READWRITE));
+ GTK_PARAM_READWRITE));
g_object_class_install_property (gobject_class,
PROP_VISIBLE,
g_param_spec_boolean ("visible",
P_("Visible"),
P_("Whether the action is visible."),
TRUE,
- G_PARAM_READWRITE));
+ GTK_PARAM_READWRITE));
g_object_class_install_property (gobject_class,
PROP_ACTION_GROUP,
- g_param_spec_object ("action_group",
+ g_param_spec_object ("action-group",
P_("Action Group"),
P_("The GtkActionGroup this GtkAction is associated with, or NULL (for internal use)."),
GTK_TYPE_ACTION_GROUP,
- G_PARAM_READWRITE));
+ GTK_PARAM_READWRITE));
/**
* GtkAction::activate:
* Since: 2.4
*/
action_signals[ACTIVATE] =
- g_signal_new ("activate",
+ g_signal_new (I_("activate"),
G_OBJECT_CLASS_TYPE (klass),
G_SIGNAL_RUN_FIRST | G_SIGNAL_NO_RECURSE,
G_STRUCT_OFFSET (GtkActionClass, activate), NULL, NULL,
* Creates a new #GtkAction object. To add the action to a
* #GtkActionGroup and set the accelerator for the action,
* call gtk_action_group_add_action_with_accel().
+ * See <xref linkend="XML-UI"/> for information on allowed action
+ * names.
*
* Return value: a new #GtkAction
*
tmp = action->private_data->short_label;
action->private_data->short_label = g_strdup (action->private_data->label);
g_free (tmp);
- g_object_notify (object, "short_label");
+ g_object_notify (object, "short-label");
}
break;
case PROP_SHORT_LABEL:
tmp = action->private_data->short_label;
action->private_data->short_label = g_strdup (action->private_data->label);
g_free (tmp);
- g_object_notify (object, "short_label");
+ g_object_notify (object, "short-label");
}
break;
case PROP_VISIBLE_HORIZONTAL:
visible = gtk_action_is_visible (action);
hide_if_empty = action->private_data->hide_if_empty;
- g_object_set (G_OBJECT (proxy),
- "visible", visible && !(empty && hide_if_empty),
- NULL);
+ if (visible && !(empty && hide_if_empty))
+ gtk_widget_show (proxy);
+ else
+ gtk_widget_hide (proxy);
}
gboolean _gtk_menu_is_empty (GtkWidget *menu);
GValue value = { 0, };
g_value_init (&value, G_TYPE_STRING);
- g_object_get_property (G_OBJECT (action), "short_label", &value);
+ g_object_get_property (G_OBJECT (action), "short-label", &value);
g_object_set_property (G_OBJECT (proxy), "label", &value);
g_value_unset (&value);
}
}
+static void
+gtk_action_sync_button_stock_id (GtkAction *action,
+ GParamSpec *pspec,
+ GtkWidget *proxy)
+{
+ g_object_set (G_OBJECT (proxy),
+ "stock-id",
+ action->private_data->stock_id,
+ NULL);
+}
+
static void
gtk_action_sync_tooltip (GtkAction *action,
GParamSpec *pspec,
connect_proxy (GtkAction *action,
GtkWidget *proxy)
{
- GtkActionGroup *group = action->private_data->action_group;
-
g_object_ref (action);
- g_object_set_data_full (G_OBJECT (proxy), "gtk-action", action,
+ g_object_set_data_full (G_OBJECT (proxy), I_("gtk-action"), action,
g_object_unref);
/* add this widget to the list of proxies */
NULL);
if (GTK_IS_ACCEL_LABEL (label) && action->private_data->accel_quark)
- g_object_set (G_OBJECT (label),
+ g_object_set (label,
"accel_closure", action->private_data->accel_closure,
NULL);
}
if (gtk_menu_item_get_submenu (GTK_MENU_ITEM (proxy)) == NULL)
- g_signal_connect_object (proxy, "activate",
- G_CALLBACK (gtk_action_activate), action,
- G_CONNECT_SWAPPED);
+ g_signal_connect_object (proxy, "activate",
+ G_CALLBACK (gtk_action_activate), action,
+ G_CONNECT_SWAPPED);
}
else if (GTK_IS_TOOL_ITEM (proxy))
{
+ GParamSpec *pspec;
+
/* toolbar item specific synchronisers ... */
- g_object_set (G_OBJECT (proxy),
+ g_object_set (proxy,
"visible_horizontal", action->private_data->visible_horizontal,
"visible_vertical", action->private_data->visible_vertical,
"is_important", action->private_data->is_important,
NULL);
- /* FIXME: we should set the tooltip here, but the current api
- * doesn't allow it before the item is added to a toolbar.
- */
+
+ pspec = g_object_class_find_property (G_OBJECT_GET_CLASS (action),
+ "tooltip");
+ gtk_action_sync_tooltip (action, pspec, proxy);
+
g_signal_connect_object (action, "notify::visible-horizontal",
G_CALLBACK (gtk_action_sync_property),
proxy, 0);
G_CALLBACK (gtk_action_create_menu_proxy),
action, 0);
+ gtk_tool_item_rebuild_menu (GTK_TOOL_ITEM (proxy));
+
/* toolbar button specific synchronisers ... */
if (GTK_IS_TOOL_BUTTON (proxy))
{
- g_object_set (G_OBJECT (proxy),
+ g_object_set (proxy,
"label", action->private_data->short_label,
"use_underline", TRUE,
"stock_id", action->private_data->stock_id,
NULL);
- /* FIXME: we should set the tooltip here, but the current api
- * doesn't allow it before the item is added to a toolbar.
- */
+
g_signal_connect_object (action, "notify::short-label",
G_CALLBACK (gtk_action_sync_short_label),
proxy, 0);
g_signal_connect_object (action, "notify::stock-id",
G_CALLBACK (gtk_action_sync_property),
proxy, 0);
- g_signal_connect_object (proxy, "clicked",
- G_CALLBACK (gtk_action_activate), action,
- G_CONNECT_SWAPPED);
- }
+ g_signal_connect_object (proxy, "clicked",
+ G_CALLBACK (gtk_action_activate), action,
+ G_CONNECT_SWAPPED);
+ }
}
else if (GTK_IS_BUTTON (proxy))
{
/* button specific synchronisers ... */
-
- /* synchronise the label */
- g_object_set (G_OBJECT (proxy),
- "label", action->private_data->short_label,
- "use_underline", TRUE,
- NULL);
- g_signal_connect_object (action, "notify::short-label",
- G_CALLBACK (gtk_action_sync_short_label),
- proxy, 0);
+ if (gtk_button_get_use_stock (GTK_BUTTON (proxy)))
+ {
+ /* synchronise stock-id */
+ g_object_set (proxy,
+ "stock-id", action->private_data->stock_id,
+ NULL);
+ g_signal_connect_object (action, "notify::stock-id",
+ G_CALLBACK (gtk_action_sync_button_stock_id),
+ proxy, 0);
+ }
+ else if (GTK_BIN (proxy)->child == NULL ||
+ GTK_IS_LABEL (GTK_BIN (proxy)->child))
+ {
+ /* synchronise the label */
+ g_object_set (proxy,
+ "label", action->private_data->short_label,
+ "use_underline", TRUE,
+ NULL);
+ g_signal_connect_object (action, "notify::short-label",
+ G_CALLBACK (gtk_action_sync_short_label),
+ proxy, 0);
+
+ }
+ /* we leave the button alone if there is a custom child */
g_signal_connect_object (proxy, "clicked",
G_CALLBACK (gtk_action_activate), action,
G_CONNECT_SWAPPED);
}
- _gtk_action_group_emit_connect_proxy (group, action, proxy);
+ if (action->private_data->action_group)
+ _gtk_action_group_emit_connect_proxy (action->private_data->action_group, action, proxy);
}
static void
disconnect_proxy (GtkAction *action,
GtkWidget *proxy)
{
- GtkActionGroup *group = action->private_data->action_group;
-
- g_object_set_data (G_OBJECT (proxy), "gtk-action", NULL);
+ g_object_set_data (G_OBJECT (proxy), I_("gtk-action"), NULL);
/* remove proxy from list of proxies */
g_signal_handlers_disconnect_by_func (proxy,
action);
/* disconnect handlers for notify::* signals */
- g_signal_handlers_disconnect_by_func (proxy,
+ g_signal_handlers_disconnect_by_func (action,
G_CALLBACK (gtk_action_sync_sensitivity),
- action);
- g_signal_handlers_disconnect_by_func (proxy,
+ proxy);
+ g_signal_handlers_disconnect_by_func (action,
+ G_CALLBACK (gtk_action_sync_visible),
+ proxy);
+ g_signal_handlers_disconnect_by_func (action,
G_CALLBACK (gtk_action_sync_property),
- action);
+ proxy);
g_signal_handlers_disconnect_by_func (action,
G_CALLBACK (gtk_action_sync_stock_id), proxy);
G_CALLBACK (gtk_action_create_menu_proxy),
action);
- _gtk_action_group_emit_disconnect_proxy (group, action, proxy);
+ if (action->private_data->action_group)
+ _gtk_action_group_emit_disconnect_proxy (action->private_data->action_group, action, proxy);
}
void
*
* Since: 2.4
**/
-const gchar *
+G_CONST_RETURN gchar *
gtk_action_get_name (GtkAction *action)
{
g_return_val_if_fail (GTK_IS_ACTION (action), NULL);
gpointer marshal_data)
{
if (gtk_action_is_sensitive (GTK_ACTION (closure->data)))
- _gtk_action_emit_activate (GTK_ACTION (closure->data));
-
- /* we handled the accelerator */
- g_value_set_boolean (return_value, TRUE);
+ {
+ _gtk_action_emit_activate (GTK_ACTION (closure->data));
+
+ /* we handled the accelerator */
+ g_value_set_boolean (return_value, TRUE);
+ }
}
static void
action->private_data->accel_quark = g_quark_from_string (accel_path);
}
+/**
+ * gtk_action_get_accel_path:
+ * @action: the action object
+ *
+ * Returns the accel path for this action.
+ *
+ * Since: 2.6
+ *
+ * Returns: the accel path for this action, or %NULL
+ * if none is set. The returned string is owned by GTK+
+ * and must not be freed or modified.
+ */
+G_CONST_RETURN gchar *
+gtk_action_get_accel_path (GtkAction *action)
+{
+ g_return_val_if_fail (GTK_IS_ACTION (action), NULL);
+
+ if (action->private_data->accel_quark)
+ return g_quark_to_string (action->private_data->accel_quark);
+ else
+ return NULL;
+}
+
+/**
+ * gtk_action_get_accel_closure:
+ * @action: the action object
+ *
+ * Returns the accel closure for this action.
+ *
+ * Since: 2.8
+ *
+ * Returns: the accel closure for this action. The returned closure is
+ * owned by GTK+ and must not be unreffed or modified.
+ */
+GClosure *
+gtk_action_get_accel_closure (GtkAction *action)
+{
+ g_return_val_if_fail (GTK_IS_ACTION (action), NULL);
+
+ return action->private_data->accel_closure;
+}
+
+
/**
* gtk_action_set_accel_group:
* @action: the action object
gtk_accel_group_disconnect (action->private_data->accel_group,
action->private_data->accel_closure);
}
+
+#define __GTK_ACTION_C__
+#include "gtkaliasdef.c"