Load purple.com when hitting ctrl+L.

This is a precursor to popping up an alert box.
This commit is contained in:
Patrick Walton 2013-05-17 10:56:10 -07:00
parent fe9e248c21
commit 8fbd6326d8
5 changed files with 61 additions and 8 deletions

View file

@ -17,8 +17,9 @@ use geom::rect::Rect;
use geom::size::Size2D; use geom::size::Size2D;
use gfx::compositor::{Compositor, LayerBuffer, LayerBufferSet}; use gfx::compositor::{Compositor, LayerBuffer, LayerBufferSet};
use gfx::opts::Opts; use gfx::opts::Opts;
use layers::layers::{Image, ImageData};
use layers; use layers;
use servo_util::time; use servo_util::{time, url};
mod resize_rate_limiter; mod resize_rate_limiter;
@ -97,7 +98,7 @@ fn mainloop(po: Port<Msg>, script_chan: SharedChan<ScriptMsg>, opts: &Opts) {
0, 0,
layers::layers::RGB24Format, layers::layers::RGB24Format,
~[]); ~[]);
let image = @mut layers::layers::Image::new(image_data as @layers::layers::ImageData); let image = @mut Image::new(image_data as @ImageData);
let image_layer = @mut layers::layers::ImageLayer(image); let image_layer = @mut layers::layers::ImageLayer(image);
original_layer_transform = image_layer.common.transform; original_layer_transform = image_layer.common.transform;
image_layer.common.set_transform(original_layer_transform.scale(800.0, 600.0, 1.0)); image_layer.common.set_transform(original_layer_transform.scale(800.0, 600.0, 1.0));
@ -141,7 +142,7 @@ fn mainloop(po: Port<Msg>, script_chan: SharedChan<ScriptMsg>, opts: &Opts) {
data_source_surface: buffer.draw_target.snapshot().get_data_surface(), data_source_surface: buffer.draw_target.snapshot().get_data_surface(),
size: Size2D(width, height) size: Size2D(width, height)
}; };
let image = @mut layers::layers::Image::new(image_data as @layers::layers::ImageData); let image = @mut Image::new(image_data as @ImageData);
// Find or create an image layer. // Find or create an image layer.
let image_layer; let image_layer;
@ -192,6 +193,7 @@ fn mainloop(po: Port<Msg>, script_chan: SharedChan<ScriptMsg>, opts: &Opts) {
window.present(); window.present();
} }
// 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); resize_rate_limiter.window_resized(width, height);

View file

@ -7,7 +7,8 @@
/// GLUT is a very old and bare-bones toolkit. However, it has good cross-platform support, at /// GLUT is a very old and bare-bones toolkit. However, it has good cross-platform support, at
/// least on desktops. It is designed for testing Servo without the need of a UI. /// least on desktops. It is designed for testing Servo without the need of a UI.
use windowing::{ApplicationMethods, CompositeCallback, ResizeCallback, WindowMethods}; use windowing::{ApplicationMethods, CompositeCallback, LoadUrlCallback, ResizeCallback};
use windowing::{WindowMethods};
use geom::size::Size2D; use geom::size::Size2D;
use glut::glut::{DOUBLE, WindowHeight, WindowWidth}; use glut::glut::{DOUBLE, WindowHeight, WindowWidth};
@ -27,8 +28,10 @@ impl ApplicationMethods for Application {
/// The type of a window. /// The type of a window.
pub struct Window { pub struct Window {
glut_window: glut::Window, glut_window: glut::Window,
composite_callback: Option<CompositeCallback>, composite_callback: Option<CompositeCallback>,
resize_callback: Option<ResizeCallback>, resize_callback: Option<ResizeCallback>,
load_url_callback: Option<LoadUrlCallback>,
} }
impl WindowMethods<Application> for Window { impl WindowMethods<Application> for Window {
@ -41,8 +44,10 @@ impl WindowMethods<Application> for Window {
// Create our window object. // Create our window object.
let window = @mut Window { let window = @mut Window {
glut_window: glut_window, glut_window: glut_window,
composite_callback: None, composite_callback: None,
resize_callback: None, resize_callback: None,
load_url_callback: None,
}; };
// Register event handlers. // Register event handlers.
@ -51,14 +56,17 @@ impl WindowMethods<Application> for Window {
None => {} None => {}
Some(callback) => callback(width as uint, height as uint), Some(callback) => callback(width as uint, height as uint),
} }
}; }
do glut::display_func { do glut::display_func {
// FIXME(pcwalton): This will not work with multiple windows. // FIXME(pcwalton): This will not work with multiple windows.
match window.composite_callback { match window.composite_callback {
None => {} None => {}
Some(callback) => callback(), Some(callback) => callback(),
} }
}; }
do glut::keyboard_func |key, _, _| {
window.handle_key(key)
}
window window
} }
@ -84,9 +92,32 @@ impl WindowMethods<Application> for Window {
self.resize_callback = Some(new_resize_callback) self.resize_callback = Some(new_resize_callback)
} }
/// Registers a callback to be run when a new URL is to be loaded.
pub fn set_load_url_callback(&mut self, new_load_url_callback: LoadUrlCallback) {
self.load_url_callback = Some(new_load_url_callback)
}
/// Spins the event loop. /// Spins the event loop.
pub fn check_loop(@mut self) { pub fn check_loop(@mut self) {
glut::check_loop() glut::check_loop()
} }
} }
impl Window {
/// Helper function to handle keyboard events.
fn handle_key(&self, key: u8) {
debug!("got key: %d", key as int);
if key == 12 { // ^L
self.load_url()
}
}
/// Helper function to pop up an alert box prompting the user to load a URL.
fn load_url(&self) {
match self.load_url_callback {
None => error!("no URL callback registered, doing nothing"),
Some(callback) => callback("http://purple.com/"),
}
}
}

View file

@ -11,7 +11,7 @@
/// along with the Servo process or trusted. If the OpenGL driver itself is untrusted, then this /// along with the Servo process or trusted. If the OpenGL driver itself is untrusted, then this
/// windowing implementation is not appropriate. /// windowing implementation is not appropriate.
use windowing::{CompositeCallback, ResizeCallback}; use windowing::{CompositeCallback, LoadUrlCallback, ResizeCallback};
use geom::size::Size2D; use geom::size::Size2D;
use sharegl::base::ShareContext; use sharegl::base::ShareContext;
@ -53,6 +53,9 @@ impl WindowingMethods<Application> for Window {
/// Registers a callback to run when a resize event occurs. /// Registers a callback to run when a resize event occurs.
pub fn set_resize_callback(&mut self, _: ResizeCallback) {} pub fn set_resize_callback(&mut self, _: ResizeCallback) {}
/// Registers a callback to run when a new URL is to be loaded.
pub fn set_load_url_callback(&mut self, _: LoadUrlCallback) {}
/// Returns the next event. /// Returns the next event.
pub fn check_loop(@mut self) {} pub fn check_loop(@mut self) {}
} }

View file

@ -121,8 +121,11 @@ pub struct ScriptContext {
js_context: @Cx, js_context: @Cx,
/// The JavaScript compartment. /// The JavaScript compartment.
js_compartment: @mut Compartment, js_compartment: @mut Compartment,
/// Global static data related to the DOM. /// Global static data related to the DOM.
dom_static: GlobalStaticData, dom_static: GlobalStaticData,
/// Whether the JS bindings have been initialized.
bindings_initialized: bool,
/// The outermost frame. This frame contains the document, window, and page URL. /// The outermost frame. This frame contains the document, window, and page URL.
root_frame: Option<Frame>, root_frame: Option<Frame>,
@ -189,7 +192,9 @@ impl ScriptContext {
js_runtime: js_runtime, js_runtime: js_runtime,
js_context: js_context, js_context: js_context,
js_compartment: compartment, js_compartment: compartment,
dom_static: GlobalStaticData(), dom_static: GlobalStaticData(),
bindings_initialized: false,
root_frame: None, root_frame: None,
@ -287,7 +292,12 @@ impl ScriptContext {
/// objects, parses HTML and CSS, and kicks off initial layout. /// objects, parses HTML and CSS, and kicks off initial layout.
fn load(&mut self, url: Url) { fn load(&mut self, url: Url) {
// Define the script DOM bindings. // Define the script DOM bindings.
//
// FIXME: Can this be done earlier, to save the flag?
if !self.bindings_initialized {
define_bindings(self.js_compartment); define_bindings(self.js_compartment);
self.bindings_initialized = true
}
// Parse HTML. // Parse HTML.
// //

View file

@ -12,6 +12,9 @@ pub type CompositeCallback = @fn();
/// Type of the function that is called when the window is resized. /// Type of the function that is called when the window is resized.
pub type ResizeCallback = @fn(uint, uint); pub type ResizeCallback = @fn(uint, uint);
/// Type of the function that is called when a new URL is to be loaded.
pub type LoadUrlCallback = @fn(&str);
/// Methods for an abstract Application. /// Methods for an abstract Application.
pub trait ApplicationMethods { pub trait ApplicationMethods {
fn new() -> Self; fn new() -> Self;
@ -24,10 +27,14 @@ pub trait WindowMethods<A> {
pub fn size(&self) -> Size2D<f32>; pub fn size(&self) -> Size2D<f32>;
/// Presents the window to the screen (perhaps by page flipping). /// Presents the window to the screen (perhaps by page flipping).
pub fn present(&mut self); pub fn present(&mut self);
/// Registers a callback to run when a composite event occurs. /// Registers a callback to run when a composite event occurs.
pub fn set_composite_callback(&mut self, new_composite_callback: CompositeCallback); pub fn set_composite_callback(&mut self, new_composite_callback: CompositeCallback);
/// Registers a callback to run when a resize event occurs. /// Registers a callback to run when a resize event occurs.
pub fn set_resize_callback(&mut self, new_resize_callback: ResizeCallback); pub fn set_resize_callback(&mut self, new_resize_callback: ResizeCallback);
/// Registers a callback to run when a new URL is to be loaded.
pub fn set_load_url_callback(&mut self, new_load_url_callback: LoadUrlCallback);
/// Spins the event loop. /// Spins the event loop.
pub fn check_loop(@mut self); pub fn check_loop(@mut self);
} }