[gtk+/wip/baedert/drawing: 3/5] widget: Add private _get_border_allocation



commit b5e8c6588501f67fcb6d3267221cbc5291a87100
Author: Timm Bäder <mail baedert org>
Date:   Fri May 5 09:29:36 2017 +0200

    widget: Add private _get_border_allocation

 gtk/gtkwidget.c        |   53 ++++++++++++++++++++++++++++++-----------------
 gtk/gtkwidgetprivate.h |    2 +
 2 files changed, 36 insertions(+), 19 deletions(-)
---
diff --git a/gtk/gtkwidget.c b/gtk/gtkwidget.c
index 2cd8f30..83fb8ce 100644
--- a/gtk/gtkwidget.c
+++ b/gtk/gtkwidget.c
@@ -3804,6 +3804,8 @@ gtk_widget_init (GTypeInstance *instance, gpointer g_class)
   priv->allocation.y = -1;
   priv->allocation.width = 1;
   priv->allocation.height = 1;
+  priv->clip = priv->allocation;
+  priv->clip_set = TRUE;
   priv->user_alpha = 255;
   priv->alpha = 255;
   priv->window = NULL;
@@ -5528,9 +5530,9 @@ gtk_widget_size_allocate_with_baseline (GtkWidget     *widget,
 
   baseline_changed = old_baseline != baseline;
   size_changed = (old_allocation.width != real_allocation.width ||
-                 old_allocation.height != real_allocation.height);
+                  old_allocation.height != real_allocation.height);
   position_changed = (old_allocation.x != real_allocation.x ||
-                     old_allocation.y != real_allocation.y);
+                      old_allocation.y != real_allocation.y);
 
   if (!alloc_needed && !size_changed && !position_changed && !baseline_changed)
     goto out;
@@ -5554,12 +5556,18 @@ gtk_widget_size_allocate_with_baseline (GtkWidget     *widget,
                             margin.bottom + border.bottom + padding.bottom;
   /* TODO: Baseline! */
 
+  priv->clip_set = FALSE;
   priv->allocated_baseline = baseline;
   if (g_signal_has_handler_pending (widget, widget_signals[SIZE_ALLOCATE], 0, FALSE))
     g_signal_emit (widget, widget_signals[SIZE_ALLOCATE], 0, &real_allocation);
   else
     GTK_WIDGET_GET_CLASS (widget)->size_allocate (widget, &real_allocation);
 
+  if (!priv->clip_set)
+    {
+      g_warning ("%s %p did not set a clip in size_allocate", G_OBJECT_TYPE_NAME (widget), widget);
+    }
+
   /* Size allocation is god... after consulting god, no further requests or allocations are needed */
 #ifdef G_ENABLE_DEBUG
   if (GTK_DEBUG_CHECK (GEOMETRY) && gtk_widget_get_resize_needed (widget))
@@ -13700,23 +13708,7 @@ gtk_widget_set_clip (GtkWidget           *widget,
   allocation.height += shadow.top + shadow.bottom;
   gdk_rectangle_union (&allocation, clip, &priv->clip);
 
-
-  while (priv->parent &&
-         _gtk_widget_get_window (widget) == _gtk_widget_get_window (priv->parent))
-    {
-      GtkWidgetPrivate *parent_priv = priv->parent->priv;
-      GdkRectangle union_rect;
-
-      gdk_rectangle_union (&priv->clip,
-                           &parent_priv->clip,
-                           &union_rect);
-
-      if (gdk_rectangle_equal (&parent_priv->clip, &union_rect))
-        break;
-
-      parent_priv->clip = union_rect;
-      priv = parent_priv;
-    }
+  priv->clip_set = TRUE;
 }
 
 /*
@@ -13878,6 +13870,28 @@ gtk_widget_get_content_allocation (GtkWidget     *widget,
                         margin.bottom + border.bottom + padding.bottom;
 }
 
+void
+gtk_widget_get_border_allocation (GtkWidget     *widget,
+                                  GtkAllocation *allocation)
+{
+  GtkWidgetPrivate *priv = gtk_widget_get_instance_private (widget);
+  GtkBorder margin, border;
+  GtkCssStyle *style;
+
+  style = gtk_css_node_get_style (priv->cssnode);
+  get_box_margin (style, &margin);
+  get_box_border (style, &border);
+
+  *allocation = priv->allocation;
+
+  allocation->x += margin.left + border.left;
+  allocation->y += margin.top + border.top;
+  allocation->width -= margin.left + border.left +
+                       margin.right + border.right;
+  allocation->height -= margin.top + border.top +
+                        margin.bottom + border.bottom;
+}
+
 /**
  * gtk_widget_set_allocation:
  * @widget: a #GtkWidget
@@ -13909,6 +13923,7 @@ gtk_widget_set_allocation (GtkWidget           *widget,
 
   priv->allocation = *allocation;
   priv->clip = *allocation;
+  priv->clip_set = TRUE;
 }
 
 /**
diff --git a/gtk/gtkwidgetprivate.h b/gtk/gtkwidgetprivate.h
index 0000ef2..2dc5054 100644
--- a/gtk/gtkwidgetprivate.h
+++ b/gtk/gtkwidgetprivate.h
@@ -316,6 +316,8 @@ gboolean          gtk_widget_focus_move                    (GtkWidget        *wi
                                                             GPtrArray        *focus_order);
 void              gtk_widget_get_content_allocation        (GtkWidget        *widget,
                                                             GtkAllocation    *allocation);
+void              gtk_widget_get_border_allocation         (GtkWidget        *widget,
+                                                            GtkAllocation    *allocation);
 
 /* inline getters */
 


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