From be3eb308b9b13ab3bd44589bbf8817c1c0c9ea91 Mon Sep 17 00:00:00 2001 From: "Jasper St. Pierre" Date: Mon, 13 Feb 2012 15:05:38 -0500 Subject: [PATCH] st: Account for children in StWidget's get_paint_volume Now that StWidget is a group of sorts, it needs to account for its children in its paint volume. Unfortunately, this causes havoc for StBoxLayout, so it needs fixing - it's unknown why it worked when chaining up to near-identical code in StContainer. https://bugzilla.gnome.org/show_bug.cgi?id=670034 --- src/st/st-box-layout.c | 21 ++++++++++++++++++--- src/st/st-container.c | 34 ---------------------------------- src/st/st-widget.c | 20 ++++++++++++++++++++ 3 files changed, 38 insertions(+), 37 deletions(-) diff --git a/src/st/st-box-layout.c b/src/st/st-box-layout.c index 19a2d46f5..86f1388b3 100644 --- a/src/st/st-box-layout.c +++ b/src/st/st-box-layout.c @@ -991,8 +991,25 @@ st_box_layout_get_paint_volume (ClutterActor *actor, { StBoxLayout *self = ST_BOX_LAYOUT (actor); gdouble x, y; + StBoxLayoutPrivate *priv = self->priv; + StThemeNode *theme_node = st_widget_get_theme_node (ST_WIDGET (actor)); + ClutterActorBox allocation_box; + ClutterActorBox content_box; + ClutterVertex origin; - if (!CLUTTER_ACTOR_CLASS (st_box_layout_parent_class)->get_paint_volume (actor, volume)) + /* When have an adjustment we are clipped to the content box, so base + * our paint volume on that. */ + if (priv->hadjustment || priv->vadjustment) + { + clutter_actor_get_allocation_box (actor, &allocation_box); + st_theme_node_get_content_box (theme_node, &allocation_box, &content_box); + origin.x = content_box.x1 - allocation_box.x1; + origin.y = content_box.y1 - allocation_box.y2; + origin.z = 0.f; + clutter_paint_volume_set_width (volume, content_box.x2 - content_box.x1); + clutter_paint_volume_set_height (volume, content_box.y2 - content_box.y1); + } + else if (!CLUTTER_ACTOR_CLASS (st_box_layout_parent_class)->get_paint_volume (actor, volume)) return FALSE; /* When scrolled, st_box_layout_apply_transform() includes the scroll offset @@ -1003,8 +1020,6 @@ st_box_layout_get_paint_volume (ClutterActor *actor, get_border_paint_offsets (self, &x, &y); if (x != 0 || y != 0) { - ClutterVertex origin; - clutter_paint_volume_get_origin (volume, &origin); origin.x += x; origin.y += y; diff --git a/src/st/st-container.c b/src/st/st-container.c index a670111c4..61beaa09b 100644 --- a/src/st/st-container.c +++ b/src/st/st-container.c @@ -30,37 +30,6 @@ G_DEFINE_ABSTRACT_TYPE (StContainer, st_container, ST_TYPE_WIDGET); -static gboolean -st_container_get_paint_volume (ClutterActor *actor, - ClutterPaintVolume *volume) -{ - if (!CLUTTER_ACTOR_CLASS (st_container_parent_class)->get_paint_volume (actor, volume)) - return FALSE; - - if (!clutter_actor_get_clip_to_allocation (actor)) - { - ClutterActor *child; - - /* Based on ClutterGroup/ClutterBox; include the children's - * paint volumes, since they may paint outside our allocation. - */ - for (child = clutter_actor_get_first_child (actor); - child != NULL; - child = clutter_actor_get_next_sibling (child)) - { - const ClutterPaintVolume *child_volume; - - child_volume = clutter_actor_get_transformed_paint_volume (child, actor); - if (!child_volume) - return FALSE; - - clutter_paint_volume_union (volume, child_volume); - } - } - - return TRUE; -} - static void st_container_init (StContainer *container) { @@ -69,7 +38,4 @@ st_container_init (StContainer *container) static void st_container_class_init (StContainerClass *klass) { - ClutterActorClass *actor_class = CLUTTER_ACTOR_CLASS (klass); - - actor_class->get_paint_volume = st_container_get_paint_volume; } diff --git a/src/st/st-widget.c b/src/st/st-widget.c index 5c88cdbf9..6f3a76fda 100644 --- a/src/st/st-widget.c +++ b/src/st/st-widget.c @@ -713,6 +713,26 @@ st_widget_get_paint_volume (ClutterActor *self, clutter_paint_volume_set_width (volume, paint_box.x2 - paint_box.x1); clutter_paint_volume_set_height (volume, paint_box.y2 - paint_box.y1); + if (!clutter_actor_get_clip_to_allocation (self)) + { + ClutterActor *child; + /* Based on ClutterGroup/ClutterBox; include the children's + * paint volumes, since they may paint outside our allocation. + */ + for (child = clutter_actor_get_first_child (self); + child != NULL; + child = clutter_actor_get_next_sibling (child)) + { + const ClutterPaintVolume *child_volume; + + child_volume = clutter_actor_get_transformed_paint_volume (child, self); + if (!child_volume) + return FALSE; + + clutter_paint_volume_union (volume, child_volume); + } + } + return TRUE; }