diff --git a/src/components/main/compositing/compositor.rs b/src/components/main/compositing/compositor.rs index ba31356978d..2f3d399d885 100644 --- a/src/components/main/compositing/compositor.rs +++ b/src/components/main/compositing/compositor.rs @@ -13,7 +13,7 @@ use windowing::{WindowEvent, WindowMethods, IdleWindowEvent, RefreshWindowEvent, ResizeWindowEvent, LoadUrlWindowEvent, MouseWindowEventClass,ScrollWindowEvent, ZoomWindowEvent, NavigationWindowEvent, FinishedWindowEvent, QuitWindowEvent, - MouseWindowEvent, MouseWindowClickEvent, MouseWindowMouseDownEvent, MouseWindowMouseUpEvent}; + MouseWindowEvent, MouseWindowClickEvent, MouseWindowMouseDownEvent, MouseWindowMouseUpEvent, MouseMoveEventClass}; use azure::azure_hl::{SourceSurfaceMethods, Color}; @@ -515,6 +515,10 @@ impl IOCompositor { self.on_mouse_window_event_class(mouse_window_event); } + MouseMoveEventClass(cursor) => { + self.on_mouse_window_move_event_class(cursor); + } + ScrollWindowEvent(delta, cursor) => { self.on_scroll_window_event(delta, cursor); } @@ -579,6 +583,12 @@ impl IOCompositor { } } + fn on_mouse_window_move_event_class(&self, cursor: Point2D) { + for layer in self.compositor_layer.iter() { + layer.send_mouse_move_event(cursor); + } + } + fn on_scroll_window_event(&mut self, delta: Point2D, cursor: Point2D) { let world_zoom = self.world_zoom; // TODO: modify delta to snap scroll to pixels. diff --git a/src/components/main/compositing/compositor_layer.rs b/src/components/main/compositing/compositor_layer.rs index a04638dd09e..6abb6b4fc9c 100644 --- a/src/components/main/compositing/compositor_layer.rs +++ b/src/components/main/compositing/compositor_layer.rs @@ -18,7 +18,7 @@ use layers::platform::surface::{NativeCompositingGraphicsContext, NativeSurfaceM use layers::texturegl::{Texture, TextureTarget}; #[cfg(target_os="macos")] use layers::texturegl::TextureTargetRectangle; use pipeline::CompositionPipeline; -use script::dom::event::{ClickEvent, MouseDownEvent, MouseUpEvent}; +use script::dom::event::{ClickEvent, MouseDownEvent, MouseUpEvent, MouseMoveEvent}; use script::script_task::SendEventMsg; use servo_msg::compositor_msg::{LayerBuffer, LayerBufferSet, Epoch, Tile}; use servo_msg::constellation_msg::PipelineId; @@ -251,7 +251,12 @@ impl CompositorLayer { self.pipeline.script_chan.send(SendEventMsg(self.pipeline.id.clone(), message)); } - + + pub fn send_mouse_move_event(&self, cursor: Point2D) { + let message = MouseMoveEvent(cursor); + self.pipeline.script_chan.send(SendEventMsg(self.pipeline.id.clone(), message)); + } + // Given the current window size, determine which tiles need to be (re)rendered // and sends them off the the appropriate renderer. // Returns a bool that is true if the scene should be repainted. diff --git a/src/components/main/platform/common/glfw_windowing.rs b/src/components/main/platform/common/glfw_windowing.rs index 2a863c0e1cd..1c851222397 100644 --- a/src/components/main/platform/common/glfw_windowing.rs +++ b/src/components/main/platform/common/glfw_windowing.rs @@ -7,7 +7,7 @@ use windowing::{ApplicationMethods, WindowEvent, WindowMethods}; use windowing::{IdleWindowEvent, ResizeWindowEvent, LoadUrlWindowEvent, MouseWindowEventClass}; use windowing::{ScrollWindowEvent, ZoomWindowEvent, NavigationWindowEvent, FinishedWindowEvent}; -use windowing::{QuitWindowEvent, MouseWindowClickEvent, MouseWindowMouseDownEvent, MouseWindowMouseUpEvent}; +use windowing::{QuitWindowEvent, MouseWindowClickEvent, MouseWindowMouseDownEvent, MouseWindowMouseUpEvent, MouseMoveEventClass}; use windowing::RefreshWindowEvent; use windowing::{Forward, Back}; @@ -156,6 +156,10 @@ impl WindowMethods for Window { local_window().handle_mouse(button, action, x as i32, y as i32); } })); + window.glfw_window.set_cursor_pos_callback( + glfw_callback!(glfw::CursorPosCallback(win: &glfw::Window, xpos: f64, ypos: f64) { + local_window().event_queue.push(MouseMoveEventClass(Point2D(xpos as f32, ypos as f32))); + })); window.glfw_window.set_scroll_callback( glfw_callback!(glfw::ScrollCallback(win: &glfw::Window, xpos: f64, ypos: f64) { let dx = (xpos as f32) * 30.0; diff --git a/src/components/main/windowing.rs b/src/components/main/windowing.rs index 85e8d63f16c..4cada3ac3e3 100644 --- a/src/components/main/windowing.rs +++ b/src/components/main/windowing.rs @@ -34,6 +34,8 @@ pub enum WindowEvent { LoadUrlWindowEvent(~str), /// Sent when a mouse hit test is to be performed. MouseWindowEventClass(MouseWindowEvent), + /// Sent when a mouse move. + MouseMoveEventClass(Point2D), /// Sent when the user scrolls. Includes the current cursor position. ScrollWindowEvent(Point2D, Point2D), /// Sent when the user zooms. diff --git a/src/components/script/dom/event.rs b/src/components/script/dom/event.rs index f2124ea37d9..d6edf098195 100644 --- a/src/components/script/dom/event.rs +++ b/src/components/script/dom/event.rs @@ -21,6 +21,7 @@ pub enum Event_ { ClickEvent(uint, Point2D), MouseDownEvent(uint, Point2D), MouseUpEvent(uint, Point2D), + MouseMoveEvent(Point2D) } pub struct AbstractEvent { diff --git a/src/components/script/script_task.rs b/src/components/script/script_task.rs index 790f471e895..e7f00045582 100644 --- a/src/components/script/script_task.rs +++ b/src/components/script/script_task.rs @@ -9,7 +9,7 @@ use dom::bindings::codegen::RegisterBindings; use dom::bindings::utils::{Reflectable, GlobalStaticData}; use dom::document::AbstractDocument; use dom::element::Element; -use dom::event::{Event_, ResizeEvent, ReflowEvent, ClickEvent, MouseDownEvent, MouseUpEvent}; +use dom::event::{Event_, ResizeEvent, ReflowEvent, ClickEvent, MouseDownEvent, MouseUpEvent, MouseMoveEvent}; use dom::event::Event; use dom::eventtarget::AbstractEventTarget; use dom::htmldocument::HTMLDocument; @@ -882,6 +882,7 @@ impl ScriptTask { } MouseDownEvent(..) => {} MouseUpEvent(..) => {} + MouseMoveEvent(point) => {} } }