[gnome-shell] st: Account for children in StWidget's get_paint_volume
- From: Jasper St. Pierre <jstpierre src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gnome-shell] st: Account for children in StWidget's get_paint_volume
- Date: Tue, 28 Feb 2012 13:29:44 +0000 (UTC)
commit be3eb308b9b13ab3bd44589bbf8817c1c0c9ea91
Author: Jasper St. Pierre <jstpierre mecheye net>
Date: Mon Feb 13 15:05:38 2012 -0500
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 19a2d46..86f1388 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 a670111..61beaa0 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 5c88cdb..6f3a76f 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;
}
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]