mirror of
https://github.com/servo/servo.git
synced 2025-08-05 13:40:08 +01:00
Pass all key events to the current constellation frame.
This commit is contained in:
parent
c5e1b0d32e
commit
1c64dabb15
7 changed files with 304 additions and 9 deletions
|
@ -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>)>) ->
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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"),
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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 => {}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue