]> Pileus Git - ~andy/gtk/blobdiff - gtk/gtktoolbutton.c
stylecontext: Do invalidation on first resize container
[~andy/gtk] / gtk / gtktoolbutton.c
index e2876d8fb5800af16f306d97880b4c56e93f0b4f..cf8a22dfa5e7be3776ea7b7cdf6bdbd0665e2eef 100644 (file)
  * Lesser General Public License for more details.
  *
  * You should have received a copy of the GNU Lesser General Public
- * License along with this library; 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/>.
  */
 
 #include "config.h"
 #include "gtktoolbutton.h"
 #include "gtkbutton.h"
-#include "gtkhbox.h"
 #include "gtkiconfactory.h"
 #include "gtkimage.h"
 #include "gtkimagemenuitem.h"
 #include "gtklabel.h"
 #include "gtkstock.h"
-#include "gtkvbox.h"
+#include "gtkbox.h"
 #include "gtkintl.h"
 #include "gtktoolbar.h"
 #include "gtkactivatable.h"
+#include "gtkactionable.h"
 #include "gtkprivate.h"
 
 #include <string.h>
 
+
+/**
+ * SECTION:gtktoolbutton
+ * @Short_description: A GtkToolItem subclass that displays buttons
+ * @Title: GtkToolButton
+ * @See_also: #GtkToolbar, #GtkMenuToolButton, #GtkToggleToolButton,
+ *   #GtkRadioToolButton, #GtkSeparatorToolItem
+ *
+ * #GtkToolButton<!-- -->s are #GtkToolItems containing buttons.
+ *
+ * Use gtk_tool_button_new() to create a new #GtkToolButton. Use
+ * gtk_tool_button_new_from_stock() to create a #GtkToolButton
+ * containing a stock item.
+ *
+ * The label of a #GtkToolButton is determined by the properties
+ * #GtkToolButton:label-widget, #GtkToolButton:label, and
+ * #GtkToolButton:stock-id. If #GtkToolButton:label-widget is
+ * non-%NULL, then that widget is used as the label. Otherwise, if
+ * #GtkToolButton:label is non-%NULL, that string is used as the label.
+ * Otherwise, if #GtkToolButton:stock-id is non-%NULL, the label is
+ * determined by the stock item. Otherwise, the button does not have a label.
+ *
+ * The icon of a #GtkToolButton is determined by the properties
+ * #GtkToolButton:icon-widget and #GtkToolButton:stock-id. If
+ * #GtkToolButton:icon-widget is non-%NULL, then
+ * that widget is used as the icon. Otherwise, if #GtkToolButton:stock-id is
+ * non-%NULL, the icon is determined by the stock item. Otherwise,
+ * the button does not have a icon.
+ */
+
+
 #define MENU_ID "gtk-tool-button-menu-id"
 
 enum {
@@ -51,7 +80,9 @@ enum {
   PROP_LABEL_WIDGET,
   PROP_STOCK_ID,
   PROP_ICON_NAME,
-  PROP_ICON_WIDGET
+  PROP_ICON_WIDGET,
+  PROP_ACTION_NAME,
+  PROP_ACTION_TARGET
 };
 
 static void gtk_tool_button_init          (GtkToolButton      *button,
@@ -73,11 +104,11 @@ static void gtk_tool_button_toolbar_reconfigured (GtkToolItem *tool_item);
 static gboolean   gtk_tool_button_create_menu_proxy (GtkToolItem     *item);
 static void       button_clicked                    (GtkWidget       *widget,
                                                     GtkToolButton   *button);
-static void gtk_tool_button_style_set      (GtkWidget          *widget,
-                                           GtkStyle           *prev_style);
+static void gtk_tool_button_style_updated  (GtkWidget          *widget);
 
 static void gtk_tool_button_construct_contents (GtkToolItem *tool_item);
 
+static void gtk_tool_button_actionable_iface_init      (GtkActionableInterface *iface);
 static void gtk_tool_button_activatable_interface_init (GtkActivatableIface  *iface);
 static void gtk_tool_button_update                     (GtkActivatable       *activatable,
                                                        GtkAction            *action,
@@ -106,7 +137,6 @@ static GObjectClass        *parent_class = NULL;
 static GtkActivatableIface *parent_activatable_iface;
 static guint                toolbutton_signals[LAST_SIGNAL] = { 0 };
 
-
 GType
 gtk_tool_button_get_type (void)
 {
@@ -114,6 +144,12 @@ gtk_tool_button_get_type (void)
   
   if (!type)
     {
+      const GInterfaceInfo actionable_info =
+      {
+        (GInterfaceInitFunc) gtk_tool_button_actionable_iface_init,
+        (GInterfaceFinalizeFunc) NULL,
+        NULL
+      };
       const GInterfaceInfo activatable_info =
       {
         (GInterfaceInitFunc) gtk_tool_button_activatable_interface_init,
@@ -129,6 +165,7 @@ gtk_tool_button_get_type (void)
                                            (GInstanceInitFunc) gtk_tool_button_init,
                                            0);
 
+      g_type_add_interface_static (type, GTK_TYPE_ACTIONABLE, &actionable_info);
       g_type_add_interface_static (type, GTK_TYPE_ACTIVATABLE,
                                    &activatable_info);
     }
@@ -153,7 +190,7 @@ gtk_tool_button_class_init (GtkToolButtonClass *klass)
   object_class->notify = gtk_tool_button_property_notify;
   object_class->finalize = gtk_tool_button_finalize;
 
-  widget_class->style_set = gtk_tool_button_style_set;
+  widget_class->style_updated = gtk_tool_button_style_updated;
 
   tool_item_class->create_menu_proxy = gtk_tool_button_create_menu_proxy;
   tool_item_class->toolbar_reconfigured = gtk_tool_button_toolbar_reconfigured;
@@ -249,6 +286,9 @@ gtk_tool_button_class_init (GtkToolButtonClass *klass)
                                                        GTK_TYPE_WIDGET,
                                                        GTK_PARAM_READWRITE));
 
+  g_object_class_override_property (object_class, PROP_ACTION_NAME, "action-name");
+  g_object_class_override_property (object_class, PROP_ACTION_TARGET, "action-target");
+
   /**
    * GtkButton:icon-spacing:
    * 
@@ -510,9 +550,9 @@ gtk_tool_button_construct_contents (GtkToolItem *tool_item)
 
     case GTK_TOOLBAR_BOTH:
       if (text_orientation == GTK_ORIENTATION_HORIZONTAL)
-       box = gtk_box_new (GTK_ORIENTATION_VERTICAL, FALSE, icon_spacing);
+       box = gtk_box_new (GTK_ORIENTATION_VERTICAL, icon_spacing);
       else
-       box = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, FALSE, icon_spacing);
+       box = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, icon_spacing);
       if (icon)
        gtk_box_pack_start (GTK_BOX (box), icon, TRUE, TRUE, 0);
       gtk_box_pack_end (GTK_BOX (box), label, FALSE, TRUE, 0);
@@ -522,7 +562,7 @@ gtk_tool_button_construct_contents (GtkToolItem *tool_item)
     case GTK_TOOLBAR_BOTH_HORIZ:
       if (text_orientation == GTK_ORIENTATION_HORIZONTAL)
        {
-         box = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, FALSE, icon_spacing);
+         box = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, icon_spacing);
          if (icon)
            gtk_box_pack_start (GTK_BOX (box), icon, label? FALSE : TRUE, TRUE, 0);
          if (label)
@@ -530,7 +570,7 @@ gtk_tool_button_construct_contents (GtkToolItem *tool_item)
        }
       else
        {
-         box = gtk_box_new (GTK_ORIENTATION_VERTICAL, FALSE, icon_spacing);
+         box = gtk_box_new (GTK_ORIENTATION_VERTICAL, icon_spacing);
          if (icon)
            gtk_box_pack_end (GTK_BOX (box), icon, label ? FALSE : TRUE, TRUE, 0);
          if (label)
@@ -583,6 +623,12 @@ gtk_tool_button_set_property (GObject         *object,
     case PROP_ICON_WIDGET:
       gtk_tool_button_set_icon_widget (button, g_value_get_object (value));
       break;
+    case PROP_ACTION_NAME:
+      g_object_set_property (G_OBJECT (button->priv->button), "action-name", value);
+      break;
+    case PROP_ACTION_TARGET:
+      g_object_set_property (G_OBJECT (button->priv->button), "action-target", value);
+      break;
     default:
       G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
       break;
@@ -631,12 +677,61 @@ gtk_tool_button_get_property (GObject         *object,
     case PROP_ICON_WIDGET:
       g_value_set_object (value, button->priv->icon_widget);
       break;
+    case PROP_ACTION_NAME:
+      g_object_get_property (G_OBJECT (button->priv->button), "action-name", value);
+      break;
+    case PROP_ACTION_TARGET:
+      g_object_get_property (G_OBJECT (button->priv->button), "action-target", value);
+      break;
     default:
       G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
       break;
     }
 }
 
+static const gchar *
+gtk_tool_button_get_action_name (GtkActionable *actionable)
+{
+  GtkToolButton *button = GTK_TOOL_BUTTON (actionable);
+
+  return gtk_actionable_get_action_name (GTK_ACTIONABLE (button->priv->button));
+}
+
+static void
+gtk_tool_button_set_action_name (GtkActionable *actionable,
+                                 const gchar   *action_name)
+{
+  GtkToolButton *button = GTK_TOOL_BUTTON (actionable);
+
+  gtk_actionable_set_action_name (GTK_ACTIONABLE (button->priv->button), action_name);
+}
+
+static GVariant *
+gtk_tool_button_get_action_target_value (GtkActionable *actionable)
+{
+  GtkToolButton *button = GTK_TOOL_BUTTON (actionable);
+
+  return gtk_actionable_get_action_target_value (GTK_ACTIONABLE (button->priv->button));
+}
+
+static void
+gtk_tool_button_set_action_target_value (GtkActionable *actionable,
+                                         GVariant      *action_target)
+{
+  GtkToolButton *button = GTK_TOOL_BUTTON (actionable);
+
+  gtk_actionable_set_action_target_value (GTK_ACTIONABLE (button->priv->button), action_target);
+}
+
+static void
+gtk_tool_button_actionable_iface_init (GtkActionableInterface *iface)
+{
+  iface->get_action_name = gtk_tool_button_get_action_name;
+  iface->set_action_name = gtk_tool_button_set_action_name;
+  iface->get_action_target_value = gtk_tool_button_get_action_target_value;
+  iface->set_action_target_value = gtk_tool_button_set_action_target_value;
+}
+
 static void
 gtk_tool_button_finalize (GObject *object)
 {
@@ -807,9 +902,10 @@ gtk_tool_button_update_icon_spacing (GtkToolButton *button)
 }
 
 static void
-gtk_tool_button_style_set (GtkWidget *widget,
-                          GtkStyle  *prev_style)
+gtk_tool_button_style_updated (GtkWidget *widget)
 {
+  GTK_WIDGET_CLASS (parent_class)->style_updated (widget);
+
   gtk_tool_button_update_icon_spacing (GTK_TOOL_BUTTON (widget));
 }
 
@@ -942,9 +1038,9 @@ gtk_tool_button_new_from_stock (const gchar *stock_id)
 /**
  * gtk_tool_button_new:
  * @label: (allow-none): a string that will be used as label, or %NULL
- * @icon_widget: (allow-none): a #GtkMisc widget that will be used as icon widget, or %NULL
+ * @icon_widget: (allow-none): a widget that will be used as the button contents, or %NULL
  *
- * Creates a new %GtkToolButton using @icon_widget as icon and @label as
+ * Creates a new %GtkToolButton using @icon_widget as contents and @label as
  * label.
  *
  * Return value: A new #GtkToolButton
@@ -957,7 +1053,7 @@ gtk_tool_button_new (GtkWidget      *icon_widget,
 {
   GtkToolButton *button;
 
-  g_return_val_if_fail (icon_widget == NULL || GTK_IS_MISC (icon_widget), NULL);
+  g_return_val_if_fail (icon_widget == NULL || GTK_IS_WIDGET (icon_widget), NULL);
 
   button = g_object_new (GTK_TYPE_TOOL_BUTTON,
                          "label", label,
@@ -1020,7 +1116,7 @@ gtk_tool_button_set_label (GtkToolButton *button,
  * 
  * Since: 2.4
  **/
-G_CONST_RETURN gchar *
+const gchar *
 gtk_tool_button_get_label (GtkToolButton *button)
 {
   g_return_val_if_fail (GTK_IS_TOOL_BUTTON (button), NULL);
@@ -1121,7 +1217,7 @@ gtk_tool_button_set_stock_id (GtkToolButton *button,
  * 
  * Since: 2.4
  **/
-G_CONST_RETURN gchar *
+const gchar *
 gtk_tool_button_get_stock_id (GtkToolButton *button)
 {
   g_return_val_if_fail (GTK_IS_TOOL_BUTTON (button), NULL);
@@ -1130,7 +1226,7 @@ gtk_tool_button_get_stock_id (GtkToolButton *button)
 }
 
 /**
- * gtk_tool_button_set_icon_name
+ * gtk_tool_button_set_icon_name:
  * @button: a #GtkToolButton
  * @icon_name: (allow-none): the name of the themed icon
  *
@@ -1161,18 +1257,18 @@ gtk_tool_button_set_icon_name (GtkToolButton *button,
 }
 
 /**
- * gtk_tool_button_get_icon_name
+ * gtk_tool_button_get_icon_name:
  * @button: a #GtkToolButton
- * 
+ *
  * Returns the name of the themed icon for the tool button,
  * see gtk_tool_button_set_icon_name().
  *
  * Returns: the icon name or %NULL if the tool button has
  * no themed icon
- * 
+ *
  * Since: 2.8
  **/
-G_CONST_RETURN gchar*
+const gchar*
 gtk_tool_button_get_icon_name (GtkToolButton *button)
 {
   g_return_val_if_fail (GTK_IS_TOOL_BUTTON (button), NULL);