aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJosh Matthews <josh@joshmatthews.net>2014-10-02 03:11:50 -0400
committerJosh Matthews <josh@joshmatthews.net>2014-11-13 11:24:14 -0500
commit1c64dabb150da4152957b2c6e16f30d5201328e1 (patch)
tree49d29180fe6e536ec817432acc11fb210de00199
parentc5e1b0d32e17fad29799023c85e2e73ac89c3af7 (diff)
downloadservo-1c64dabb150da4152957b2c6e16f30d5201328e1.tar.gz
servo-1c64dabb150da4152957b2c6e16f30d5201328e1.zip
Pass all key events to the current constellation frame.
-rw-r--r--components/compositing/compositor.rs13
-rw-r--r--components/compositing/constellation.rs15
-rw-r--r--components/compositing/windowing.rs4
-rw-r--r--components/msg/constellation_msg.rs132
-rw-r--r--components/script/script_task.rs8
-rw-r--r--components/script_traits/lib.rs5
-rw-r--r--ports/glfw/window.rs136
7 files changed, 304 insertions, 9 deletions
diff --git a/components/compositing/compositor.rs b/components/compositing/compositor.rs
index 95714929ad2..738d5abab0a 100644
--- a/components/compositing/compositor.rs
+++ b/components/compositing/compositor.rs
@@ -19,7 +19,7 @@ use windowing::{MouseWindowEvent, MouseWindowEventClass, MouseWindowMouseDownEve
use windowing::{MouseWindowMouseUpEvent, MouseWindowMoveEventClass, NavigationWindowEvent};
use windowing::{QuitWindowEvent, RefreshWindowEvent, ResizeWindowEvent, ScrollWindowEvent};
use windowing::{WindowEvent, WindowMethods, WindowNavigateMsg, ZoomWindowEvent};
-use windowing::{PinchZoomWindowEvent};
+use windowing::{PinchZoomWindowEvent, KeyEvent};
use azure::azure_hl;
use std::cmp;
@@ -43,7 +43,7 @@ use servo_msg::compositor_msg::{Blank, Epoch, FinishedLoading, IdleRenderState,
use servo_msg::compositor_msg::{ReadyState, RenderingRenderState, RenderState, Scrollable};
use servo_msg::constellation_msg::{ConstellationChan, ExitMsg, LoadUrlMsg};
use servo_msg::constellation_msg::{NavigateMsg, LoadData, PipelineId, ResizedWindowMsg};
-use servo_msg::constellation_msg::{WindowSizeData};
+use servo_msg::constellation_msg::{WindowSizeData, KeyState, Key};
use servo_msg::constellation_msg;
use servo_util::geometry::{PagePx, ScreenPx, ViewportPx};
use servo_util::memory::MemoryProfilerChan;
@@ -707,6 +707,10 @@ impl<Window: WindowMethods> IOCompositor<Window> {
self.on_navigation_window_event(direction);
}
+ KeyEvent(key, state) => {
+ self.on_key_event(key, state);
+ }
+
FinishedWindowEvent => {
let exit = opts::get().exit_after_load;
if exit {
@@ -878,6 +882,11 @@ impl<Window: WindowMethods> IOCompositor<Window> {
chan.send(NavigateMsg(direction))
}
+ fn on_key_event(&self, key: Key, state: KeyState) {
+ let ConstellationChan(ref chan) = self.constellation_chan;
+ chan.send(constellation_msg::KeyEvent(key, state))
+ }
+
fn convert_buffer_requests_to_pipeline_requests_map(&self,
requests: Vec<(Rc<Layer<CompositorData>>,
Vec<BufferRequest>)>) ->
diff --git a/components/compositing/constellation.rs b/components/compositing/constellation.rs
index 7506d64b870..096bc76870e 100644
--- a/components/compositing/constellation.rs
+++ b/components/compositing/constellation.rs
@@ -13,7 +13,8 @@ use gfx::render_task;
use layers::geometry::DevicePixel;
use layout_traits::{LayoutControlChan, LayoutTaskFactory, ExitNowMsg};
use libc;
-use script_traits::{ResizeMsg, ResizeInactiveMsg, ExitPipelineMsg};
+use script_traits;
+use script_traits::{ResizeMsg, ResizeInactiveMsg, ExitPipelineMsg, SendEventMsg};
use script_traits::{ScriptControlChan, ScriptTaskFactory};
use servo_msg::compositor_msg::LayerId;
use servo_msg::constellation_msg::{ConstellationChan, ExitMsg, FailureMsg, Failure, FrameRectMsg};
@@ -21,6 +22,7 @@ use servo_msg::constellation_msg::{IFrameSandboxState, IFrameUnsandboxed, InitLo
use servo_msg::constellation_msg::{LoadCompleteMsg, LoadUrlMsg, LoadData, Msg, NavigateMsg};
use servo_msg::constellation_msg::{NavigationType, PipelineId, RendererReadyMsg, ResizedWindowMsg};
use servo_msg::constellation_msg::{ScriptLoadedURLInIFrameMsg, SubpageId, WindowSizeData};
+use servo_msg::constellation_msg::{KeyEvent, Key, KeyState};
use servo_msg::constellation_msg;
use servo_net::image_cache_task::{ImageCacheTask, ImageCacheTaskClient};
use servo_net::resource_task::ResourceTask;
@@ -450,6 +452,10 @@ impl<LTF: LayoutTaskFactory, STF: ScriptTaskFactory> Constellation<LTF, STF> {
debug!("constellation got window resize message");
self.handle_resized_window_msg(new_size);
}
+ KeyEvent(key, state) => {
+ debug!("constellation got key event message");
+ self.handle_key_msg(key, state);
+ }
}
true
}
@@ -761,6 +767,13 @@ impl<LTF: LayoutTaskFactory, STF: ScriptTaskFactory> Constellation<LTF, STF> {
.any(|current_frame| current_frame.contains(pipeline_id))
}
+ fn handle_key_msg(&self, key: Key, state: KeyState) {
+ self.current_frame().as_ref().map(|frame| {
+ let ScriptControlChan(ref chan) = frame.pipeline.script_chan;
+ chan.send(SendEventMsg(frame.pipeline.id, script_traits::KeyEvent(key, state)));
+ });
+ }
+
fn handle_renderer_ready_msg(&mut self, pipeline_id: PipelineId) {
debug!("Renderer {} ready to send paint msg", pipeline_id);
// This message could originate from a pipeline in the navigation context or
diff --git a/components/compositing/windowing.rs b/components/compositing/windowing.rs
index 5815de6e2b5..c564c34b29a 100644
--- a/components/compositing/windowing.rs
+++ b/components/compositing/windowing.rs
@@ -11,6 +11,7 @@ use geom::scale_factor::ScaleFactor;
use geom::size::TypedSize2D;
use layers::geometry::DevicePixel;
use layers::platform::surface::NativeGraphicsMetadata;
+use servo_msg::constellation_msg::{Key, KeyState};
use servo_msg::compositor_msg::{ReadyState, RenderState};
use servo_util::geometry::ScreenPx;
use std::fmt::{FormatError, Formatter, Show};
@@ -58,6 +59,8 @@ pub enum WindowEvent {
FinishedWindowEvent,
/// Sent when the user quits the application
QuitWindowEvent,
+ /// Sent when a key input state changes
+ KeyEvent(Key, KeyState),
}
impl Show for WindowEvent {
@@ -66,6 +69,7 @@ impl Show for WindowEvent {
IdleWindowEvent => write!(f, "Idle"),
RefreshWindowEvent => write!(f, "Refresh"),
ResizeWindowEvent(..) => write!(f, "Resize"),
+ KeyEvent(..) => write!(f, "Key"),
LoadUrlWindowEvent(..) => write!(f, "LoadUrl"),
MouseWindowEventClass(..) => write!(f, "Mouse"),
MouseWindowMoveEventClass(..) => write!(f, "MouseMove"),
diff --git a/components/msg/constellation_msg.rs b/components/msg/constellation_msg.rs
index e043a04d3fd..40280a89afc 100644
--- a/components/msg/constellation_msg.rs
+++ b/components/msg/constellation_msg.rs
@@ -50,6 +50,137 @@ pub struct WindowSizeData {
pub device_pixel_ratio: ScaleFactor<ViewportPx, DevicePixel, f32>,
}
+pub enum KeyState {
+ Pressed,
+ Released,
+ Repeated,
+}
+
+//N.B. Straight up copied from glfw-rs
+pub enum Key {
+ KeySpace,
+ KeyApostrophe,
+ KeyComma,
+ KeyMinus,
+ KeyPeriod,
+ KeySlash,
+ Key0,
+ Key1,
+ Key2,
+ Key3,
+ Key4,
+ Key5,
+ Key6,
+ Key7,
+ Key8,
+ Key9,
+ KeySemicolon,
+ KeyEqual,
+ KeyA,
+ KeyB,
+ KeyC,
+ KeyD,
+ KeyE,
+ KeyF,
+ KeyG,
+ KeyH,
+ KeyI,
+ KeyJ,
+ KeyK,
+ KeyL,
+ KeyM,
+ KeyN,
+ KeyO,
+ KeyP,
+ KeyQ,
+ KeyR,
+ KeyS,
+ KeyT,
+ KeyU,
+ KeyV,
+ KeyW,
+ KeyX,
+ KeyY,
+ KeyZ,
+ KeyLeftBracket,
+ KeyBackslash,
+ KeyRightBracket,
+ KeyGraveAccent,
+ KeyWorld1,
+ KeyWorld2,
+
+ KeyEscape,
+ KeyEnter,
+ KeyTab,
+ KeyBackspace,
+ KeyInsert,
+ KeyDelete,
+ KeyRight,
+ KeyLeft,
+ KeyDown,
+ KeyUp,
+ KeyPageUp,
+ KeyPageDown,
+ KeyHome,
+ KeyEnd,
+ KeyCapsLock,
+ KeyScrollLock,
+ KeyNumLock,
+ KeyPrintScreen,
+ KeyPause,
+ KeyF1,
+ KeyF2,
+ KeyF3,
+ KeyF4,
+ KeyF5,
+ KeyF6,
+ KeyF7,
+ KeyF8,
+ KeyF9,
+ KeyF10,
+ KeyF11,
+ KeyF12,
+ KeyF13,
+ KeyF14,
+ KeyF15,
+ KeyF16,
+ KeyF17,
+ KeyF18,
+ KeyF19,
+ KeyF20,
+ KeyF21,
+ KeyF22,
+ KeyF23,
+ KeyF24,
+ KeyF25,
+ KeyKp0,
+ KeyKp1,
+ KeyKp2,
+ KeyKp3,
+ KeyKp4,
+ KeyKp5,
+ KeyKp6,
+ KeyKp7,
+ KeyKp8,
+ KeyKp9,
+ KeyKpDecimal,
+ KeyKpDivide,
+ KeyKpMultiply,
+ KeyKpSubtract,
+ KeyKpAdd,
+ KeyKpEnter,
+ KeyKpEqual,
+ KeyLeftShift,
+ KeyLeftControl,
+ KeyLeftAlt,
+ KeyLeftSuper,
+ KeyRightShift,
+ KeyRightControl,
+ KeyRightAlt,
+ KeyRightSuper,
+ KeyMenu,
+}
+
/// Messages from the compositor and script to the constellation.
pub enum Msg {
ExitMsg,
@@ -62,6 +193,7 @@ pub enum Msg {
NavigateMsg(NavigationDirection),
RendererReadyMsg(PipelineId),
ResizedWindowMsg(WindowSizeData),
+ KeyEvent(Key, KeyState),
}
/// Similar to net::resource_task::LoadData
diff --git a/components/script/script_task.rs b/components/script/script_task.rs
index c6f4b636d50..31f3abb289c 100644
--- a/components/script/script_task.rs
+++ b/components/script/script_task.rs
@@ -42,7 +42,7 @@ use script_traits::{CompositorEvent, ResizeEvent, ReflowEvent, ClickEvent, Mouse
use script_traits::{MouseMoveEvent, MouseUpEvent, ConstellationControlMsg, ScriptTaskFactory};
use script_traits::{ResizeMsg, AttachLayoutMsg, LoadMsg, ViewportMsg, SendEventMsg};
use script_traits::{ResizeInactiveMsg, ExitPipelineMsg, NewLayoutInfo, OpaqueScriptLayoutChannel};
-use script_traits::{ScriptControlChan, ReflowCompleteMsg, UntrustedNodeAddress};
+use script_traits::{ScriptControlChan, ReflowCompleteMsg, UntrustedNodeAddress, KeyEvent};
use servo_msg::compositor_msg::{FinishedLoading, LayerId, Loading};
use servo_msg::compositor_msg::{ScriptListener};
use servo_msg::constellation_msg::{ConstellationChan, LoadCompleteMsg, LoadUrlMsg, NavigationDirection};
@@ -907,6 +907,10 @@ impl ScriptTask {
MouseMoveEvent(point) => {
self.handle_mouse_move_event(pipeline_id, point);
}
+
+ KeyEvent(key, state) => {
+ println!("key {} is {}", key as int, state as int);
+ }
}
}
@@ -1093,7 +1097,7 @@ impl ScriptTask {
}
None => {}
- }
+ }
}
}
diff --git a/components/script_traits/lib.rs b/components/script_traits/lib.rs
index beedd0895d3..e0e300307fe 100644
--- a/components/script_traits/lib.rs
+++ b/components/script_traits/lib.rs
@@ -25,7 +25,7 @@ extern crate serialize;
use devtools_traits::DevtoolsControlChan;
use libc::c_void;
use servo_msg::constellation_msg::{ConstellationChan, PipelineId, Failure, WindowSizeData};
-use servo_msg::constellation_msg::{LoadData, SubpageId};
+use servo_msg::constellation_msg::{LoadData, SubpageId, Key, KeyState};
use servo_msg::compositor_msg::ScriptListener;
use servo_net::image_cache_task::ImageCacheTask;
use servo_net::resource_task::ResourceTask;
@@ -74,7 +74,8 @@ pub enum CompositorEvent {
ClickEvent(uint, Point2D<f32>),
MouseDownEvent(uint, Point2D<f32>),
MouseUpEvent(uint, Point2D<f32>),
- MouseMoveEvent(Point2D<f32>)
+ MouseMoveEvent(Point2D<f32>),
+ KeyEvent(Key, KeyState),
}
/// An opaque wrapper around script<->layout channels to avoid leaking message types into
diff --git a/ports/glfw/window.rs b/ports/glfw/window.rs
index ffc2a08497e..bc75c083853 100644
--- a/ports/glfw/window.rs
+++ b/ports/glfw/window.rs
@@ -10,7 +10,7 @@ use alert::{Alert, AlertMethods};
use compositing::compositor_task::{mod, CompositorProxy, CompositorReceiver};
use compositing::windowing::{Forward, Back};
use compositing::windowing::{IdleWindowEvent, ResizeWindowEvent, LoadUrlWindowEvent};
-use compositing::windowing::{MouseWindowClickEvent, MouseWindowMouseDownEvent};
+use compositing::windowing::{KeyEvent, MouseWindowClickEvent, MouseWindowMouseDownEvent};
use compositing::windowing::{MouseWindowEventClass, MouseWindowMoveEventClass};
use compositing::windowing::{MouseWindowMouseUpEvent, RefreshWindowEvent};
use compositing::windowing::{NavigationWindowEvent, ScrollWindowEvent, ZoomWindowEvent};
@@ -25,6 +25,7 @@ use layers::platform::surface::NativeGraphicsMetadata;
use libc::c_int;
use msg::compositor_msg::{FinishedLoading, Blank, Loading, PerformingLayout, ReadyState};
use msg::compositor_msg::{IdleRenderState, RenderState, RenderingRenderState};
+use msg::constellation_msg;
use std::cell::{Cell, RefCell};
use std::comm::Receiver;
use std::rc::Rc;
@@ -207,8 +208,15 @@ impl Window {
match event {
glfw::KeyEvent(key, _, action, mods) => {
if action == glfw::Press {
- self.handle_key(key, mods)
+ self.handle_key(key, mods);
}
+ let key = glfw_key_to_script_key(key);
+ let state = match action {
+ glfw::Press => constellation_msg::Pressed,
+ glfw::Release => constellation_msg::Released,
+ glfw::Repeat => constellation_msg::Repeated,
+ };
+ self.event_queue.borrow_mut().push(KeyEvent(key, state));
},
glfw::FramebufferSizeEvent(width, height) => {
self.event_queue.borrow_mut().push(
@@ -428,3 +436,127 @@ extern "C" fn on_framebuffer_size(_glfw_window: *mut glfw::ffi::GLFWwindow,
}
}
+fn glfw_key_to_script_key(key: glfw::Key) -> constellation_msg::Key {
+ match key {
+ glfw::KeySpace => constellation_msg::KeySpace,
+ glfw::KeyApostrophe => constellation_msg::KeyApostrophe,
+ glfw::KeyComma => constellation_msg::KeyComma,
+ glfw::KeyMinus => constellation_msg::KeyMinus,
+ glfw::KeyPeriod => constellation_msg::KeyPeriod,
+ glfw::KeySlash => constellation_msg::KeySlash,
+ glfw::Key0 => constellation_msg::Key0,
+ glfw::Key1 => constellation_msg::Key1,
+ glfw::Key2 => constellation_msg::Key2,
+ glfw::Key3 => constellation_msg::Key3,
+ glfw::Key4 => constellation_msg::Key4,
+ glfw::Key5 => constellation_msg::Key5,
+ glfw::Key6 => constellation_msg::Key6,
+ glfw::Key7 => constellation_msg::Key7,
+ glfw::Key8 => constellation_msg::Key8,
+ glfw::Key9 => constellation_msg::Key9,
+ glfw::KeySemicolon => constellation_msg::KeySemicolon,
+ glfw::KeyEqual => constellation_msg::KeyEqual,
+ glfw::KeyA => constellation_msg::KeyA,
+ glfw::KeyB => constellation_msg::KeyB,
+ glfw::KeyC => constellation_msg::KeyC,
+ glfw::KeyD => constellation_msg::KeyD,
+ glfw::KeyE => constellation_msg::KeyE,
+ glfw::KeyF => constellation_msg::KeyF,
+ glfw::KeyG => constellation_msg::KeyG,
+ glfw::KeyH => constellation_msg::KeyH,
+ glfw::KeyI => constellation_msg::KeyI,
+ glfw::KeyJ => constellation_msg::KeyJ,
+ glfw::KeyK => constellation_msg::KeyK,
+ glfw::KeyL => constellation_msg::KeyL,
+ glfw::KeyM => constellation_msg::KeyM,
+ glfw::KeyN => constellation_msg::KeyN,
+ glfw::KeyO => constellation_msg::KeyO,
+ glfw::KeyP => constellation_msg::KeyP,
+ glfw::KeyQ => constellation_msg::KeyQ,
+ glfw::KeyR => constellation_msg::KeyR,
+ glfw::KeyS => constellation_msg::KeyS,
+ glfw::KeyT => constellation_msg::KeyT,
+ glfw::KeyU => constellation_msg::KeyU,
+ glfw::KeyV => constellation_msg::KeyV,
+ glfw::KeyW => constellation_msg::KeyW,
+ glfw::KeyX => constellation_msg::KeyX,
+ glfw::KeyY => constellation_msg::KeyY,
+ glfw::KeyZ => constellation_msg::KeyZ,
+ glfw::KeyLeftBracket => constellation_msg::KeyLeftBracket,
+ glfw::KeyBackslash => constellation_msg::KeyBackslash,
+ glfw::KeyRightBracket => constellation_msg::KeyRightBracket,
+ glfw::KeyGraveAccent => constellation_msg::KeyGraveAccent,
+ glfw::KeyWorld1 => constellation_msg::KeyWorld1,
+ glfw::KeyWorld2 => constellation_msg::KeyWorld2,
+ glfw::KeyEscape => constellation_msg::KeyEscape,
+ glfw::KeyEnter => constellation_msg::KeyEnter,
+ glfw::KeyTab => constellation_msg::KeyTab,
+ glfw::KeyBackspace => constellation_msg::KeyBackspace,
+ glfw::KeyInsert => constellation_msg::KeyInsert,
+ glfw::KeyDelete => constellation_msg::KeyDelete,
+ glfw::KeyRight => constellation_msg::KeyRight,
+ glfw::KeyLeft => constellation_msg::KeyLeft,
+ glfw::KeyDown => constellation_msg::KeyDown,
+ glfw::KeyUp => constellation_msg::KeyUp,
+ glfw::KeyPageUp => constellation_msg::KeyPageUp,
+ glfw::KeyPageDown => constellation_msg::KeyPageDown,
+ glfw::KeyHome => constellation_msg::KeyHome,
+ glfw::KeyEnd => constellation_msg::KeyEnd,
+ glfw::KeyCapsLock => constellation_msg::KeyCapsLock,
+ glfw::KeyScrollLock => constellation_msg::KeyScrollLock,
+ glfw::KeyNumLock => constellation_msg::KeyNumLock,
+ glfw::KeyPrintScreen => constellation_msg::KeyPrintScreen,
+ glfw::KeyPause => constellation_msg::KeyPause,
+ glfw::KeyF1 => constellation_msg::KeyF1,
+ glfw::KeyF2 => constellation_msg::KeyF2,
+ glfw::KeyF3 => constellation_msg::KeyF3,
+ glfw::KeyF4 => constellation_msg::KeyF4,
+ glfw::KeyF5 => constellation_msg::KeyF5,
+ glfw::KeyF6 => constellation_msg::KeyF6,
+ glfw::KeyF7 => constellation_msg::KeyF7,
+ glfw::KeyF8 => constellation_msg::KeyF8,
+ glfw::KeyF9 => constellation_msg::KeyF9,
+ glfw::KeyF10 => constellation_msg::KeyF10,
+ glfw::KeyF11 => constellation_msg::KeyF11,
+ glfw::KeyF12 => constellation_msg::KeyF12,
+ glfw::KeyF13 => constellation_msg::KeyF13,
+ glfw::KeyF14 => constellation_msg::KeyF14,
+ glfw::KeyF15 => constellation_msg::KeyF15,
+ glfw::KeyF16 => constellation_msg::KeyF16,
+ glfw::KeyF17 => constellation_msg::KeyF17,
+ glfw::KeyF18 => constellation_msg::KeyF18,
+ glfw::KeyF19 => constellation_msg::KeyF19,
+ glfw::KeyF20 => constellation_msg::KeyF20,
+ glfw::KeyF21 => constellation_msg::KeyF21,
+ glfw::KeyF22 => constellation_msg::KeyF22,
+ glfw::KeyF23 => constellation_msg::KeyF23,
+ glfw::KeyF24 => constellation_msg::KeyF24,
+ glfw::KeyF25 => constellation_msg::KeyF25,
+ glfw::KeyKp0 => constellation_msg::KeyKp0,
+ glfw::KeyKp1 => constellation_msg::KeyKp1,
+ glfw::KeyKp2 => constellation_msg::KeyKp2,
+ glfw::KeyKp3 => constellation_msg::KeyKp3,
+ glfw::KeyKp4 => constellation_msg::KeyKp4,
+ glfw::KeyKp5 => constellation_msg::KeyKp5,
+ glfw::KeyKp6 => constellation_msg::KeyKp6,
+ glfw::KeyKp7 => constellation_msg::KeyKp7,
+ glfw::KeyKp8 => constellation_msg::KeyKp8,
+ glfw::KeyKp9 => constellation_msg::KeyKp9,
+ glfw::KeyKpDecimal => constellation_msg::KeyKpDecimal,
+ glfw::KeyKpDivide => constellation_msg::KeyKpDivide,
+ glfw::KeyKpMultiply => constellation_msg::KeyKpMultiply,
+ glfw::KeyKpSubtract => constellation_msg::KeyKpSubtract,
+ glfw::KeyKpAdd => constellation_msg::KeyKpAdd,
+ glfw::KeyKpEnter => constellation_msg::KeyKpEnter,
+ glfw::KeyKpEqual => constellation_msg::KeyKpEqual,
+ glfw::KeyLeftShift => constellation_msg::KeyLeftShift,
+ glfw::KeyLeftControl => constellation_msg::KeyLeftControl,
+ glfw::KeyLeftAlt => constellation_msg::KeyLeftAlt,
+ glfw::KeyLeftSuper => constellation_msg::KeyLeftSuper,
+ glfw::KeyRightShift => constellation_msg::KeyRightShift,
+ glfw::KeyRightControl => constellation_msg::KeyRightControl,
+ glfw::KeyRightAlt => constellation_msg::KeyRightAlt,
+ glfw::KeyRightSuper => constellation_msg::KeyRightSuper,
+ glfw::KeyMenu => constellation_msg::KeyMenu,
+ }
+}