mirror of
https://github.com/servo/servo.git
synced 2025-08-05 21:50:18 +01:00
Clamp scrolling to the page boundaries
This commit is contained in:
parent
2d1a00c3cf
commit
67eb533fc6
1 changed files with 29 additions and 7 deletions
|
@ -10,6 +10,7 @@ use windowing::{ApplicationMethods, WindowMethods};
|
||||||
use azure::azure_hl::{DataSourceSurface, DrawTarget, SourceSurfaceMethods};
|
use azure::azure_hl::{DataSourceSurface, DrawTarget, SourceSurfaceMethods};
|
||||||
use core::cell::Cell;
|
use core::cell::Cell;
|
||||||
use core::comm::{Chan, SharedChan, Port};
|
use core::comm::{Chan, SharedChan, Port};
|
||||||
|
use core::num::Orderable;
|
||||||
use core::util;
|
use core::util;
|
||||||
use geom::matrix::identity;
|
use geom::matrix::identity;
|
||||||
use geom::point::Point2D;
|
use geom::point::Point2D;
|
||||||
|
@ -119,6 +120,8 @@ fn run_main_loop(port: Port<Msg>,
|
||||||
// applied to the layers themselves on a per-layer basis. However, this won't work until scroll
|
// applied to the layers themselves on a per-layer basis. However, this won't work until scroll
|
||||||
// positions are sent to content.
|
// positions are sent to content.
|
||||||
let world_offset = @mut Point2D(0f32, 0f32);
|
let world_offset = @mut Point2D(0f32, 0f32);
|
||||||
|
let page_size = @mut Size2D(0f32, 0f32);
|
||||||
|
let window_size = @mut Size2D(800, 600);
|
||||||
|
|
||||||
let check_for_messages: @fn() = || {
|
let check_for_messages: @fn() = || {
|
||||||
// Periodically check if the script task responded to our last resize event
|
// Periodically check if the script task responded to our last resize event
|
||||||
|
@ -136,8 +139,11 @@ fn run_main_loop(port: Port<Msg>,
|
||||||
// Iterate over the children of the container layer.
|
// Iterate over the children of the container layer.
|
||||||
let mut current_layer_child = root_layer.first_child;
|
let mut current_layer_child = root_layer.first_child;
|
||||||
|
|
||||||
// Replace the image layer data with the buffer data.
|
// Replace the image layer data with the buffer data. Also compute the page
|
||||||
|
// size here.
|
||||||
let buffers = util::replace(&mut new_layer_buffer_set.buffers, ~[]);
|
let buffers = util::replace(&mut new_layer_buffer_set.buffers, ~[]);
|
||||||
|
let mut (page_width, page_height) = (0.0f32, 0.0f32);
|
||||||
|
|
||||||
for buffers.each |buffer| {
|
for buffers.each |buffer| {
|
||||||
let width = buffer.rect.size.width as uint;
|
let width = buffer.rect.size.width as uint;
|
||||||
let height = buffer.rect.size.height as uint;
|
let height = buffer.rect.size.height as uint;
|
||||||
|
@ -172,9 +178,14 @@ fn run_main_loop(port: Port<Msg>,
|
||||||
Some(_) => fail!(~"found unexpected layer kind"),
|
Some(_) => fail!(~"found unexpected layer kind"),
|
||||||
};
|
};
|
||||||
|
|
||||||
|
let origin = buffer.rect.origin;
|
||||||
|
let origin = Point2D(origin.x as f32, origin.y as f32);
|
||||||
|
|
||||||
|
// Update the page width and height calculations.
|
||||||
|
page_width = page_width.max(&(origin.x + (width as f32)));
|
||||||
|
page_height = page_height.max(&(origin.y + (height as f32)));
|
||||||
|
|
||||||
// Set the layer's transform.
|
// Set the layer's transform.
|
||||||
let origin = Point2D(buffer.rect.origin.x as f32,
|
|
||||||
buffer.rect.origin.y as f32);
|
|
||||||
let transform = original_layer_transform.translate(origin.x,
|
let transform = original_layer_transform.translate(origin.x,
|
||||||
origin.y,
|
origin.y,
|
||||||
0.0);
|
0.0);
|
||||||
|
@ -182,6 +193,8 @@ fn run_main_loop(port: Port<Msg>,
|
||||||
image_layer.common.set_transform(transform)
|
image_layer.common.set_transform(transform)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
*page_size = Size2D(page_width, page_height)
|
||||||
|
|
||||||
// TODO: Recycle the old buffers; send them back to the renderer to reuse if
|
// TODO: Recycle the old buffers; send them back to the renderer to reuse if
|
||||||
// it wishes.
|
// it wishes.
|
||||||
}
|
}
|
||||||
|
@ -205,7 +218,8 @@ fn run_main_loop(port: Port<Msg>,
|
||||||
// Hook the windowing system's resize callback up to the resize rate limiter.
|
// Hook the windowing system's resize callback up to the resize rate limiter.
|
||||||
do window.set_resize_callback |width, height| {
|
do window.set_resize_callback |width, height| {
|
||||||
debug!("osmain: window resized to %ux%u", width, height);
|
debug!("osmain: window resized to %ux%u", width, height);
|
||||||
resize_rate_limiter.window_resized(width, height);
|
*window_size = Size2D(width, height);
|
||||||
|
resize_rate_limiter.window_resized(width, height)
|
||||||
}
|
}
|
||||||
|
|
||||||
// When the user enters a new URL, load it.
|
// When the user enters a new URL, load it.
|
||||||
|
@ -216,13 +230,21 @@ fn run_main_loop(port: Port<Msg>,
|
||||||
|
|
||||||
// When the user scrolls, move the layer around.
|
// When the user scrolls, move the layer around.
|
||||||
do window.set_scroll_callback |delta| {
|
do window.set_scroll_callback |delta| {
|
||||||
// FIXME (Rust #2528): Can't use `+=`.
|
// FIXME (Rust #2528): Can't use `-=`.
|
||||||
let world_offset_copy = *world_offset;
|
let world_offset_copy = *world_offset;
|
||||||
*world_offset = world_offset_copy + delta;
|
*world_offset = world_offset_copy - delta;
|
||||||
|
|
||||||
|
// Clamp the world offset to the screen size.
|
||||||
|
let max_x = (page_size.width - window_size.width as f32).max(&0.0);
|
||||||
|
world_offset.x = world_offset.x.clamp(&0.0, &max_x);
|
||||||
|
let max_y = (page_size.height - window_size.height as f32).max(&0.0);
|
||||||
|
world_offset.y = world_offset.y.clamp(&0.0, &max_y);
|
||||||
|
|
||||||
debug!("compositor: scrolled to %?", *world_offset);
|
debug!("compositor: scrolled to %?", *world_offset);
|
||||||
|
|
||||||
root_layer.common.set_transform(identity().translate(world_offset.x, world_offset.y, 0.0));
|
root_layer.common.set_transform(identity().translate(-world_offset.x,
|
||||||
|
-world_offset.y,
|
||||||
|
0.0));
|
||||||
|
|
||||||
window.set_needs_display()
|
window.set_needs_display()
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue