summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorErnestas Kulik <ernestask@gnome.org>2018-03-11 09:51:50 +0200
committerErnestas Kulik <ernestask@gnome.org>2018-03-11 17:43:28 +0200
commit4e70309db9636b388bf7858e7b3318fbf4700dc2 (patch)
treec2a981ce39b4b04eb85c51c6a4de68955e6f1754
parent9a00c5fbed464a0fc1d2abeee279735f2e5d25a9 (diff)
downloadlibgd-4e70309db9636b388bf7858e7b3318fbf4700dc2.tar.gz
notification: use gtk_widget_measure()
-rw-r--r--libgd/gd-notification.c278
1 files changed, 125 insertions, 153 deletions
diff --git a/libgd/gd-notification.c b/libgd/gd-notification.c
index 00df8bb..1205f0a 100644
--- a/libgd/gd-notification.c
+++ b/libgd/gd-notification.c
@@ -74,20 +74,13 @@ enum {
static guint notification_signals[LAST_SIGNAL] = { 0 };
-static void gd_notification_get_preferred_width (GtkWidget *widget,
- gint *minimum_size,
- gint *natural_size);
-static void gd_notification_get_preferred_height_for_width (GtkWidget *widget,
- gint width,
- gint *minimum_height,
- gint *natural_height);
-static void gd_notification_get_preferred_height (GtkWidget *widget,
- gint *minimum_size,
- gint *natural_size);
-static void gd_notification_get_preferred_width_for_height (GtkWidget *widget,
- gint height,
- gint *minimum_width,
- gint *natural_width);
+static void gd_notification_measure (GtkWidget *widget,
+ GtkOrientation orientation,
+ gint for_size,
+ gint *minimum,
+ gint *natural,
+ gint *minimum_baseline,
+ gint *natural_baseline);
static void gd_notification_size_allocate (GtkWidget *widget,
const GtkAllocation *allocation,
gint baseline,
@@ -500,10 +493,7 @@ gd_notification_class_init (GdNotificationClass *klass)
widget_class->show = gd_notification_show;
widget_class->hide = gd_notification_hide;
widget_class->destroy = gd_notification_destroy;
- widget_class->get_preferred_width = gd_notification_get_preferred_width;
- widget_class->get_preferred_height_for_width = gd_notification_get_preferred_height_for_width;
- widget_class->get_preferred_height = gd_notification_get_preferred_height;
- widget_class->get_preferred_width_for_height = gd_notification_get_preferred_width_for_height;
+ widget_class->measure = gd_notification_measure;
widget_class->size_allocate = gd_notification_size_allocate;
widget_class->snapshot = gd_notification_snapshot;
widget_class->realize = gd_notification_realize;
@@ -584,152 +574,134 @@ gd_notification_add (GtkContainer *container,
static void
-gd_notification_get_preferred_width (GtkWidget *widget, gint *minimum_size, gint *natural_size)
-{
- GdNotification *notification = GD_NOTIFICATION (widget);
- GdNotificationPrivate *priv = notification->priv;
- GtkBin *bin = GTK_BIN (widget);
- gint child_min, child_nat;
- GtkWidget *child;
+gd_notification_measure (GtkWidget *widget,
+ GtkOrientation orientation,
+ gint for_size,
+ gint *minimum,
+ gint *natural,
+ gint *minimum_baseline,
+ gint *natural_baseline)
+{
+ gint minimum_size;
+ gint natural_size;
+ GdNotification *notification;
+ GdNotificationPrivate *priv;
GtkBorder padding;
- gint minimum, natural;
-
- get_padding_and_border (notification, &padding);
-
- minimum = 0;
- natural = 0;
-
- child = gtk_bin_get_child (bin);
- if (child && gtk_widget_get_visible (child))
- {
- gtk_widget_get_preferred_width (child,
- &child_min, &child_nat);
- minimum += child_min;
- natural += child_nat;
- }
-
- if (priv->show_close_button)
- {
- gtk_widget_get_preferred_width (priv->close_button,
- &child_min, &child_nat);
- minimum += child_min;
- natural += child_nat;
- }
-
- minimum += padding.left + padding.right + 2 * SHADOW_OFFSET_X;
- natural += padding.left + padding.right + 2 * SHADOW_OFFSET_X;
-
- if (minimum_size)
- *minimum_size = minimum;
-
- if (natural_size)
- *natural_size = natural;
-}
-
-static void
-gd_notification_get_preferred_width_for_height (GtkWidget *widget,
- gint height,
- gint *minimum_width,
- gint *natural_width)
-{
- GdNotification *notification = GD_NOTIFICATION (widget);
- GdNotificationPrivate *priv = notification->priv;
- GtkBin *bin = GTK_BIN (widget);
- gint child_min, child_nat, child_height;
GtkWidget *child;
- GtkBorder padding;
- gint minimum, natural;
-
- get_padding_and_border (notification, &padding);
-
- minimum = 0;
- natural = 0;
-
- child_height = height - SHADOW_OFFSET_Y - padding.top - padding.bottom;
+ gint child_minimum;
+ gint child_natural;
- child = gtk_bin_get_child (bin);
- if (child && gtk_widget_get_visible (child))
- {
- gtk_widget_get_preferred_width_for_height (child, child_height,
- &child_min, &child_nat);
- minimum += child_min;
- natural += child_nat;
- }
-
- if (priv->show_close_button)
- {
- gtk_widget_get_preferred_width_for_height (priv->close_button, child_height,
- &child_min, &child_nat);
- minimum += child_min;
- natural += child_nat;
- }
-
- minimum += padding.left + padding.right + 2 * SHADOW_OFFSET_X;
- natural += padding.left + padding.right + 2 * SHADOW_OFFSET_X;
-
- if (minimum_width)
- *minimum_width = minimum;
-
- if (natural_width)
- *natural_width = natural;
-}
-
-static void
-gd_notification_get_preferred_height_for_width (GtkWidget *widget,
- gint width,
- gint *minimum_height,
- gint *natural_height)
-{
- GdNotification *notification = GD_NOTIFICATION (widget);
- GdNotificationPrivate *priv = notification->priv;
- GtkBin *bin = GTK_BIN (widget);
- gint child_min, child_nat, child_width, button_width = 0;
- GtkWidget *child;
- GtkBorder padding;
- gint minimum = 0, natural = 0;
+ minimum_size = 0;
+ natural_size = 0;
+ notification = GD_NOTIFICATION (widget);
+ priv = notification->priv;
get_padding_and_border (notification, &padding);
- if (priv->show_close_button)
+ if (orientation == GTK_ORIENTATION_HORIZONTAL)
{
- gtk_widget_get_preferred_height (priv->close_button,
- &minimum, &natural);
- gtk_widget_get_preferred_width (priv->close_button,
- NULL, &button_width);
+ child = gtk_bin_get_child (GTK_BIN (widget));
+ if (child && gtk_widget_get_visible (child))
+ {
+ gtk_widget_measure (child, GTK_ORIENTATION_HORIZONTAL, -1,
+ &child_minimum, &child_natural, NULL, NULL);
+
+ minimum_size += child_minimum;
+ natural_size += child_natural;
+ }
+
+ if (priv->show_close_button)
+ {
+ gtk_widget_measure (priv->close_button, GTK_ORIENTATION_HORIZONTAL, -1,
+ &child_minimum, &child_natural, NULL, NULL);
+
+ minimum_size += child_minimum;
+ natural_size += child_natural;
+ }
+
+ minimum_size += padding.left + padding.right + 2 * SHADOW_OFFSET_X;
+ natural_size += padding.left + padding.right + 2 * SHADOW_OFFSET_X;
}
-
- child = gtk_bin_get_child (bin);
- if (child && gtk_widget_get_visible (child))
+ else
{
- child_width = width - button_width -
- 2 * SHADOW_OFFSET_X - padding.left - padding.right;
-
- gtk_widget_get_preferred_height_for_width (child, child_width,
- &child_min, &child_nat);
- minimum = MAX (minimum, child_min);
- natural = MAX (natural, child_nat);
+ GtkSizeRequestMode request_mode;
+
+ request_mode = gtk_widget_get_request_mode (widget);
+ if (request_mode == GTK_SIZE_REQUEST_HEIGHT_FOR_WIDTH)
+ {
+ gint button_width;
+ gint child_width;
+
+ if (priv->show_close_button)
+ {
+ gtk_widget_measure (priv->close_button, GTK_ORIENTATION_VERTICAL, -1,
+ &minimum_size, &natural_size, NULL, NULL);
+ gtk_widget_measure (priv->close_button, GTK_ORIENTATION_HORIZONTAL, -1,
+ NULL, &button_width, NULL, NULL);
+ }
+
+ child = gtk_bin_get_child (GTK_BIN (widget));
+ if (child && gtk_widget_get_visible (child))
+ {
+ child_width = for_size - button_width -
+ 2 * SHADOW_OFFSET_X - padding.left - padding.right;
+
+ gtk_widget_measure (child, GTK_ORIENTATION_VERTICAL, child_width,
+ &child_minimum, &child_natural, NULL, NULL);
+ minimum_size = MAX (minimum_size, child_minimum);
+ natural_size = MAX (natural_size, child_natural);
+ }
+
+ minimum_size += padding.top + padding.bottom + SHADOW_OFFSET_Y;
+ natural_size += padding.top + padding.bottom + SHADOW_OFFSET_Y;
+ }
+ else if (request_mode == GTK_SIZE_REQUEST_WIDTH_FOR_HEIGHT)
+ {
+ gint child_height;
+
+ child_height = for_size - SHADOW_OFFSET_Y - padding.top - padding.bottom;
+
+ child = gtk_bin_get_child (GTK_BIN (widget));
+ if (child && gtk_widget_get_visible (child))
+ {
+ gtk_widget_measure (child, GTK_ORIENTATION_HORIZONTAL, child_height,
+ &child_minimum, &child_natural, NULL, NULL);
+ minimum_size += child_minimum;
+ natural_size += child_natural;
+ }
+
+ if (priv->show_close_button)
+ {
+ gtk_widget_measure (priv->close_button, GTK_ORIENTATION_HORIZONTAL, child_height,
+ &child_minimum, &child_natural, NULL, NULL);
+ minimum_size += child_minimum;
+ natural_size += child_natural;
+ }
+
+ minimum_size += padding.left + padding.right + 2 * SHADOW_OFFSET_X;
+ natural_size += padding.left + padding.right + 2 * SHADOW_OFFSET_X;
+ }
+ else
+ {
+ GtkWidgetClass *widget_class;
+ gint unused;
+
+ widget_class = GTK_WIDGET_CLASS (gd_notification_parent_class);
+
+ widget_class->measure (widget, GTK_ORIENTATION_HORIZONTAL, -1,
+ &minimum_size, &unused, NULL, NULL);
+ widget_class->measure (widget, GTK_ORIENTATION_VERTICAL, minimum_size,
+ &minimum_size, &natural_size, NULL, NULL);
+
+ minimum_size += padding.top + padding.bottom + SHADOW_OFFSET_Y;
+ natural_size += padding.top + padding.bottom + SHADOW_OFFSET_Y;
+ }
}
- minimum += padding.top + padding.bottom + SHADOW_OFFSET_Y;
- natural += padding.top + padding.bottom + SHADOW_OFFSET_Y;
-
- if (minimum_height)
- *minimum_height = minimum;
-
- if (natural_height)
- *natural_height = natural;
-}
-
-static void
-gd_notification_get_preferred_height (GtkWidget *widget,
- gint *minimum_height,
- gint *natural_height)
-{
- gint width;
-
- gd_notification_get_preferred_width (widget, &width, NULL);
- gd_notification_get_preferred_height_for_width (widget, width,
- minimum_height, natural_height);
+ if (minimum != NULL)
+ *minimum = minimum_size;
+ if (natural != NULL)
+ *natural = natural_size;
}
static void