[gtk+/native-layout] Implement GtkExtendedLayout on GtkButton
- From: Tristan Van Berkom <tvb src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gtk+/native-layout] Implement GtkExtendedLayout on GtkButton
- Date: Wed, 7 Apr 2010 00:49:37 +0000 (UTC)
commit 51ffd59884ed894f380f63bd706955c5f88016c4
Author: Tristan Van Berkom <tristan van berkom gmail com>
Date: Tue Apr 6 20:48:41 2010 -0400
Implement GtkExtendedLayout on GtkButton
GtkButton as a content type of widget needs to forward natural size information
to parent containers in order to be resized naturally.
gtk/gtkbutton.c | 118 ++++++++++++++++++++++++++++++++----------------------
1 files changed, 70 insertions(+), 48 deletions(-)
---
diff --git a/gtk/gtkbutton.c b/gtk/gtkbutton.c
index 5b328ae..7391de3 100644
--- a/gtk/gtkbutton.c
+++ b/gtk/gtkbutton.c
@@ -37,6 +37,7 @@
#include "gtkstock.h"
#include "gtkiconfactory.h"
#include "gtkactivatable.h"
+#include "gtkextendedlayout.h"
#include "gtkprivate.h"
#include "gtkintl.h"
#include "gtkalias.h"
@@ -111,8 +112,6 @@ static void gtk_button_unrealize (GtkWidget * widget);
static void gtk_button_map (GtkWidget * widget);
static void gtk_button_unmap (GtkWidget * widget);
static void gtk_button_style_set (GtkWidget * widget, GtkStyle * prev_style);
-static void gtk_button_size_request (GtkWidget * widget,
- GtkRequisition * requisition);
static void gtk_button_size_allocate (GtkWidget * widget,
GtkAllocation * allocation);
static gint gtk_button_expose (GtkWidget * widget, GdkEventExpose * event);
@@ -148,7 +147,7 @@ static void gtk_button_grab_notify (GtkWidget *widget,
gboolean was_grabbed);
-static void gtk_button_activatable_interface_init (GtkActivatableIface *iface);
+static void gtk_button_activatable_interface_init(GtkActivatableIface *iface);
static void gtk_button_update (GtkActivatable *activatable,
GtkAction *action,
const gchar *property_name);
@@ -159,11 +158,18 @@ 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_extended_layout_init (GtkExtendedLayoutIface *iface);
+static void gtk_button_get_desired_size (GtkExtendedLayout *layout,
+ GtkRequisition *minimum_size,
+ GtkRequisition *natural_size);
+
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))
+ gtk_button_activatable_interface_init)
+ G_IMPLEMENT_INTERFACE (GTK_TYPE_EXTENDED_LAYOUT,
+ gtk_button_extended_layout_init))
static void
gtk_button_class_init (GtkButtonClass *klass)
@@ -191,7 +197,6 @@ gtk_button_class_init (GtkButtonClass *klass)
widget_class->map = gtk_button_map;
widget_class->unmap = gtk_button_unmap;
widget_class->style_set = gtk_button_style_set;
- widget_class->size_request = gtk_button_size_request;
widget_class->size_allocate = gtk_button_size_allocate;
widget_class->expose_event = gtk_button_expose;
widget_class->button_press_event = gtk_button_button_press;
@@ -1331,49 +1336,6 @@ gtk_button_get_props (GtkButton *button,
if (interior_focus)
gtk_widget_style_get (widget, "interior-focus", interior_focus, NULL);
}
-
-static void
-gtk_button_size_request (GtkWidget *widget,
- GtkRequisition *requisition)
-{
- GtkButton *button = GTK_BUTTON (widget);
- GtkBorder default_border;
- GtkBorder inner_border;
- gint focus_width;
- gint focus_pad;
-
- gtk_button_get_props (button, &default_border, NULL, &inner_border, NULL);
- gtk_widget_style_get (GTK_WIDGET (widget),
- "focus-line-width", &focus_width,
- "focus-padding", &focus_pad,
- NULL);
-
- requisition->width = ((GTK_CONTAINER (widget)->border_width +
- GTK_WIDGET (widget)->style->xthickness) * 2 +
- inner_border.left + inner_border.right);
- requisition->height = ((GTK_CONTAINER (widget)->border_width +
- GTK_WIDGET (widget)->style->ythickness) * 2 +
- inner_border.top + inner_border.bottom);
-
- if (gtk_widget_get_can_default (widget))
- {
- requisition->width += default_border.left + default_border.right;
- requisition->height += default_border.top + default_border.bottom;
- }
-
- if (GTK_BIN (button)->child && gtk_widget_get_visible (GTK_BIN (button)->child))
- {
- GtkRequisition child_requisition;
-
- gtk_widget_size_request (GTK_BIN (button)->child, &child_requisition);
-
- requisition->width += child_requisition.width;
- requisition->height += child_requisition.height;
- }
-
- requisition->width += 2 * (focus_width + focus_pad);
- requisition->height += 2 * (focus_width + focus_pad);
-}
static void
gtk_button_size_allocate (GtkWidget *widget,
@@ -1803,6 +1765,66 @@ gtk_button_finish_activate (GtkButton *button,
gtk_button_clicked (button);
}
+
+static void
+gtk_button_extended_layout_init (GtkExtendedLayoutIface *iface)
+{
+ iface->get_desired_size = gtk_button_get_desired_size;
+}
+
+static void
+gtk_button_get_desired_size (GtkExtendedLayout *layout,
+ GtkRequisition *minimum_size,
+ GtkRequisition *natural_size)
+{
+ GtkButton *button = GTK_BUTTON (layout);
+ GtkWidget *child;
+ GtkBorder default_border;
+ GtkBorder inner_border;
+ gint focus_width;
+ gint focus_pad;
+
+ gtk_button_get_props (button, &default_border, NULL, &inner_border, NULL);
+ gtk_widget_style_get (GTK_WIDGET (layout),
+ "focus-line-width", &focus_width,
+ "focus-padding", &focus_pad,
+ NULL);
+
+ minimum_size->width = ((GTK_CONTAINER (layout)->border_width +
+ GTK_WIDGET (layout)->style->xthickness) * 2 +
+ inner_border.left + inner_border.right);
+ minimum_size->height = ((GTK_CONTAINER (layout)->border_width +
+ GTK_WIDGET (layout)->style->ythickness) * 2 +
+ inner_border.top + inner_border.bottom);
+
+ if (gtk_widget_get_can_default (GTK_WIDGET (layout)))
+ {
+ minimum_size->width += default_border.left + default_border.right;
+ minimum_size->height += default_border.top + default_border.bottom;
+ }
+
+ minimum_size->width += 2 * (focus_width + focus_pad);
+ minimum_size->height += 2 * (focus_width + focus_pad);
+
+ *natural_size = *minimum_size;
+
+ if ((child = gtk_bin_get_child (GTK_BIN (button))) &&
+ gtk_widget_get_visible (child))
+ {
+ GtkRequisition child_min;
+ GtkRequisition child_nat;
+
+ gtk_extended_layout_get_desired_size (GTK_EXTENDED_LAYOUT (child),
+ &child_min, &child_nat);
+
+ minimum_size->width += child_min.width;
+ minimum_size->height += child_min.height;
+ natural_size->width += child_nat.width;
+ natural_size->height += child_nat.height;
+ }
+}
+
+
/**
* gtk_button_set_label:
* @button: a #GtkButton
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]