[libhandy] css: Add GtkBin derivative helpers



commit 89ac7561b4e0fd3ecbfd5c82ce8bdc39f80cc037
Author: Adrien Plazas <kekun plazas laposte net>
Date:   Thu Dec 17 12:09:34 2020 +0100

    css: Add GtkBin derivative helpers
    
    This will simplify fixing size allocation and drawing for GtkBin
    derivatives.

 src/hdy-css-private.h | 24 ++++++++++++++
 src/hdy-css.c         | 88 +++++++++++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 112 insertions(+)
---
diff --git a/src/hdy-css-private.h b/src/hdy-css-private.h
index 09a5197c..daaefdc6 100644
--- a/src/hdy-css-private.h
+++ b/src/hdy-css-private.h
@@ -31,4 +31,28 @@ void hdy_css_size_allocate_children (GtkWidget     *widget,
 void hdy_css_draw (GtkWidget *widget,
                    cairo_t   *cr);
 
+void hdy_css_get_preferred_width (GtkWidget *widget,
+                                  gint      *minimum,
+                                  gint      *natural);
+
+void hdy_css_get_preferred_width_for_height (GtkWidget *widget,
+                                             gint       height,
+                                             gint      *minimum,
+                                             gint      *natural);
+
+void hdy_css_get_preferred_height (GtkWidget *widget,
+                                   gint      *minimum,
+                                   gint      *natural);
+
+void hdy_css_get_preferred_height_for_width (GtkWidget *widget,
+                                             gint       width,
+                                             gint      *minimum,
+                                             gint      *natural);
+
+void hdy_css_size_allocate_bin (GtkWidget     *widget,
+                                GtkAllocation *allocation);
+
+gboolean hdy_css_draw_bin (GtkWidget *widget,
+                           cairo_t   *cr);
+
 G_END_DECLS
diff --git a/src/hdy-css.c b/src/hdy-css.c
index 6e11a619..f01a8763 100644
--- a/src/hdy-css.c
+++ b/src/hdy-css.c
@@ -146,3 +146,91 @@ hdy_css_draw (GtkWidget *widget,
                       height - border.top - border.bottom);
   }
 }
+
+void
+hdy_css_get_preferred_width (GtkWidget *widget,
+                             gint      *minimum,
+                             gint      *natural)
+{
+  GObjectClass *pclass = g_type_class_peek_parent (G_OBJECT_GET_CLASS (widget));
+
+  g_assert (G_OBJECT_CLASS_TYPE (pclass) == GTK_TYPE_BIN);
+
+  GTK_WIDGET_CLASS (pclass)->get_preferred_width (widget, minimum, natural);
+
+  hdy_css_measure (widget, GTK_ORIENTATION_HORIZONTAL, minimum, natural);
+}
+
+void
+hdy_css_get_preferred_width_for_height (GtkWidget *widget,
+                                        gint       height,
+                                        gint      *minimum,
+                                        gint      *natural)
+{
+  GObjectClass *pclass = g_type_class_peek_parent (G_OBJECT_GET_CLASS (widget));
+
+  g_assert (G_OBJECT_CLASS_TYPE (pclass) == GTK_TYPE_BIN);
+
+  GTK_WIDGET_CLASS (pclass)->get_preferred_width_for_height (widget, height, minimum, natural);
+
+  hdy_css_measure (widget, GTK_ORIENTATION_HORIZONTAL, minimum, natural);
+}
+
+void
+hdy_css_get_preferred_height (GtkWidget *widget,
+                              gint      *minimum,
+                              gint      *natural)
+{
+  GObjectClass *pclass = g_type_class_peek_parent (G_OBJECT_GET_CLASS (widget));
+
+  g_assert (G_OBJECT_CLASS_TYPE (pclass) == GTK_TYPE_BIN);
+
+  GTK_WIDGET_CLASS (pclass)->get_preferred_height (widget, minimum, natural);
+
+  hdy_css_measure (widget, GTK_ORIENTATION_VERTICAL, minimum, natural);
+}
+
+void
+hdy_css_get_preferred_height_for_width (GtkWidget *widget,
+                                        gint       width,
+                                        gint      *minimum,
+                                        gint      *natural)
+{
+  GObjectClass *pclass = g_type_class_peek_parent (G_OBJECT_GET_CLASS (widget));
+
+  g_assert (G_OBJECT_CLASS_TYPE (pclass) == GTK_TYPE_BIN);
+
+  GTK_WIDGET_CLASS (pclass)->get_preferred_height_for_width (widget, width, minimum, natural);
+
+  hdy_css_measure (widget, GTK_ORIENTATION_VERTICAL, minimum, natural);
+}
+
+void
+hdy_css_size_allocate_bin (GtkWidget     *widget,
+                           GtkAllocation *allocation)
+{
+  GObjectClass *pclass = g_type_class_peek_parent (G_OBJECT_GET_CLASS (widget));
+  GtkAllocation child_alloc;
+
+  g_assert (G_OBJECT_CLASS_TYPE (pclass) == GTK_TYPE_BIN);
+
+  hdy_css_size_allocate_self (widget, allocation);
+  gtk_widget_set_allocation (widget, allocation);
+
+  child_alloc = *allocation;
+  hdy_css_size_allocate_children (widget, &child_alloc);
+  gtk_widget_size_allocate (gtk_bin_get_child (GTK_BIN (widget)), &child_alloc);
+}
+
+gboolean
+hdy_css_draw_bin (GtkWidget *widget,
+                  cairo_t   *cr)
+{
+  GObjectClass *pclass = g_type_class_peek_parent (G_OBJECT_GET_CLASS (widget));
+
+  g_assert (G_OBJECT_CLASS_TYPE (pclass) == GTK_TYPE_BIN);
+
+  hdy_css_draw (widget, cr);
+
+  return GTK_WIDGET_CLASS (pclass)->draw (widget, cr);
+}


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]