]> Pileus Git - ~andy/gtk/blobdiff - gtk/gtkaction.c
Change FSF Address
[~andy/gtk] / gtk / gtkaction.c
index 59c52d35523361877e646062bba0441186d18f5b..fe5336228dbd152eed03eabb2637e324850bd1c8 100644 (file)
@@ -14,9 +14,7 @@
  * Library General Public License for more details.
  *
  * You should have received a copy of the GNU Library General Public
- * License along with the Gnome Library; see the file COPYING.LIB.  If not,
- * write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- * Boston, MA 02111-1307, USA.
+ * License along with this library. If not, see <http://www.gnu.org/licenses/>.
  */
 
 /*
  * GTK+ at ftp://ftp.gtk.org/pub/gtk/. 
  */
 
+/**
+ * SECTION:gtkaction
+ * @Short_description: An action which can be triggered by a menu or toolbar item
+ * @Title: GtkAction
+ * @See_also: #GtkActionGroup, #GtkUIManager, #GtkActivatable
+ *
+ * Actions represent operations that the user can be perform, along with
+ * some information how it should be presented in the interface. Each action
+ * provides methods to create icons, menu items and toolbar items
+ * representing itself.
+ *
+ * As well as the callback that is called when the action gets activated,
+ * the following also gets associated with the action:
+ * <itemizedlist>
+ *   <listitem><para>a name (not translated, for path lookup)</para></listitem>
+ *   <listitem><para>a label (translated, for display)</para></listitem>
+ *   <listitem><para>an accelerator</para></listitem>
+ *   <listitem><para>whether label indicates a stock id</para></listitem>
+ *   <listitem><para>a tooltip (optional, translated)</para></listitem>
+ *   <listitem><para>a toolbar label (optional, shorter than label)</para></listitem>
+ * </itemizedlist>
+ * The action will also have some state information:
+ * <itemizedlist>
+ *   <listitem><para>visible (shown/hidden)</para></listitem>
+ *   <listitem><para>sensitive (enabled/disabled)</para></listitem>
+ * </itemizedlist>
+ * Apart from regular actions, there are <link linkend="GtkToggleAction">toggle
+ * actions</link>, which can be toggled between two states and <link
+ * linkend="GtkRadioAction">radio actions</link>, of which only one in a group
+ * can be in the "active" state. Other actions can be implemented as #GtkAction
+ * subclasses.
+ *
+ * Each action can have one or more proxy widgets. To act as an action proxy,
+ * widget needs to implement #GtkActivatable interface. Proxies mirror the state
+ * of the action and should change when the action's state changes. Properties
+ * that are always mirrored by proxies are #GtkAction:sensitive and
+ * #GtkAction:visible. #GtkAction:gicon, #GtkAction:icon-name, #GtkAction:label,
+ * #GtkAction:short-label and #GtkAction:stock-id properties are only mirorred
+ * if proxy widget has #GtkActivatable:use-action-appearance property set to
+ * %TRUE.
+ *
+ * When the proxy is activated, it should activate its action.
+ */
+
 #include "config.h"
 
 #include "gtkaction.h"
 #include "gtkmarshalers.h"
 #include "gtkmenuitem.h"
 #include "gtkstock.h"
-#include "gtktearoffmenuitem.h"
+#include "deprecated/gtktearoffmenuitem.h"
 #include "gtktoolbutton.h"
 #include "gtktoolbar.h"
 #include "gtkprivate.h"
 #include "gtkbuildable.h"
-#include "gtkalias.h"
-
+#include "gtkactivatable.h"
 
-#define GTK_ACTION_GET_PRIVATE(obj) (G_TYPE_INSTANCE_GET_PRIVATE ((obj), GTK_TYPE_ACTION, GtkActionPrivate))
 
 struct _GtkActionPrivate 
 {
@@ -71,6 +111,9 @@ struct _GtkActionPrivate
   guint is_important       : 1;
   guint hide_if_empty      : 1;
   guint visible_overflown  : 1;
+  guint always_show_image  : 1;
+  guint recursion_guard    : 1;
+  guint activate_blocked   : 1;
 
   /* accelerator */
   guint          accel_count;
@@ -107,7 +150,8 @@ enum
   PROP_HIDE_IF_EMPTY,
   PROP_SENSITIVE,
   PROP_VISIBLE,
-  PROP_ACTION_GROUP
+  PROP_ACTION_GROUP,
+  PROP_ALWAYS_SHOW_IMAGE
 };
 
 /* GtkBuildable */
@@ -120,10 +164,6 @@ G_DEFINE_TYPE_WITH_CODE (GtkAction, gtk_action, G_TYPE_OBJECT,
                         G_IMPLEMENT_INTERFACE (GTK_TYPE_BUILDABLE,
                                                gtk_action_buildable_init))
 
-
-static GQuark      quark_gtk_action_proxy  = 0;
-static const gchar gtk_action_proxy_key[] = "gtk-action";
-
 static void gtk_action_finalize     (GObject *object);
 static void gtk_action_set_property (GObject         *object,
                                     guint            prop_id,
@@ -135,8 +175,6 @@ static void gtk_action_get_property (GObject         *object,
                                     GParamSpec      *pspec);
 static void gtk_action_set_action_group (GtkAction     *action,
                                         GtkActionGroup *action_group);
-static void gtk_action_sync_tooltip     (GtkAction      *action,
-                                        GtkWidget      *proxy);
 
 static GtkWidget *create_menu_item    (GtkAction *action);
 static GtkWidget *create_tool_item    (GtkAction *action);
@@ -144,7 +182,7 @@ static void       connect_proxy       (GtkAction *action,
                                       GtkWidget *proxy);
 static void       disconnect_proxy    (GtkAction *action,
                                       GtkWidget *proxy);
-
 static void       closure_accel_activate (GClosure     *closure,
                                          GValue       *return_value,
                                          guint         n_param_values,
@@ -160,8 +198,6 @@ gtk_action_class_init (GtkActionClass *klass)
 {
   GObjectClass *gobject_class;
 
-  quark_gtk_action_proxy = g_quark_from_static_string (gtk_action_proxy_key);
-
   gobject_class = G_OBJECT_CLASS (klass);
 
   gobject_class->finalize     = gtk_action_finalize;
@@ -170,14 +206,13 @@ gtk_action_class_init (GtkActionClass *klass)
 
   klass->activate = NULL;
 
-  klass->create_menu_item = create_menu_item;
-  klass->create_tool_item = create_tool_item;
-  klass->create_menu = NULL;
-  klass->connect_proxy = connect_proxy;
-  klass->disconnect_proxy = disconnect_proxy;
-
-  klass->menu_item_type = GTK_TYPE_IMAGE_MENU_ITEM;
+  klass->create_menu_item  = create_menu_item;
+  klass->create_tool_item  = create_tool_item;
+  klass->create_menu       = NULL;
+  klass->menu_item_type    = GTK_TYPE_IMAGE_MENU_ITEM;
   klass->toolbar_item_type = GTK_TYPE_TOOL_BUTTON;
+  klass->connect_proxy    = connect_proxy;
+  klass->disconnect_proxy = disconnect_proxy;
 
   g_object_class_install_property (gobject_class,
                                   PROP_NAME,
@@ -194,6 +229,9 @@ gtk_action_class_init (GtkActionClass *klass)
    * The label used for menu items and buttons that activate
    * this action. If the label is %NULL, GTK+ uses the stock 
    * label specified via the stock-id property.
+   *
+   * This is an appearance property and thus only applies if 
+   * #GtkActivatable:use-action-appearance is %TRUE.
    */
   g_object_class_install_property (gobject_class,
                                   PROP_LABEL,
@@ -208,6 +246,9 @@ gtk_action_class_init (GtkActionClass *klass)
    * GtkAction:short-label:
    *
    * A shorter label that may be used on toolbar buttons.
+   *
+   * This is an appearance property and thus only applies if 
+   * #GtkActivatable:use-action-appearance is %TRUE.
    */
   g_object_class_install_property (gobject_class,
                                   PROP_SHORT_LABEL,
@@ -230,6 +271,9 @@ gtk_action_class_init (GtkActionClass *klass)
    * GtkAction:stock-id:
    *
    * The stock icon displayed in widgets representing this action.
+   *
+   * This is an appearance property and thus only applies if 
+   * #GtkActivatable:use-action-appearance is %TRUE.
    */
   g_object_class_install_property (gobject_class,
                                   PROP_STOCK_ID,
@@ -247,6 +291,9 @@ gtk_action_class_init (GtkActionClass *klass)
    * Note that the stock icon is preferred, if the #GtkAction:stock-id 
    * property holds the id of an existing stock icon.
    *
+   * This is an appearance property and thus only applies if 
+   * #GtkActivatable:use-action-appearance is %TRUE.
+   *
    * Since: 2.16
    */
   g_object_class_install_property (gobject_class,
@@ -265,6 +312,9 @@ gtk_action_class_init (GtkActionClass *klass)
    * property holds the id of an existing stock icon, and the #GIcon is
    * preferred if the #GtkAction:gicon property is set. 
    *
+   * This is an appearance property and thus only applies if 
+   * #GtkActivatable:use-action-appearance is %TRUE.
+   *
    * Since: 2.10
    */
   g_object_class_install_property (gobject_class,
@@ -345,6 +395,25 @@ gtk_action_class_init (GtkActionClass *klass)
                                                         GTK_TYPE_ACTION_GROUP,
                                                         GTK_PARAM_READWRITE));
 
+  /**
+   * GtkAction:always-show-image:
+   *
+   * If %TRUE, the action's menu item proxies will ignore the #GtkSettings:gtk-menu-images 
+   * setting and always show their image, if available.
+   *
+   * Use this property if the menu item would be useless or hard to use
+   * without their image. 
+   *
+   * Since: 2.20
+   **/
+  g_object_class_install_property (gobject_class,
+                                   PROP_ALWAYS_SHOW_IMAGE,
+                                   g_param_spec_boolean ("always-show-image",
+                                                         P_("Always show image"),
+                                                         P_("Whether the image will always be shown"),
+                                                         FALSE,
+                                                         GTK_PARAM_READWRITE | G_PARAM_CONSTRUCT));
+
   /**
    * GtkAction::activate:
    * @action: the #GtkAction
@@ -368,7 +437,9 @@ gtk_action_class_init (GtkActionClass *klass)
 static void
 gtk_action_init (GtkAction *action)
 {
-  action->private_data = GTK_ACTION_GET_PRIVATE (action);
+  action->private_data = G_TYPE_INSTANCE_GET_PRIVATE (action,
+                                                      GTK_TYPE_ACTION,
+                                                      GtkActionPrivate);
 
   action->private_data->name = NULL;
   action->private_data->label = NULL;
@@ -381,6 +452,8 @@ gtk_action_init (GtkAction *action)
   action->private_data->visible_overflown  = TRUE;
   action->private_data->is_important = FALSE;
   action->private_data->hide_if_empty = TRUE;
+  action->private_data->always_show_image = FALSE;
+  action->private_data->activate_blocked = FALSE;
 
   action->private_data->sensitive = TRUE;
   action->private_data->visible = TRUE;
@@ -431,10 +504,11 @@ gtk_action_buildable_get_name (GtkBuildable *buildable)
 /**
  * gtk_action_new:
  * @name: A unique name for the action
- * @label: the label displayed in menu items and on buttons, or %NULL
- * @tooltip: a tooltip for the action, or %NULL
- * @stock_id: the stock icon to display in widgets representing the
- *   action, or %NULL
+ * @label: (allow-none): the label displayed in menu items and on buttons,
+ *         or %NULL
+ * @tooltip: (allow-none): a tooltip for the action, or %NULL
+ * @stock_id: (allow-none): the stock icon to display in widgets representing
+ *            the action, or %NULL
  *
  * Creates a new #GtkAction object. To add the action to a
  * #GtkActionGroup and set the accelerator for the action,
@@ -541,6 +615,9 @@ gtk_action_set_property (GObject         *object,
     case PROP_ACTION_GROUP:
       gtk_action_set_action_group (action, g_value_get_object (value));
       break;
+    case PROP_ALWAYS_SHOW_IMAGE:
+      gtk_action_set_always_show_image (action, g_value_get_boolean (value));
+      break;
     default:
       G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
       break;
@@ -604,6 +681,9 @@ gtk_action_get_property (GObject    *object,
     case PROP_ACTION_GROUP:
       g_value_set_object (value, action->private_data->action_group);
       break;
+    case PROP_ALWAYS_SHOW_IMAGE:
+      g_value_set_boolean (value, action->private_data->always_show_image);
+      break;
     default:
       G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
       break;
@@ -634,15 +714,36 @@ static void
 remove_proxy (GtkAction *action,
              GtkWidget *proxy)
 {
-  if (GTK_IS_MENU_ITEM (proxy))
-    gtk_action_disconnect_accelerator (action);
-  
+  g_object_unref (proxy);
   action->private_data->proxies = g_slist_remove (action->private_data->proxies, proxy);
 }
 
+static void
+connect_proxy (GtkAction *action,
+              GtkWidget *proxy)
+{
+  action->private_data->proxies = g_slist_prepend (action->private_data->proxies, proxy);
+
+  g_object_ref_sink (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)
+{
+  remove_proxy (action, proxy);
+
+  if (action->private_data->action_group)
+    _gtk_action_group_emit_disconnect_proxy (action->private_data->action_group, action, proxy);
+}
+
 /**
  * _gtk_action_sync_menu_visible:
- * @action: a #GtkAction, or %NULL to determine the action from @proxy
+ * @action: (allow-none): a #GtkAction, or %NULL to determine the action from @proxy
  * @proxy: a proxy menu item
  * @empty: whether the submenu attached to @proxy is empty
  * 
@@ -670,7 +771,7 @@ _gtk_action_sync_menu_visible (GtkAction *action,
   g_return_if_fail (action == NULL || GTK_IS_ACTION (action));
 
   if (action == NULL)
-    action = g_object_get_qdata (G_OBJECT (proxy), quark_gtk_action_proxy);
+    action = gtk_activatable_get_related_action (GTK_ACTIVATABLE (proxy));
 
   if (action)
     {
@@ -685,257 +786,6 @@ _gtk_action_sync_menu_visible (GtkAction *action,
     gtk_widget_hide (proxy);
 }
 
-gboolean _gtk_menu_is_empty (GtkWidget *menu);
-
-static gboolean
-gtk_action_create_menu_proxy (GtkToolItem *tool_item, 
-                             GtkAction   *action)
-{
-  GtkWidget *menu_item;
-  
-  if (action->private_data->visible_overflown)
-    {
-      menu_item = gtk_action_create_menu_item (action);
-
-      g_object_ref_sink (menu_item);
-      
-      gtk_tool_item_set_proxy_menu_item (tool_item, 
-                                        "gtk-action-menu-item", menu_item);
-      g_object_unref (menu_item);
-    }
-  else
-    gtk_tool_item_set_proxy_menu_item (tool_item, 
-                                      "gtk-action-menu-item", NULL);
-
-  return TRUE;
-}
-
-static void
-connect_proxy (GtkAction     *action, 
-              GtkWidget     *proxy)
-{
-  g_object_ref (action);
-  g_object_set_qdata_full (G_OBJECT (proxy), quark_gtk_action_proxy, action,
-                          g_object_unref);
-
-  /* add this widget to the list of proxies */
-  action->private_data->proxies = g_slist_prepend (action->private_data->proxies, proxy);
-  g_object_weak_ref (G_OBJECT (proxy), (GWeakNotify)remove_proxy, action);
-  
-  gtk_widget_set_sensitive (proxy, gtk_action_is_sensitive (action));
-  if (gtk_action_is_visible (action))
-    gtk_widget_show (proxy);
-  else
-    gtk_widget_hide (proxy);
-  gtk_widget_set_no_show_all (proxy, TRUE);
-
-  if (GTK_IS_MENU_ITEM (proxy))
-    {
-      GtkWidget *label;
-      /* menu item specific synchronisers ... */
-      
-      if (action->private_data->accel_quark)
-       {
-         gtk_action_connect_accelerator (action);
-         gtk_menu_item_set_accel_path (GTK_MENU_ITEM (proxy),
-                                       g_quark_to_string (action->private_data->accel_quark));
-       }
-      
-      label = GTK_BIN (proxy)->child;
-
-      /* make sure label is a label */
-      if (label && !GTK_IS_LABEL (label))
-       {
-         gtk_container_remove (GTK_CONTAINER (proxy), label);
-         label = NULL;
-       }
-
-      if (!label)
-       label = g_object_new (GTK_TYPE_ACCEL_LABEL,
-                             "use-underline", TRUE,
-                             "xalign", 0.0,
-                             "visible", TRUE,
-                             "parent", proxy,
-                             NULL);
-      
-      if (GTK_IS_ACCEL_LABEL (label) && action->private_data->accel_quark)
-       g_object_set (label,
-                     "accel-closure", action->private_data->accel_closure,
-                     NULL);
-
-      gtk_label_set_label (GTK_LABEL (label), action->private_data->label);
-
-      if (GTK_IS_IMAGE_MENU_ITEM (proxy))
-       {
-         GtkWidget *image;
-
-         image = gtk_image_menu_item_get_image (GTK_IMAGE_MENU_ITEM (proxy));
-         if (image && !GTK_IS_IMAGE (image))
-           {
-             gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (proxy), NULL);
-             image = NULL;
-           }
-         if (!image)
-           {
-             image = gtk_image_new ();
-             gtk_widget_show (image);
-             gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (proxy),
-                                            image);
-           }
-         
-         if (action->private_data->stock_id &&
-             gtk_icon_factory_lookup_default (action->private_data->stock_id))
-           gtk_image_set_from_stock (GTK_IMAGE (image),
-                                     action->private_data->stock_id, GTK_ICON_SIZE_MENU);
-         else if (action->private_data->gicon)
-           gtk_image_set_from_gicon (GTK_IMAGE (image),
-                                     action->private_data->gicon, GTK_ICON_SIZE_MENU);
-         else if (action->private_data->icon_name)
-           gtk_image_set_from_icon_name (GTK_IMAGE (image),
-                                         action->private_data->icon_name, GTK_ICON_SIZE_MENU);
-          else
-            gtk_image_clear (GTK_IMAGE (image));
-       }
-      
-      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);
-
-    }
-  else if (GTK_IS_TOOL_ITEM (proxy))
-    {
-      /* toolbar button specific synchronisers ... */
-      if (GTK_IS_TOOL_BUTTON (proxy))
-       {
-          GtkWidget *image;
-          GtkIconSize icon_size;
-
-         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,
-                       "label", action->private_data->short_label,
-                       "use-underline", TRUE,
-                       "stock-id", action->private_data->stock_id,
-                       "icon-name", action->private_data->icon_name,
-                       NULL);
-           
-          if (action->private_data->stock_id &&
-             gtk_icon_factory_lookup_default (action->private_data->stock_id))
-            {
-              /* use the stock icon */
-              gtk_tool_button_set_icon_widget (GTK_TOOL_BUTTON (proxy), NULL);
-            }
-          else if (action->private_data->gicon)
-            {
-              icon_size = gtk_tool_item_get_icon_size (GTK_TOOL_ITEM (proxy));
-              image = gtk_tool_button_get_icon_widget (GTK_TOOL_BUTTON (proxy));
-              if (!image)
-                {
-                  image = gtk_image_new ();
-                 gtk_widget_show (image);
-                  gtk_tool_button_set_icon_widget (GTK_TOOL_BUTTON (proxy), 
-                                                   image);
-                }
-
-              gtk_image_set_from_gicon (GTK_IMAGE (image),
-                                        action->private_data->gicon, 
-                                        icon_size);
-            }
-
-         g_signal_connect_object (proxy, "clicked",
-                                  G_CALLBACK (gtk_action_activate), action,
-                                  G_CONNECT_SWAPPED);
-        }
-      else 
-        {
-           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);
-       }
-
-      gtk_action_sync_tooltip (action, proxy);
-
-      g_signal_connect_object (proxy, "create-menu-proxy",
-                              G_CALLBACK (gtk_action_create_menu_proxy),
-                              action, 0);
-
-      gtk_tool_item_rebuild_menu (GTK_TOOL_ITEM (proxy));
-    }
-  else if (GTK_IS_BUTTON (proxy))
-    {
-      /* button specific synchronisers ... */
-      if (gtk_button_get_use_stock (GTK_BUTTON (proxy)))
-       {
-         /* synchronise stock-id */
-         g_object_set (proxy,
-                       "label", action->private_data->stock_id,
-                       NULL);
-       }
-      else 
-       {
-         GtkWidget *image;
-
-         image = gtk_button_get_image (GTK_BUTTON (proxy));
-
-         if (GTK_IS_IMAGE (image) ||
-             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);
-           }
-
-         if (GTK_IS_IMAGE (image) &&
-              (gtk_image_get_storage_type (GTK_IMAGE (image)) == GTK_IMAGE_EMPTY ||
-              gtk_image_get_storage_type (GTK_IMAGE (image)) == GTK_IMAGE_GICON))
-            gtk_image_set_from_gicon (GTK_IMAGE (image),
-                                      action->private_data->gicon, GTK_ICON_SIZE_MENU);
-          else if (GTK_IS_IMAGE (image) &&
-                   (gtk_image_get_storage_type (GTK_IMAGE (image)) == GTK_IMAGE_EMPTY ||
-                    gtk_image_get_storage_type (GTK_IMAGE (image)) == GTK_IMAGE_ICON_NAME))
-            gtk_image_set_from_icon_name (GTK_IMAGE (image),
-                                          action->private_data->icon_name, GTK_ICON_SIZE_MENU);
-       }
-      /* 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);
-    }
-
-  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)
-{
-  g_object_set_qdata (G_OBJECT (proxy), quark_gtk_action_proxy, NULL);
-
-  g_object_weak_unref (G_OBJECT (proxy), (GWeakNotify)remove_proxy, action);
-  remove_proxy (action, proxy);
-
-  /* disconnect the activate handler */
-  g_signal_handlers_disconnect_by_func (proxy,
-                                       G_CALLBACK (gtk_action_activate),
-                                       action);
-
-  /* toolbar button specific synchronisers ... */
-  g_signal_handlers_disconnect_by_func (proxy,
-                                       G_CALLBACK (gtk_action_create_menu_proxy),
-                                       action);
-
-  if (action->private_data->action_group)
-    _gtk_action_group_emit_disconnect_proxy (action->private_data->action_group, action, proxy);
-}
-
 void
 _gtk_action_emit_activate (GtkAction *action)
 {
@@ -973,19 +823,59 @@ gtk_action_activate (GtkAction *action)
 {
   g_return_if_fail (GTK_IS_ACTION (action));
   
+  if (action->private_data->activate_blocked)
+    return;
+
   if (gtk_action_is_sensitive (action))
     _gtk_action_emit_activate (action);
 }
 
+/**
+ * gtk_action_block_activate:
+ * @action: a #GtkAction
+ *
+ * Disable activation signals from the action 
+ *
+ * This is needed when updating the state of your proxy
+ * #GtkActivatable widget could result in calling gtk_action_activate(),
+ * this is a convenience function to avoid recursing in those
+ * cases (updating toggle state for instance).
+ *
+ * Since: 2.16
+ */
+void
+gtk_action_block_activate (GtkAction *action)
+{
+  g_return_if_fail (GTK_IS_ACTION (action));
+
+  action->private_data->activate_blocked = TRUE;
+}
+
+/**
+ * gtk_action_unblock_activate:
+ * @action: a #GtkAction
+ *
+ * Reenable activation signals from the action 
+ *
+ * Since: 2.16
+ */
+void
+gtk_action_unblock_activate (GtkAction *action)
+{
+  g_return_if_fail (GTK_IS_ACTION (action));
+
+  action->private_data->activate_blocked = FALSE;
+}
+
 /**
  * gtk_action_create_icon:
  * @action: the action object
- * @icon_size: the size of the icon that should be created.
+ * @icon_size: (type int): the size of the icon that should be created.
  *
  * This function is intended for use by action implementations to
  * create icons displayed in the proxy widgets.
  *
- * Returns: a widget that displays the icon for this action.
+ * Returns: (transfer none): a widget that displays the icon for this action.
  *
  * Since: 2.4
  */
@@ -1011,7 +901,7 @@ gtk_action_create_icon (GtkAction *action, GtkIconSize icon_size)
  *
  * Creates a menu item widget that proxies for the given action.
  *
- * Returns: a menu item connected to the action.
+ * Returns: (transfer none): a menu item connected to the action.
  *
  * Since: 2.4
  */
@@ -1024,7 +914,8 @@ gtk_action_create_menu_item (GtkAction *action)
 
   menu_item = GTK_ACTION_GET_CLASS (action)->create_menu_item (action);
 
-  GTK_ACTION_GET_CLASS (action)->connect_proxy (action, menu_item);
+  gtk_activatable_set_use_action_appearance (GTK_ACTIVATABLE (menu_item), TRUE);
+  gtk_activatable_set_related_action (GTK_ACTIVATABLE (menu_item), action);
 
   return menu_item;
 }
@@ -1035,7 +926,7 @@ gtk_action_create_menu_item (GtkAction *action)
  *
  * Creates a toolbar item widget that proxies for the given action.
  *
- * Returns: a toolbar item connected to the action.
+ * Returns: (transfer none): a toolbar item connected to the action.
  *
  * Since: 2.4
  */
@@ -1048,62 +939,29 @@ gtk_action_create_tool_item (GtkAction *action)
 
   button = GTK_ACTION_GET_CLASS (action)->create_tool_item (action);
 
-  GTK_ACTION_GET_CLASS (action)->connect_proxy (action, button);
+  gtk_activatable_set_use_action_appearance (GTK_ACTIVATABLE (button), TRUE);
+  gtk_activatable_set_related_action (GTK_ACTIVATABLE (button), action);
 
   return button;
 }
 
-/**
- * gtk_action_connect_proxy:
- * @action: the action object
- * @proxy: the proxy widget
- *
- * Connects a widget to an action object as a proxy.  Synchronises 
- * various properties of the action with the widget (such as label 
- * text, icon, tooltip, etc), and attaches a callback so that the 
- * action gets activated when the proxy widget does.
- *
- * If the widget is already connected to an action, it is disconnected
- * first.
- *
- * Since: 2.4
- */
 void
-gtk_action_connect_proxy (GtkAction *action,
-                         GtkWidget *proxy)
+_gtk_action_add_to_proxy_list (GtkAction     *action,
+                              GtkWidget     *proxy)
 {
-  GtkAction *prev_action;
-
   g_return_if_fail (GTK_IS_ACTION (action));
   g_return_if_fail (GTK_IS_WIDGET (proxy));
-
-  prev_action = g_object_get_qdata (G_OBJECT (proxy), quark_gtk_action_proxy);
-
-  if (prev_action)
-    GTK_ACTION_GET_CLASS (action)->disconnect_proxy (prev_action, proxy);
-
   GTK_ACTION_GET_CLASS (action)->connect_proxy (action, proxy);
 }
 
-/**
- * gtk_action_disconnect_proxy:
- * @action: the action object
- * @proxy: the proxy widget
- *
- * Disconnects a proxy widget from an action.  
- * Does <emphasis>not</emphasis> destroy the widget, however.
- *
- * Since: 2.4
- */
 void
-gtk_action_disconnect_proxy (GtkAction *action,
-                            GtkWidget *proxy)
+_gtk_action_remove_from_proxy_list (GtkAction     *action,
+                                   GtkWidget     *proxy)
 {
   g_return_if_fail (GTK_IS_ACTION (action));
   g_return_if_fail (GTK_IS_WIDGET (proxy));
 
-  g_return_if_fail (g_object_get_qdata (G_OBJECT (proxy), quark_gtk_action_proxy) == action);
-
   GTK_ACTION_GET_CLASS (action)->disconnect_proxy (action, proxy);
 }
 
@@ -1112,9 +970,9 @@ gtk_action_disconnect_proxy (GtkAction *action,
  * @action: the action object
  * 
  * Returns the proxy widgets for an action.
- * See also gtk_widget_get_action().
- * 
- * Return value: a #GSList of proxy widgets. The list is owned by GTK+
+ * See also gtk_activatable_get_related_action().
+ *
+ * Return value: (element-type GtkWidget) (transfer none): a #GSList of proxy widgets. The list is owned by GTK+
  * and must not be modified.
  *
  * Since: 2.4
@@ -1127,28 +985,6 @@ gtk_action_get_proxies (GtkAction *action)
   return action->private_data->proxies;
 }
 
-
-/**
- * gtk_widget_get_action:
- * @widget: a #GtkWidget
- *
- * Returns the #GtkAction that @widget is a proxy for. 
- * See also gtk_action_get_proxies().
- *
- * Returns: the action that a widget is a proxy for, or
- *  %NULL, if it is not attached to an action.
- *
- * Since: 2.10
- */
-GtkAction*
-gtk_widget_get_action (GtkWidget *widget)
-{
-  g_return_val_if_fail (GTK_IS_WIDGET (widget), NULL);
-  
-  return g_object_get_qdata (G_OBJECT (widget), quark_gtk_action_proxy);
-}
-
-
 /**
  * gtk_action_get_name:
  * @action: the action object
@@ -1160,7 +996,7 @@ gtk_widget_get_action (GtkWidget *widget)
  *
  * Since: 2.4
  **/
-G_CONST_RETURN gchar *
+const gchar *
 gtk_action_get_name (GtkAction *action)
 {
   g_return_val_if_fail (GTK_IS_ACTION (action), NULL);
@@ -1211,22 +1047,6 @@ gtk_action_get_sensitive (GtkAction *action)
   return action->private_data->sensitive;
 }
 
-void
-_gtk_action_sync_sensitive (GtkAction *action)
-{
-  GSList *p;
-  GtkWidget *proxy;
-  gboolean sensitive;
-
-  sensitive = gtk_action_is_sensitive (action);
-
-  for (p = action->private_data->proxies; p; p = p->next)
-    {
-      proxy = (GtkWidget *)p->data;
-      gtk_widget_set_sensitive (proxy, sensitive);
-    }      
-}
-
 /**
  * gtk_action_set_sensitive:
  * @action: the action object
@@ -1251,8 +1071,6 @@ gtk_action_set_sensitive (GtkAction *action,
     {
       action->private_data->sensitive = sensitive;
 
-      _gtk_action_sync_sensitive (action);
-
       g_object_notify (G_OBJECT (action), "sensitive");
     }
 }
@@ -1300,36 +1118,6 @@ gtk_action_get_visible (GtkAction *action)
   return action->private_data->visible;
 }
 
-void
-_gtk_action_sync_visible (GtkAction *action)
-{
-  GSList *p;
-  GtkWidget *proxy;
-  GtkWidget *menu;
-  gboolean visible;
-
-  visible = gtk_action_is_visible (action);
-    
-  for (p = action->private_data->proxies; p; p = p->next)
-    {
-      proxy = (GtkWidget *)p->data;
-
-      if (GTK_IS_MENU_ITEM (proxy))
-       {
-         menu = gtk_menu_item_get_submenu (GTK_MENU_ITEM (proxy));
-         
-         _gtk_action_sync_menu_visible (action, proxy, _gtk_menu_is_empty (menu));
-       }
-      else
-       {
-         if (visible)
-           gtk_widget_show (proxy);
-         else
-           gtk_widget_hide (proxy);
-       }
-    } 
-}
-
 /**
  * gtk_action_set_visible:
  * @action: the action object
@@ -1354,8 +1142,6 @@ gtk_action_set_visible (GtkAction *action,
     {
       action->private_data->visible = visible;
 
-      _gtk_action_sync_visible (action);
-
       g_object_notify (G_OBJECT (action), "visible");
     }
 }
@@ -1374,9 +1160,6 @@ void
 gtk_action_set_is_important (GtkAction *action,
                             gboolean   is_important)
 {
-  GSList *p;
-  GtkWidget *proxy;
-
   g_return_if_fail (GTK_IS_ACTION (action));
 
   is_important = is_important != FALSE;
@@ -1384,15 +1167,6 @@ gtk_action_set_is_important (GtkAction *action,
   if (action->private_data->is_important != is_important)
     {
       action->private_data->is_important = is_important;
-
-      for (p = action->private_data->proxies; p; p = p->next)
-       {
-         proxy = (GtkWidget *)p->data;
-
-         if (GTK_IS_TOOL_ITEM (proxy))
-           gtk_tool_item_set_is_important (GTK_TOOL_ITEM (proxy),
-                                           is_important);
-       }
       
       g_object_notify (G_OBJECT (action), "is-important");
     }  
@@ -1403,12 +1177,12 @@ gtk_action_set_is_important (GtkAction *action,
  * @action: a #GtkAction
  *
  * Checks whether @action is important or not
- *
+ * 
  * Returns: whether @action is important
  *
  * Since: 2.16
  */
-gboolean
+gboolean 
 gtk_action_get_is_important (GtkAction *action)
 {
   g_return_val_if_fail (GTK_IS_ACTION (action), FALSE);
@@ -1416,6 +1190,59 @@ gtk_action_get_is_important (GtkAction *action)
   return action->private_data->is_important;
 }
 
+/**
+ * gtk_action_set_always_show_image:
+ * @action: a #GtkAction
+ * @always_show: %TRUE if menuitem proxies should always show their image
+ *
+ * Sets whether @action<!-- -->'s menu item proxies will ignore the
+ * #GtkSettings:gtk-menu-images setting and always show their image, if available.
+ *
+ * Use this if the menu item would be useless or hard to use
+ * without their image.
+ *
+ * Since: 2.20
+ */
+void
+gtk_action_set_always_show_image (GtkAction *action,
+                                  gboolean   always_show)
+{
+  GtkActionPrivate *priv;
+
+  g_return_if_fail (GTK_IS_ACTION (action));
+
+  priv = action->private_data;
+
+  always_show = always_show != FALSE;
+  
+  if (priv->always_show_image != always_show)
+    {
+      priv->always_show_image = always_show;
+
+      g_object_notify (G_OBJECT (action), "always-show-image");
+    }
+}
+
+/**
+ * gtk_action_get_always_show_image:
+ * @action: a #GtkAction
+ *
+ * Returns whether @action<!-- -->'s menu item proxies will ignore the
+ * #GtkSettings:gtk-menu-images setting and always show their image,
+ * if available.
+ *
+ * Returns: %TRUE if the menu item proxies will always show their image
+ *
+ * Since: 2.20
+ */
+gboolean
+gtk_action_get_always_show_image  (GtkAction *action)
+{
+  g_return_val_if_fail (GTK_IS_ACTION (action), FALSE);
+
+  return action->private_data->always_show_image;
+}
+
 /**
  * gtk_action_set_label:
  * @action: a #GtkAction
@@ -1429,8 +1256,6 @@ void
 gtk_action_set_label (GtkAction          *action,
                      const gchar *label)
 {
-  GSList *p;
-  GtkWidget *proxy, *child;
   gchar *tmp;
   
   g_return_if_fail (GTK_IS_ACTION (action));
@@ -1447,21 +1272,7 @@ gtk_action_set_label (GtkAction    *action,
       if (gtk_stock_lookup (action->private_data->stock_id, &stock_item))
        action->private_data->label = g_strdup (stock_item.label);
     }
-  
-  for (p = action->private_data->proxies; p; p = p->next)
-    {
-      proxy = (GtkWidget *)p->data;
-      
-      if (GTK_IS_MENU_ITEM (proxy))
-       {
-         child = GTK_BIN (proxy)->child;
-         
-         if (GTK_IS_LABEL (child))
-           gtk_label_set_label (GTK_LABEL (child), 
-                                action->private_data->label);
-       }
-    }
-  
+
   g_object_notify (G_OBJECT (action), "label");
   
   /* if short_label is unset, set short_label=label */
@@ -1482,7 +1293,7 @@ gtk_action_set_label (GtkAction     *action,
  *
  * Since: 2.16
  */
-G_CONST_RETURN gchar *
+const gchar *
 gtk_action_get_label (GtkAction *action)
 {
   g_return_val_if_fail (GTK_IS_ACTION (action), NULL);
@@ -1493,71 +1304,46 @@ gtk_action_get_label (GtkAction *action)
 /**
  * gtk_action_set_short_label:
  * @action: a #GtkAction
- * @label: the label text to set
+ * @short_label: the label text to set
  *
- * Sets a shorter label on @action.
+ * Sets a shorter label text on @action.
  *
  * Since: 2.16
  */
 void 
-gtk_action_set_short_label (GtkAction  *action,
-                           const gchar *label)
+gtk_action_set_short_label (GtkAction   *action,
+                           const gchar *short_label)
 {
-  GSList *p;
-  GtkWidget *proxy, *child;
   gchar *tmp;
 
   g_return_if_fail (GTK_IS_ACTION (action));
 
   tmp = action->private_data->short_label;
-  action->private_data->short_label = g_strdup (label);
+  action->private_data->short_label = g_strdup (short_label);
   g_free (tmp);
   action->private_data->short_label_set = (action->private_data->short_label != NULL);
   /* if short_label is unset, then use the value of label */
   if (!action->private_data->short_label_set)
     action->private_data->short_label = g_strdup (action->private_data->label);
 
-  for (p = action->private_data->proxies; p; p = p->next)
-    {
-      proxy = (GtkWidget *)p->data;
-
-      if (GTK_IS_TOOL_BUTTON (proxy))
-       gtk_tool_button_set_label (GTK_TOOL_BUTTON (proxy),
-                                  action->private_data->short_label);
-      else if (GTK_IS_BUTTON (proxy) &&
-              !gtk_button_get_use_stock (GTK_BUTTON (proxy)))
-       {
-         GtkWidget *image;
-
-         child = GTK_BIN (proxy)->child;
-
-         image = gtk_button_get_image (GTK_BUTTON (proxy));
-
-         if (GTK_IS_IMAGE (image) ||
-             child == NULL || GTK_IS_LABEL (child))
-           gtk_button_set_label (GTK_BUTTON (proxy),
-                                 action->private_data->short_label);
-       }
-    }
-
   g_object_notify (G_OBJECT (action), "short-label");
 }
 
 /**
  * gtk_action_get_short_label:
  * @action: a #GtkAction
- * @label: the label text to set
  *
- * Sets a shorter label on @action.
+ * Gets the short label text of @action.
+ *
+ * Returns: the short label text.
  *
  * Since: 2.16
  */
-G_CONST_RETURN gchar *
+const gchar *
 gtk_action_get_short_label (GtkAction *action)
 {
   g_return_val_if_fail (GTK_IS_ACTION (action), NULL);
 
-  g_object_notify (G_OBJECT (action), "short-label");
   return action->private_data->short_label;
 }
 
@@ -1574,8 +1360,7 @@ void
 gtk_action_set_visible_horizontal (GtkAction *action,
                                   gboolean   visible_horizontal)
 {
-  GSList *p;
-  GtkWidget *proxy;
+  g_return_if_fail (GTK_IS_ACTION (action));
 
   g_return_if_fail (GTK_IS_ACTION (action));
 
@@ -1584,15 +1369,6 @@ gtk_action_set_visible_horizontal (GtkAction *action,
   if (action->private_data->visible_horizontal != visible_horizontal)
     {
       action->private_data->visible_horizontal = visible_horizontal;
-
-      for (p = action->private_data->proxies; p; p = p->next)
-       {
-         proxy = (GtkWidget *)p->data;
-
-         if (GTK_IS_TOOL_ITEM (proxy))
-           gtk_tool_item_set_visible_horizontal (GTK_TOOL_ITEM (proxy),
-                                                 visible_horizontal);
-       }
       
       g_object_notify (G_OBJECT (action), "visible-horizontal");
     }  
@@ -1603,12 +1379,12 @@ gtk_action_set_visible_horizontal (GtkAction *action,
  * @action: a #GtkAction
  *
  * Checks whether @action is visible when horizontal
- *
+ * 
  * Returns: whether @action is visible when horizontal
  *
  * Since: 2.16
  */
-gboolean
+gboolean 
 gtk_action_get_visible_horizontal (GtkAction *action)
 {
   g_return_val_if_fail (GTK_IS_ACTION (action), FALSE);
@@ -1621,7 +1397,7 @@ gtk_action_get_visible_horizontal (GtkAction *action)
  * @action: a #GtkAction
  * @visible_vertical: whether the action is visible vertically
  *
- * Sets whether @action is visible when vertical
+ * Sets whether @action is visible when vertical 
  *
  * Since: 2.16
  */
@@ -1629,8 +1405,7 @@ void
 gtk_action_set_visible_vertical (GtkAction *action,
                                 gboolean   visible_vertical)
 {
-  GSList *p;
-  GtkWidget *proxy;
+  g_return_if_fail (GTK_IS_ACTION (action));
 
   g_return_if_fail (GTK_IS_ACTION (action));
 
@@ -1639,15 +1414,6 @@ gtk_action_set_visible_vertical (GtkAction *action,
   if (action->private_data->visible_vertical != visible_vertical)
     {
       action->private_data->visible_vertical = visible_vertical;
-
-      for (p = action->private_data->proxies; p; p = p->next)
-       {
-         proxy = (GtkWidget *)p->data;
-
-         if (GTK_IS_TOOL_ITEM (proxy))
-           gtk_tool_item_set_visible_vertical (GTK_TOOL_ITEM (proxy),
-                                               visible_vertical);
-       }
       
       g_object_notify (G_OBJECT (action), "visible-vertical");
     }  
@@ -1658,12 +1424,12 @@ gtk_action_set_visible_vertical (GtkAction *action,
  * @action: a #GtkAction
  *
  * Checks whether @action is visible when horizontal
- *
+ * 
  * Returns: whether @action is visible when horizontal
  *
  * Since: 2.16
  */
-gboolean
+gboolean 
 gtk_action_get_visible_vertical (GtkAction *action)
 {
   g_return_val_if_fail (GTK_IS_ACTION (action), FALSE);
@@ -1671,14 +1437,6 @@ gtk_action_get_visible_vertical (GtkAction *action)
   return action->private_data->visible_vertical;
 }
 
-static void 
-gtk_action_sync_tooltip (GtkAction *action,
-                        GtkWidget *proxy)
-{
-  gtk_tool_item_set_tooltip_text (GTK_TOOL_ITEM (proxy),
-                                 action->private_data->tooltip);
-}
-
 /**
  * gtk_action_set_tooltip:
  * @action: a #GtkAction
@@ -1692,8 +1450,6 @@ void
 gtk_action_set_tooltip (GtkAction   *action,
                        const gchar *tooltip)
 {
-  GSList *p;
-  GtkWidget *proxy;
   gchar *tmp;
 
   g_return_if_fail (GTK_IS_ACTION (action));
@@ -1702,14 +1458,6 @@ gtk_action_set_tooltip (GtkAction   *action,
   action->private_data->tooltip = g_strdup (tooltip);
   g_free (tmp);
 
-  for (p = action->private_data->proxies; p; p = p->next)
-    {
-      proxy = (GtkWidget *)p->data;
-
-      if (GTK_IS_TOOL_ITEM (proxy))
-        gtk_action_sync_tooltip (action, proxy);
-    }
-
   g_object_notify (G_OBJECT (action), "tooltip");
 }
 
@@ -1719,11 +1467,11 @@ gtk_action_set_tooltip (GtkAction   *action,
  *
  * Gets the tooltip text of @action.
  *
-* Returns: the tooltip text
+ * Returns: the tooltip text
  *
  * Since: 2.16
  */
-G_CONST_RETURN gchar *
+const gchar *
 gtk_action_get_tooltip (GtkAction *action)
 {
   g_return_val_if_fail (GTK_IS_ACTION (action), NULL);
@@ -1734,7 +1482,7 @@ gtk_action_get_tooltip (GtkAction *action)
 /**
  * gtk_action_set_stock_id:
  * @action: a #GtkAction
- * @tooltip: the tooltip text
+ * @stock_id: the stock id
  *
  * Sets the stock id on @action
  *
@@ -1744,42 +1492,16 @@ void
 gtk_action_set_stock_id (GtkAction   *action,
                         const gchar *stock_id)
 {
-  GSList *p;
-  GtkWidget *proxy, *image;
   gchar *tmp;
-  
+
+  g_return_if_fail (GTK_IS_ACTION (action));
+
   g_return_if_fail (GTK_IS_ACTION (action));
 
   tmp = action->private_data->stock_id;
   action->private_data->stock_id = g_strdup (stock_id);
   g_free (tmp);
 
-  for (p = action->private_data->proxies; p; p = p->next)
-    {
-      proxy = (GtkWidget *)p->data;
-      
-      if (GTK_IS_IMAGE_MENU_ITEM (proxy))
-       {
-         image = gtk_image_menu_item_get_image (GTK_IMAGE_MENU_ITEM (proxy));
-         
-         if (GTK_IS_IMAGE (image))
-           gtk_image_set_from_stock (GTK_IMAGE (image),
-                                     action->private_data->stock_id, GTK_ICON_SIZE_MENU);
-       } 
-      else if (GTK_IS_TOOL_BUTTON (proxy))
-       {
-          gtk_tool_button_set_icon_widget (GTK_TOOL_BUTTON (proxy), NULL);
-         gtk_tool_button_set_stock_id (GTK_TOOL_BUTTON (proxy),
-                                       action->private_data->stock_id);
-       }
-      else if (GTK_IS_BUTTON (proxy) &&
-              gtk_button_get_use_stock (GTK_BUTTON (proxy)))
-       {
-         gtk_button_set_label (GTK_BUTTON (proxy),
-                               action->private_data->stock_id);
-       }
-    }
-
   g_object_notify (G_OBJECT (action), "stock-id");
   
   /* update label and short_label if appropriate */
@@ -1807,7 +1529,7 @@ gtk_action_set_stock_id (GtkAction   *action,
  *
  * Since: 2.16
  */
-G_CONST_RETURN gchar *
+const gchar *
 gtk_action_get_stock_id (GtkAction *action)
 {
   g_return_val_if_fail (GTK_IS_ACTION (action), NULL);
@@ -1818,7 +1540,7 @@ gtk_action_get_stock_id (GtkAction *action)
 /**
  * gtk_action_set_icon_name:
  * @action: a #GtkAction
- * @tooltip: the icon name to set
+ * @icon_name: the icon name to set
  *
  * Sets the icon name on @action
  *
@@ -1828,48 +1550,14 @@ void
 gtk_action_set_icon_name (GtkAction   *action,
                          const gchar *icon_name)
 {
-  GSList *p;
-  GtkWidget *proxy, *image;
   gchar *tmp;
-  
+
   g_return_if_fail (GTK_IS_ACTION (action));
 
   tmp = action->private_data->icon_name;
   action->private_data->icon_name = g_strdup (icon_name);
   g_free (tmp);
 
-  for (p = action->private_data->proxies; p; p = p->next)
-    {
-      proxy = (GtkWidget *)p->data;
-      
-      if (GTK_IS_IMAGE_MENU_ITEM (proxy))
-       {
-         image = gtk_image_menu_item_get_image (GTK_IMAGE_MENU_ITEM (proxy));
-         
-         if (GTK_IS_IMAGE (image) &&
-             (gtk_image_get_storage_type (GTK_IMAGE (image)) == GTK_IMAGE_EMPTY ||
-              gtk_image_get_storage_type (GTK_IMAGE (image)) == GTK_IMAGE_ICON_NAME))
-           gtk_image_set_from_icon_name (GTK_IMAGE (image),
-                                         action->private_data->icon_name, GTK_ICON_SIZE_MENU);
-       } 
-      else if (GTK_IS_TOOL_BUTTON (proxy))
-       {
-         gtk_tool_button_set_icon_name (GTK_TOOL_BUTTON (proxy),
-                                        action->private_data->icon_name);
-       }
-      else if (GTK_IS_BUTTON (proxy) &&
-              !gtk_button_get_use_stock (GTK_BUTTON (proxy)))
-       {
-         image = gtk_button_get_image (GTK_BUTTON (proxy));
-         
-         if (GTK_IS_IMAGE (image) &&
-             (gtk_image_get_storage_type (GTK_IMAGE (image)) == GTK_IMAGE_EMPTY ||
-              gtk_image_get_storage_type (GTK_IMAGE (image)) == GTK_IMAGE_ICON_NAME))
-           gtk_image_set_from_icon_name (GTK_IMAGE (image),
-                                         action->private_data->icon_name, GTK_ICON_SIZE_MENU);
-       }
-    }
-  
   g_object_notify (G_OBJECT (action), "icon-name");
 }
 
@@ -1883,7 +1571,7 @@ gtk_action_set_icon_name (GtkAction   *action,
  *
  * Since: 2.16
  */
-G_CONST_RETURN gchar *
+const gchar *
 gtk_action_get_icon_name (GtkAction *action)
 {
   g_return_val_if_fail (GTK_IS_ACTION (action), NULL);
@@ -1904,11 +1592,6 @@ void
 gtk_action_set_gicon (GtkAction *action,
                       GIcon     *icon)
 {
-  GSList *p;
-  GtkWidget *proxy, *image;
-  GtkIconSize icon_size;
-  gboolean has_stock_icon;
-  
   g_return_if_fail (GTK_IS_ACTION (action));
 
   if (action->private_data->gicon)
@@ -1919,48 +1602,6 @@ gtk_action_set_gicon (GtkAction *action,
   if (action->private_data->gicon)
     g_object_ref (action->private_data->gicon);
 
-  if (action->private_data->stock_id &&
-      gtk_icon_factory_lookup_default (action->private_data->stock_id))
-    has_stock_icon = TRUE;
-  else
-    has_stock_icon = FALSE;
-
-  for (p = action->private_data->proxies; p; p = p->next)
-    {
-      proxy = (GtkWidget *)p->data;
-  
-      if (GTK_IS_IMAGE_MENU_ITEM (proxy) && !has_stock_icon)
-        {
-          image = gtk_image_menu_item_get_image (GTK_IMAGE_MENU_ITEM (proxy));
-          gtk_image_set_from_gicon (GTK_IMAGE (image), icon, GTK_ICON_SIZE_MENU);
-        } 
-      else if (GTK_IS_TOOL_BUTTON (proxy))
-        {
-          if (has_stock_icon || !icon)
-            image = NULL;
-          else 
-            {   
-              image = gtk_tool_button_get_icon_widget (GTK_TOOL_BUTTON (proxy));
-              icon_size = gtk_tool_item_get_icon_size (GTK_TOOL_ITEM (proxy));
-
-              if (!image)
-                image = gtk_image_new ();
-            }
-
-          gtk_tool_button_set_icon_widget (GTK_TOOL_BUTTON (proxy), image);
-          gtk_image_set_from_gicon (GTK_IMAGE (image), icon, icon_size);
-        }
-      else if (GTK_IS_BUTTON (proxy) && 
-               !gtk_button_get_use_stock (GTK_BUTTON (proxy)))
-        {
-          image = gtk_button_get_image (GTK_BUTTON (proxy));
-         if (GTK_IS_IMAGE (image) &&
-              (gtk_image_get_storage_type (GTK_IMAGE (image)) == GTK_IMAGE_EMPTY ||
-              gtk_image_get_storage_type (GTK_IMAGE (image)) == GTK_IMAGE_GICON))
-            gtk_image_set_from_gicon (GTK_IMAGE (image), icon, GTK_ICON_SIZE_BUTTON);
-        }
-    }
-  
   g_object_notify (G_OBJECT (action), "gicon");
 }
 
@@ -1970,7 +1611,7 @@ gtk_action_set_gicon (GtkAction *action,
  *
  * Gets the gicon of @action.
  *
- * Returns: The action's #GIcon if one is set.
+ * Returns: (transfer none): The action's #GIcon if one is set.
  *
  * Since: 2.16
  */
@@ -1982,52 +1623,6 @@ gtk_action_get_gicon (GtkAction *action)
   return action->private_data->gicon;
 }
 
-/**
- * gtk_action_block_activate_from:
- * @action: the action object
- * @proxy: a proxy widget
- *
- * Disables calls to the gtk_action_activate()
- * function by signals on the given proxy widget.  This is used to
- * break notification loops for things like check or radio actions.
- *
- * This function is intended for use by action implementations.
- * 
- * Since: 2.4
- */
-void
-gtk_action_block_activate_from (GtkAction *action, 
-                               GtkWidget *proxy)
-{
-  g_return_if_fail (GTK_IS_ACTION (action));
-  
-  g_signal_handlers_block_by_func (proxy, G_CALLBACK (gtk_action_activate),
-                                  action);
-}
-
-/**
- * gtk_action_unblock_activate_from:
- * @action: the action object
- * @proxy: a proxy widget
- *
- * Re-enables calls to the gtk_action_activate()
- * function by signals on the given proxy widget.  This undoes the
- * blocking done by gtk_action_block_activate_from().
- *
- * This function is intended for use by action implementations.
- * 
- * Since: 2.4
- */
-void
-gtk_action_unblock_activate_from (GtkAction *action, 
-                                 GtkWidget *proxy)
-{
-  g_return_if_fail (GTK_IS_ACTION (action));
-
-  g_signal_handlers_unblock_by_func (proxy, G_CALLBACK (gtk_action_activate),
-                                    action);
-}
-
 static void
 closure_accel_activate (GClosure     *closure,
                         GValue       *return_value,
@@ -2093,7 +1688,7 @@ gtk_action_set_accel_path (GtkAction   *action,
  *   if none is set. The returned string is owned by GTK+ 
  *   and must not be freed or modified.
  */
-G_CONST_RETURN gchar *
+const gchar *
 gtk_action_get_accel_path (GtkAction *action)
 {
   g_return_val_if_fail (GTK_IS_ACTION (action), NULL);
@@ -2112,8 +1707,9 @@ gtk_action_get_accel_path (GtkAction *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.
+ * Returns: (transfer none): 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)
@@ -2127,8 +1723,8 @@ gtk_action_get_accel_closure (GtkAction *action)
 /**
  * gtk_action_set_accel_group:
  * @action: the action object
- * @accel_group: a #GtkAccelGroup or %NULL
- * 
+ * @accel_group: (allow-none): a #GtkAccelGroup or %NULL
+ *
  * Sets the #GtkAccelGroup in which the accelerator for this action
  * will be installed.
  *
@@ -2218,7 +1814,8 @@ gtk_action_disconnect_accelerator (GtkAction *action)
  * item or the toolbar item it creates, this function returns an
  * instance of that menu.
  *
- * Return value: the menu item provided by the action, or %NULL.
+ * Return value: (transfer none): the menu item provided by the
+ *               action, or %NULL.
  *
  * Since: 2.12
  */
@@ -2232,6 +1829,3 @@ gtk_action_create_menu (GtkAction *action)
 
   return NULL;
 }
-
-#define __GTK_ACTION_C__
-#include "gtkaliasdef.c"