aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorbors-servo <release+servo@mozilla.com>2013-08-27 15:09:58 -0700
committerbors-servo <release+servo@mozilla.com>2013-08-27 15:09:58 -0700
commit3f2969cfa89b7d89dad26ba29fb63fe16feb9eeb (patch)
tree62a244e250f20438832497c571f436b3d7ea6c79 /src
parent4e68c1a4f76a50fe0b721d3fddcd8eb15c1bfae0 (diff)
parente84c1274005b1a74f6ddc2f74cd2175fc4ebb6f9 (diff)
downloadservo-3f2969cfa89b7d89dad26ba29fb63fe16feb9eeb.tar.gz
servo-3f2969cfa89b7d89dad26ba29fb63fe16feb9eeb.zip
auto merge of #801 : eschweic/servo/comp-fixed-pos, r=metajack
Some changes that need to happen for #782.
Diffstat (limited to 'src')
-rw-r--r--src/components/main/compositing/compositor_layer.rs63
1 files changed, 41 insertions, 22 deletions
diff --git a/src/components/main/compositing/compositor_layer.rs b/src/components/main/compositing/compositor_layer.rs
index 53403578187..e1a5324ef3e 100644
--- a/src/components/main/compositing/compositor_layer.rs
+++ b/src/components/main/compositing/compositor_layer.rs
@@ -47,6 +47,8 @@ pub struct CompositorLayer {
/// A monotonically increasing counter that keeps track of the current epoch.
/// add_buffer() calls that don't match the current epoch will be ignored.
epoch: Epoch,
+ /// The behavior of this layer when a scroll message is received.
+ scroll_behavior: ScrollBehavior,
}
/// Helper struct for keeping CompositorLayer children organized.
@@ -65,6 +67,16 @@ enum MaybeQuadtree {
NoTree(uint, Option<uint>),
}
+/// Determines the behavior of the layer when a scroll message is recieved.
+enum ScrollBehavior {
+ /// Normal scrolling behavior.
+ Scroll,
+ /// Scrolling messages targeted at this layer are ignored, but can be
+ /// passed on to child layers.
+ FixedPosition,
+}
+
+
impl CompositorLayer {
/// Creates a new CompositorLayer with an optional page size. If no page size is given,
/// the layer is initially hidden and initialized without a quadtree.
@@ -85,6 +97,7 @@ impl CompositorLayer {
root_layer: @mut ContainerLayer(),
hidden: true,
epoch: Epoch(0),
+ scroll_behavior: Scroll,
}
}
@@ -141,29 +154,35 @@ impl CompositorLayer {
}
}
- // Scroll this layer!
- let old_origin = self.scroll_offset;
- self.scroll_offset = self.scroll_offset + delta;
-
- // bounds checking
- let page_size = match self.page_size {
- Some(size) => size,
- None => fail!("CompositorLayer: tried to scroll with no page size set"),
- };
- let min_x = (window_size.width - page_size.width).min(&0.0);
- self.scroll_offset.x = self.scroll_offset.x.clamp(&min_x, &0.0);
- let min_y = (window_size.height - page_size.height).min(&0.0);
- self.scroll_offset.y = self.scroll_offset.y.clamp(&min_y, &0.0);
-
- // check to see if we scrolled
- if old_origin - self.scroll_offset == Point2D(0f32, 0f32) {
- return false;
- }
+ // This scroll event is mine!
+ match self.scroll_behavior {
+ Scroll => {
+ // Scroll this layer!
+ let old_origin = self.scroll_offset;
+ self.scroll_offset = self.scroll_offset + delta;
- self.root_layer.common.set_transform(identity().translate(self.scroll_offset.x,
- self.scroll_offset.y,
- 0.0));
- true
+ // bounds checking
+ let page_size = match self.page_size {
+ Some(size) => size,
+ None => fail!("CompositorLayer: tried to scroll with no page size set"),
+ };
+ let min_x = (window_size.width - page_size.width).min(&0.0);
+ self.scroll_offset.x = self.scroll_offset.x.clamp(&min_x, &0.0);
+ let min_y = (window_size.height - page_size.height).min(&0.0);
+ self.scroll_offset.y = self.scroll_offset.y.clamp(&min_y, &0.0);
+
+ // check to see if we scrolled
+ if old_origin - self.scroll_offset == Point2D(0f32, 0f32) {
+ return false;
+ }
+
+ self.root_layer.common.set_transform(identity().translate(self.scroll_offset.x,
+ self.scroll_offset.y,
+ 0.0));
+ true
+ }
+ FixedPosition => false, // Ignore this scroll event.
+ }
}
// Takes in a MouseWindowEvent, determines if it should be passed to children, and