]> Pileus Git - ~andy/gtk/blobdiff - gtk/gtkbutton.c
Use gtk_box_new() instead gtk_[v|h]box_new()
[~andy/gtk] / gtk / gtkbutton.c
index 535cff7f9a1ce4befdd7714c530e1eadf7f523ad..3c81cbfca09b81786a6baa09542d12a47b12dbd8 100644 (file)
@@ -109,7 +109,7 @@ struct _GtkButtonPrivate
   GtkAction      *action;
 };
 
-static void gtk_button_destroy        (GtkObject          *object);
+static void gtk_button_destroy        (GtkWidget          *widget);
 static void gtk_button_dispose        (GObject            *object);
 static void gtk_button_set_property   (GObject            *object,
                                        guint               prop_id,
@@ -128,7 +128,7 @@ static void gtk_button_unmap (GtkWidget * widget);
 static void gtk_button_style_set (GtkWidget * widget, GtkStyle * prev_style);
 static void gtk_button_size_allocate (GtkWidget * widget,
                                      GtkAllocation * allocation);
-static gint gtk_button_expose (GtkWidget * widget, GdkEventExpose * event);
+static gint gtk_button_draw (GtkWidget * widget, cairo_t *cr);
 static gint gtk_button_button_press (GtkWidget * widget,
                                     GdkEventButton * event);
 static gint gtk_button_button_release (GtkWidget * widget,
@@ -172,11 +172,10 @@ static void gtk_button_set_related_action        (GtkButton            *button,
 static void gtk_button_set_use_action_appearance (GtkButton            *button,
                                                  gboolean              use_appearance);
 
-static void gtk_button_size_request_init         (GtkSizeRequestIface *iface);
-static void gtk_button_get_width                 (GtkSizeRequest      *widget,
+static void gtk_button_get_preferred_width       (GtkWidget           *widget,
                                                  gint                *minimum_size,
                                                  gint                *natural_size);
-static void gtk_button_get_height                (GtkSizeRequest      *widget,
+static void gtk_button_get_preferred_height      (GtkWidget           *widget,
                                                  gint                *minimum_size,
                                                  gint                *natural_size);
   
@@ -184,20 +183,16 @@ static guint button_signals[LAST_SIGNAL] = { 0 };
 
 G_DEFINE_TYPE_WITH_CODE (GtkButton, gtk_button, GTK_TYPE_BIN,
                         G_IMPLEMENT_INTERFACE (GTK_TYPE_ACTIVATABLE,
-                                               gtk_button_activatable_interface_init)
-                        G_IMPLEMENT_INTERFACE (GTK_TYPE_SIZE_REQUEST,
-                                               gtk_button_size_request_init))
+                                               gtk_button_activatable_interface_init))
 
 static void
 gtk_button_class_init (GtkButtonClass *klass)
 {
   GObjectClass *gobject_class;
-  GtkObjectClass *object_class;
   GtkWidgetClass *widget_class;
   GtkContainerClass *container_class;
 
   gobject_class = G_OBJECT_CLASS (klass);
-  object_class = (GtkObjectClass*) klass;
   widget_class = (GtkWidgetClass*) klass;
   container_class = (GtkContainerClass*) klass;
   
@@ -206,8 +201,9 @@ gtk_button_class_init (GtkButtonClass *klass)
   gobject_class->set_property = gtk_button_set_property;
   gobject_class->get_property = gtk_button_get_property;
 
-  object_class->destroy = gtk_button_destroy;
-
+  widget_class->get_preferred_width  = gtk_button_get_preferred_width;
+  widget_class->get_preferred_height = gtk_button_get_preferred_height;
+  widget_class->destroy = gtk_button_destroy;
   widget_class->screen_changed = gtk_button_screen_changed;
   widget_class->realize = gtk_button_realize;
   widget_class->unrealize = gtk_button_unrealize;
@@ -215,7 +211,7 @@ gtk_button_class_init (GtkButtonClass *klass)
   widget_class->unmap = gtk_button_unmap;
   widget_class->style_set = gtk_button_style_set;
   widget_class->size_allocate = gtk_button_size_allocate;
-  widget_class->expose_event = gtk_button_expose;
+  widget_class->draw = gtk_button_draw;
   widget_class->button_press_event = gtk_button_button_press;
   widget_class->button_release_event = gtk_button_button_release;
   widget_class->grab_broken_event = gtk_button_grab_broken;
@@ -359,7 +355,7 @@ gtk_button_class_init (GtkButtonClass *klass)
    */ 
   button_signals[PRESSED] =
     g_signal_new (I_("pressed"),
-                 G_OBJECT_CLASS_TYPE (object_class),
+                 G_OBJECT_CLASS_TYPE (gobject_class),
                  G_SIGNAL_RUN_FIRST,
                  G_STRUCT_OFFSET (GtkButtonClass, pressed),
                  NULL, NULL,
@@ -376,7 +372,7 @@ gtk_button_class_init (GtkButtonClass *klass)
    */ 
   button_signals[RELEASED] =
     g_signal_new (I_("released"),
-                 G_OBJECT_CLASS_TYPE (object_class),
+                 G_OBJECT_CLASS_TYPE (gobject_class),
                  G_SIGNAL_RUN_FIRST,
                  G_STRUCT_OFFSET (GtkButtonClass, released),
                  NULL, NULL,
@@ -391,7 +387,7 @@ gtk_button_class_init (GtkButtonClass *klass)
    */ 
   button_signals[CLICKED] =
     g_signal_new (I_("clicked"),
-                 G_OBJECT_CLASS_TYPE (object_class),
+                 G_OBJECT_CLASS_TYPE (gobject_class),
                  G_SIGNAL_RUN_FIRST | G_SIGNAL_ACTION,
                  G_STRUCT_OFFSET (GtkButtonClass, clicked),
                  NULL, NULL,
@@ -408,7 +404,7 @@ gtk_button_class_init (GtkButtonClass *klass)
    */ 
   button_signals[ENTER] =
     g_signal_new (I_("enter"),
-                 G_OBJECT_CLASS_TYPE (object_class),
+                 G_OBJECT_CLASS_TYPE (gobject_class),
                  G_SIGNAL_RUN_FIRST,
                  G_STRUCT_OFFSET (GtkButtonClass, enter),
                  NULL, NULL,
@@ -425,7 +421,7 @@ gtk_button_class_init (GtkButtonClass *klass)
    */ 
   button_signals[LEAVE] =
     g_signal_new (I_("leave"),
-                 G_OBJECT_CLASS_TYPE (object_class),
+                 G_OBJECT_CLASS_TYPE (gobject_class),
                  G_SIGNAL_RUN_FIRST,
                  G_STRUCT_OFFSET (GtkButtonClass, leave),
                  NULL, NULL,
@@ -443,7 +439,7 @@ gtk_button_class_init (GtkButtonClass *klass)
    */
   button_signals[ACTIVATE] =
     g_signal_new (I_("activate"),
-                 G_OBJECT_CLASS_TYPE (object_class),
+                 G_OBJECT_CLASS_TYPE (gobject_class),
                  G_SIGNAL_RUN_FIRST | G_SIGNAL_ACTION,
                  G_STRUCT_OFFSET (GtkButtonClass, activate),
                  NULL, NULL,
@@ -542,19 +538,6 @@ gtk_button_class_init (GtkButtonClass *klass)
                                                             2,
                                                             GTK_PARAM_READABLE));
 
-  /**
-   * GtkSettings::gtk-button-images:
-   *
-   * Whether images should be shown on buttons
-   *
-   * Since: 2.4
-   */
-  gtk_settings_install_property (g_param_spec_boolean ("gtk-button-images",
-                                                      P_("Show button images"),
-                                                      P_("Whether images should be shown on buttons"),
-                                                      TRUE,
-                                                      GTK_PARAM_READWRITE));
-
   g_type_class_add_private (gobject_class, sizeof (GtkButtonPrivate));
 }
 
@@ -588,17 +571,17 @@ gtk_button_init (GtkButton *button)
 }
 
 static void
-gtk_button_destroy (GtkObject *object)
+gtk_button_destroy (GtkWidget *widget)
 {
-  GtkButton *button = GTK_BUTTON (object);
-  
+  GtkButton *button = GTK_BUTTON (widget);
+
   if (button->label_text)
     {
       g_free (button->label_text);
       button->label_text = NULL;
     }
 
-  GTK_OBJECT_CLASS (gtk_button_parent_class)->destroy (object);
+  GTK_WIDGET_CLASS (gtk_button_parent_class)->destroy (widget);
 }
 
 static GObject*
@@ -1042,9 +1025,9 @@ gtk_button_construct_child (GtkButton *button)
 
       if (priv->image_position == GTK_POS_LEFT ||
          priv->image_position == GTK_POS_RIGHT)
-       box = gtk_hbox_new (FALSE, image_spacing);
+       box = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, FALSE, image_spacing);
       else
-       box = gtk_vbox_new (FALSE, image_spacing);
+       box = gtk_box_new (GTK_ORIENTATION_VERTICAL, FALSE, image_spacing);
 
       if (priv->align_set)
        align = gtk_alignment_new (priv->xalign, priv->yalign, 0.0, 0.0);
@@ -1534,136 +1517,130 @@ gtk_button_size_allocate (GtkWidget     *widget,
 
 void
 _gtk_button_paint (GtkButton          *button,
-                  const GdkRectangle *area,
+                  cairo_t            *cr,
+                   int                 width,
+                   int                 height,
                   GtkStateType        state_type,
                   GtkShadowType       shadow_type,
                   const gchar        *main_detail,
                   const gchar        *default_detail)
 {
   GtkWidget *widget;
-  gint width, height;
   gint x, y;
   GtkBorder default_border;
   GtkBorder default_outside_border;
   gboolean interior_focus;
   gint focus_width;
   gint focus_pad;
+  GtkAllocation allocation;
+  GdkWindow *window;
+  GtkStyle *style;
 
   widget = GTK_WIDGET (button);
 
-  if (gtk_widget_is_drawable (widget))
-    {
-      GtkAllocation allocation;
-      GdkWindow *window;
-      GtkStyle *style;
+  gtk_button_get_props (button, &default_border, &default_outside_border, NULL, &interior_focus);
+  gtk_widget_style_get (widget,
+                        "focus-line-width", &focus_width,
+                        "focus-padding", &focus_pad,
+                        NULL); 
 
-      gtk_button_get_props (button, &default_border, &default_outside_border, NULL, &interior_focus);
-      gtk_widget_style_get (widget,
-                           "focus-line-width", &focus_width,
-                           "focus-padding", &focus_pad,
-                           NULL); 
+  gtk_widget_get_allocation (widget, &allocation);
+  style = gtk_widget_get_style (widget);
+  window = gtk_widget_get_window (widget);
 
-      gtk_widget_get_allocation (widget, &allocation);
-      style = gtk_widget_get_style (widget);
-      window = gtk_widget_get_window (widget);
+  x = 0;
+  y = 0;
 
-      x = allocation.x;
-      y = allocation.y;
-      width = allocation.width;
-      height = allocation.height;
+  if (gtk_widget_has_default (widget) &&
+      GTK_BUTTON (widget)->relief == GTK_RELIEF_NORMAL)
+    {
+      gtk_paint_box (style, cr,
+                     GTK_STATE_NORMAL, GTK_SHADOW_IN,
+                     widget, "buttondefault",
+                     x, y, width, height);
+
+      x += default_border.left;
+      y += default_border.top;
+      width -= default_border.left + default_border.right;
+      height -= default_border.top + default_border.bottom;
+    }
+  else if (gtk_widget_get_can_default (widget))
+    {
+      x += default_outside_border.left;
+      y += default_outside_border.top;
+      width -= default_outside_border.left + default_outside_border.right;
+      height -= default_outside_border.top + default_outside_border.bottom;
+    }
+   
+  if (!interior_focus && gtk_widget_has_focus (widget))
+    {
+      x += focus_width + focus_pad;
+      y += focus_width + focus_pad;
+      width -= 2 * (focus_width + focus_pad);
+      height -= 2 * (focus_width + focus_pad);
+    }
 
-      if (gtk_widget_has_default (widget) &&
-         GTK_BUTTON (widget)->relief == GTK_RELIEF_NORMAL)
-       {
-         gtk_paint_box (style, window,
-                        GTK_STATE_NORMAL, GTK_SHADOW_IN,
-                        area, widget, "buttondefault",
-                        x, y, width, height);
-
-         x += default_border.left;
-         y += default_border.top;
-         width -= default_border.left + default_border.right;
-         height -= default_border.top + default_border.bottom;
-       }
-      else if (gtk_widget_get_can_default (widget))
-       {
-         x += default_outside_border.left;
-         y += default_outside_border.top;
-         width -= default_outside_border.left + default_outside_border.right;
-         height -= default_outside_border.top + default_outside_border.bottom;
-       }
-       
-      if (!interior_focus && gtk_widget_has_focus (widget))
-       {
-         x += focus_width + focus_pad;
-         y += focus_width + focus_pad;
-         width -= 2 * (focus_width + focus_pad);
-         height -= 2 * (focus_width + focus_pad);
-       }
+  if (button->relief != GTK_RELIEF_NONE || button->depressed ||
+      gtk_widget_get_state(widget) == GTK_STATE_PRELIGHT)
+    gtk_paint_box (style, cr,
+                   state_type,
+                   shadow_type, widget, "button",
+                   x, y, width, height);
+   
+  if (gtk_widget_has_focus (widget))
+    {
+      gint child_displacement_x;
+      gint child_displacement_y;
+      gboolean displace_focus;
+      
+      gtk_widget_style_get (widget,
+                            "child-displacement-y", &child_displacement_y,
+                            "child-displacement-x", &child_displacement_x,
+                            "displace-focus", &displace_focus,
+                            NULL);
 
-      if (button->relief != GTK_RELIEF_NONE || button->depressed ||
-         gtk_widget_get_state(widget) == GTK_STATE_PRELIGHT)
-        gtk_paint_box (style, window,
-                      state_type,
-                      shadow_type, area, widget, "button",
-                      x, y, width, height);
-       
-      if (gtk_widget_has_focus (widget))
-       {
-         gint child_displacement_x;
-         gint child_displacement_y;
-         gboolean displace_focus;
-         
-         gtk_widget_style_get (widget,
-                               "child-displacement-y", &child_displacement_y,
-                               "child-displacement-x", &child_displacement_x,
-                               "displace-focus", &displace_focus,
-                               NULL);
+      if (interior_focus)
+        {
+          x += style->xthickness + focus_pad;
+          y += style->ythickness + focus_pad;
+          width -= 2 * (style->xthickness + focus_pad);
+          height -=  2 * (style->ythickness + focus_pad);
+        }
+      else
+        {
+          x -= focus_width + focus_pad;
+          y -= focus_width + focus_pad;
+          width += 2 * (focus_width + focus_pad);
+          height += 2 * (focus_width + focus_pad);
+        }
 
-         if (interior_focus)
-           {
-             x += style->xthickness + focus_pad;
-             y += style->ythickness + focus_pad;
-             width -= 2 * (style->xthickness + focus_pad);
-             height -=  2 * (style->ythickness + focus_pad);
-           }
-         else
-           {
-             x -= focus_width + focus_pad;
-             y -= focus_width + focus_pad;
-             width += 2 * (focus_width + focus_pad);
-             height += 2 * (focus_width + focus_pad);
-           }
-
-         if (button->depressed && displace_focus)
-           {
-             x += child_displacement_x;
-             y += child_displacement_y;
-           }
-
-          gtk_paint_focus (style, window,
-                           gtk_widget_get_state (widget),
-                          area, widget, "button",
-                          x, y, width, height);
-       }
+      if (button->depressed && displace_focus)
+        {
+          x += child_displacement_x;
+          y += child_displacement_y;
+        }
+
+      gtk_paint_focus (style, cr,
+                       gtk_widget_get_state (widget),
+                       widget, "button",
+                       x, y, width, height);
     }
 }
 
 static gboolean
-gtk_button_expose (GtkWidget      *widget,
-                  GdkEventExpose *event)
+gtk_button_draw (GtkWidget *widget,
+                cairo_t   *cr)
 {
-  if (gtk_widget_is_drawable (widget))
-    {
-      GtkButton *button = GTK_BUTTON (widget);
-      
-      _gtk_button_paint (button, &event->area,
-                        gtk_widget_get_state (widget),
-                        button->depressed ? GTK_SHADOW_IN : GTK_SHADOW_OUT,
-                        "button", "buttondefault");
+  GtkButton *button = GTK_BUTTON (widget);
+  
+  _gtk_button_paint (button, cr, 
+                     gtk_widget_get_allocated_width (widget),
+                     gtk_widget_get_allocated_height (widget),
+                     gtk_widget_get_state (widget),
+                     button->depressed ? GTK_SHADOW_IN : GTK_SHADOW_OUT,
+                     "button", "buttondefault");
 
-      GTK_WIDGET_CLASS (gtk_button_parent_class)->expose_event (widget, event);
-    }
+  GTK_WIDGET_CLASS (gtk_button_parent_class)->draw (widget, cr);
 
   return FALSE;
 }
@@ -1748,12 +1725,10 @@ gtk_button_enter_notify (GtkWidget        *widget,
                         GdkEventCrossing *event)
 {
   GtkButton *button;
-  GtkWidget *event_widget;
 
   button = GTK_BUTTON (widget);
-  event_widget = gtk_get_event_widget ((GdkEvent*) event);
 
-  if ((event_widget == widget) &&
+  if ((event->window == button->event_window) &&
       (event->detail != GDK_NOTIFY_INFERIOR))
     {
       button->in_button = TRUE;
@@ -1768,14 +1743,12 @@ gtk_button_leave_notify (GtkWidget        *widget,
                         GdkEventCrossing *event)
 {
   GtkButton *button;
-  GtkWidget *event_widget;
 
   button = GTK_BUTTON (widget);
-  event_widget = gtk_get_event_widget ((GdkEvent*) event);
 
-  if ((event_widget == widget) &&
+  if ((event->window == button->event_window) &&
       (event->detail != GDK_NOTIFY_INFERIOR) &&
-      (gtk_widget_get_sensitive (event_widget)))
+      (gtk_widget_get_sensitive (widget)))
     {
       button->in_button = FALSE;
       gtk_button_leave (button);
@@ -1897,14 +1870,7 @@ gtk_button_finish_activate (GtkButton *button,
 
 
 static void
-gtk_button_size_request_init (GtkSizeRequestIface *iface)
-{
-  iface->get_width  = gtk_button_get_width;
-  iface->get_height = gtk_button_get_height;
-}
-
-static void
-gtk_button_get_size (GtkSizeRequest *widget,
+gtk_button_get_size (GtkWidget      *widget,
                     GtkOrientation  orientation,
                     gint           *minimum_size,
                     gint           *natural_size)
@@ -1952,11 +1918,9 @@ gtk_button_get_size (GtkSizeRequest *widget,
       gint child_min, child_nat;
 
       if (orientation == GTK_ORIENTATION_HORIZONTAL)
-       gtk_size_request_get_width (GTK_SIZE_REQUEST (child), 
-                                   &child_min, &child_nat);
+       gtk_widget_get_preferred_width (child, &child_min, &child_nat);
       else
-       gtk_size_request_get_height (GTK_SIZE_REQUEST (child), 
-                                    &child_min, &child_nat);
+       gtk_widget_get_preferred_height (child, &child_min, &child_nat);
 
       minimum += child_min;
       natural += child_nat;
@@ -1970,17 +1934,17 @@ gtk_button_get_size (GtkSizeRequest *widget,
 }
 
 static void 
-gtk_button_get_width (GtkSizeRequest      *widget,
-                     gint                *minimum_size,
-                     gint                *natural_size)
+gtk_button_get_preferred_width (GtkWidget *widget,
+                                gint      *minimum_size,
+                                gint      *natural_size)
 {
   gtk_button_get_size (widget, GTK_ORIENTATION_HORIZONTAL, minimum_size, natural_size);
 }
 
 static void 
-gtk_button_get_height (GtkSizeRequest      *widget,
-                      gint                *minimum_size,
-                      gint                *natural_size)
+gtk_button_get_preferred_height (GtkWidget *widget,
+                                 gint      *minimum_size,
+                                 gint      *natural_size)
 {
   gtk_button_get_size (widget, GTK_ORIENTATION_VERTICAL, minimum_size, natural_size);
 }
@@ -2323,7 +2287,7 @@ gtk_button_screen_changed (GtkWidget *widget,
 {
   GtkButton *button;
   GtkSettings *settings;
-  guint show_image_connection;
+  gulong show_image_connection;
 
   if (!gtk_widget_has_screen (widget))
     return;
@@ -2341,18 +2305,14 @@ gtk_button_screen_changed (GtkWidget *widget,
   settings = gtk_widget_get_settings (widget);
 
   show_image_connection = 
-    GPOINTER_TO_UINT (g_object_get_data (G_OBJECT (settings), 
-                                        "gtk-button-connection"));
+    g_signal_handler_find (settings, G_SIGNAL_MATCH_FUNC, 0, 0,
+                           NULL, gtk_button_setting_changed, NULL);
   
   if (show_image_connection)
     return;
 
-  show_image_connection =
-    g_signal_connect (settings, "notify::gtk-button-images",
-                     G_CALLBACK (gtk_button_setting_changed), NULL);
-  g_object_set_data (G_OBJECT (settings), 
-                    I_("gtk-button-connection"),
-                    GUINT_TO_POINTER (show_image_connection));
+  g_signal_connect (settings, "notify::gtk-button-images",
+                    G_CALLBACK (gtk_button_setting_changed), NULL);
 
   show_image_change_notify (button);
 }