[gnome-shell] StBoxLayout: report correct paint volume when scrolled
- From: Owen Taylor <otaylor src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gnome-shell] StBoxLayout: report correct paint volume when scrolled
- Date: Mon, 29 Nov 2010 16:25:49 +0000 (UTC)
commit d870fef12284d3d2b988c18a4115d8f5ba3b1458
Author: Owen W. Taylor <otaylor fishsoup net>
Date: Sat Nov 13 09:08:03 2010 -0500
StBoxLayout: report correct paint volume when scrolled
When scrolled, st_box_layout_apply_transform() includes the scroll
offset and affects paint volumes. This is right for our children, but
our paint volume is determined by our allocation and borders and
doesn't scroll, so we need to reverse-compensate, the same as we do
when painting.
https://bugzilla.gnome.org/show_bug.cgi?id=630932
src/st/st-box-layout.c | 79 +++++++++++++++++++++++++++++++++--------------
1 files changed, 55 insertions(+), 24 deletions(-)
---
diff --git a/src/st/st-box-layout.c b/src/st/st-box-layout.c
index 3a912fa..ae26cd7 100644
--- a/src/st/st-box-layout.c
+++ b/src/st/st-box-layout.c
@@ -876,29 +876,39 @@ st_box_layout_apply_transform (ClutterActor *a,
cogl_matrix_translate (m, (int) -x, (int) -y, 0);
}
+/* If we are translated, then we need to translate back before chaining
+ * up or the background and borders will be drawn in the wrong place */
+static void
+get_border_paint_offsets (StBoxLayout *self,
+ double *x,
+ double *y)
+{
+ StBoxLayoutPrivate *priv = self->priv;
+
+ if (priv->hadjustment)
+ *x = st_adjustment_get_value (priv->hadjustment);
+ else
+ *x = 0;
+
+ if (priv->vadjustment)
+ *y = st_adjustment_get_value (priv->vadjustment);
+ else
+ *y = 0;
+}
+
static void
st_box_layout_paint (ClutterActor *actor)
{
- StBoxLayoutPrivate *priv = ST_BOX_LAYOUT (actor)->priv;
+ StBoxLayout *self = ST_BOX_LAYOUT (actor);
+ StBoxLayoutPrivate *priv = self->priv;
StThemeNode *theme_node = st_widget_get_theme_node (ST_WIDGET (actor));
GList *l, *children;
gdouble x, y;
ClutterActorBox allocation_box;
ClutterActorBox content_box;
- if (priv->hadjustment)
- x = st_adjustment_get_value (priv->hadjustment);
- else
- x = 0;
-
- if (priv->vadjustment)
- y = st_adjustment_get_value (priv->vadjustment);
- else
- y = 0;
-
- /* If we are translated, then we need to translate back before chaining
- * up or the background and borders will be drawn in the wrong place */
+ get_border_paint_offsets (self, &x, &y);
if (x != 0 || y != 0)
{
cogl_push_matrix ();
@@ -950,23 +960,15 @@ static void
st_box_layout_pick (ClutterActor *actor,
const ClutterColor *color)
{
- StBoxLayoutPrivate *priv = ST_BOX_LAYOUT (actor)->priv;
+ StBoxLayout *self = ST_BOX_LAYOUT (actor);
+ StBoxLayoutPrivate *priv = self->priv;
StThemeNode *theme_node = st_widget_get_theme_node (ST_WIDGET (actor));
GList *l, *children;
gdouble x, y;
ClutterActorBox allocation_box;
ClutterActorBox content_box;
- if (priv->hadjustment)
- x = st_adjustment_get_value (priv->hadjustment);
- else
- x = 0;
-
- if (priv->vadjustment)
- y = st_adjustment_get_value (priv->vadjustment);
- else
- y = 0;
-
+ get_border_paint_offsets (self, &x, &y);
if (x != 0 || y != 0)
{
cogl_push_matrix ();
@@ -1011,6 +1013,34 @@ st_box_layout_pick (ClutterActor *actor,
cogl_clip_pop ();
}
+static gboolean
+st_box_layout_get_paint_volume (ClutterActor *actor,
+ ClutterPaintVolume *volume)
+{
+ StBoxLayout *self = ST_BOX_LAYOUT (actor);
+ gdouble x, y;
+
+ CLUTTER_ACTOR_CLASS (st_box_layout_parent_class)->get_paint_volume (actor, volume);
+
+ /* When scrolled, st_box_layout_apply_transform() includes the scroll offset
+ * and affects paint volumes. This is right for our children, but our paint volume
+ * is determined by our allocation and borders and doesn't scroll, so we need
+ * to reverse-compensate here, the same as we do when painting.
+ */
+ 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;
+ clutter_paint_volume_set_origin (volume, &origin);
+ }
+
+ return TRUE;
+}
+
static void
st_box_layout_style_changed (StWidget *self)
{
@@ -1047,6 +1077,7 @@ st_box_layout_class_init (StBoxLayoutClass *klass)
actor_class->apply_transform = st_box_layout_apply_transform;
actor_class->paint = st_box_layout_paint;
+ actor_class->get_paint_volume = st_box_layout_get_paint_volume;
actor_class->pick = st_box_layout_pick;
widget_class->style_changed = st_box_layout_style_changed;
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]