mirror of
https://github.com/servo/servo.git
synced 2025-08-07 06:25:32 +01:00
Auto merge of #21301 - paulrouget:stickykeys, r=Manishearth
Do not manually keep the modifiers state Fix #21294 <!-- Reviewable:start --> --- This change is [<img src="https://reviewable.io/review_button.svg" height="34" align="absmiddle" alt="Reviewable"/>](https://reviewable.io/reviews/servo/servo/21301) <!-- Reviewable:end -->
This commit is contained in:
commit
88f3c8e158
5 changed files with 24 additions and 60 deletions
1
Cargo.lock
generated
1
Cargo.lock
generated
|
@ -3144,7 +3144,6 @@ name = "servo"
|
||||||
version = "0.0.1"
|
version = "0.0.1"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"backtrace 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
"backtrace 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"bitflags 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
|
||||||
"euclid 0.18.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
"euclid 0.18.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"gdi32-sys 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
"gdi32-sys 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"gleam 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
"gleam 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
|
|
@ -33,7 +33,6 @@ unstable = ["libservo/unstable"]
|
||||||
|
|
||||||
[target.'cfg(not(target_os = "android"))'.dependencies]
|
[target.'cfg(not(target_os = "android"))'.dependencies]
|
||||||
backtrace = "0.3"
|
backtrace = "0.3"
|
||||||
bitflags = "1.0"
|
|
||||||
euclid = "0.18"
|
euclid = "0.18"
|
||||||
gleam = "0.6"
|
gleam = "0.6"
|
||||||
glutin = "0.17"
|
glutin = "0.17"
|
||||||
|
|
|
@ -5,19 +5,6 @@
|
||||||
use servo::msg::constellation_msg::{self, Key, KeyModifiers};
|
use servo::msg::constellation_msg::{self, Key, KeyModifiers};
|
||||||
use winit::VirtualKeyCode;
|
use winit::VirtualKeyCode;
|
||||||
|
|
||||||
bitflags! {
|
|
||||||
pub struct WinitKeyModifiers: u8 {
|
|
||||||
const LEFT_CONTROL = 1;
|
|
||||||
const RIGHT_CONTROL = 2;
|
|
||||||
const LEFT_SHIFT = 4;
|
|
||||||
const RIGHT_SHIFT = 8;
|
|
||||||
const LEFT_ALT = 16;
|
|
||||||
const RIGHT_ALT = 32;
|
|
||||||
const LEFT_SUPER = 64;
|
|
||||||
const RIGHT_SUPER = 128;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Some shortcuts use Cmd on Mac and Control on other systems.
|
// Some shortcuts use Cmd on Mac and Control on other systems.
|
||||||
#[cfg(target_os = "macos")]
|
#[cfg(target_os = "macos")]
|
||||||
pub const CMD_OR_CONTROL: KeyModifiers = KeyModifiers::SUPER;
|
pub const CMD_OR_CONTROL: KeyModifiers = KeyModifiers::SUPER;
|
||||||
|
@ -243,23 +230,6 @@ pub fn winit_key_to_script_key(key: VirtualKeyCode) -> Result<constellation_msg:
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn winit_mods_to_script_mods(modifiers: WinitKeyModifiers) -> constellation_msg::KeyModifiers {
|
|
||||||
let mut result = constellation_msg::KeyModifiers::empty();
|
|
||||||
if modifiers.intersects(WinitKeyModifiers::LEFT_SHIFT | WinitKeyModifiers::RIGHT_SHIFT) {
|
|
||||||
result.insert(KeyModifiers::SHIFT);
|
|
||||||
}
|
|
||||||
if modifiers.intersects(WinitKeyModifiers::LEFT_CONTROL | WinitKeyModifiers::RIGHT_CONTROL) {
|
|
||||||
result.insert(KeyModifiers::CONTROL);
|
|
||||||
}
|
|
||||||
if modifiers.intersects(WinitKeyModifiers::LEFT_ALT | WinitKeyModifiers::RIGHT_ALT) {
|
|
||||||
result.insert(KeyModifiers::ALT);
|
|
||||||
}
|
|
||||||
if modifiers.intersects(WinitKeyModifiers::LEFT_SUPER | WinitKeyModifiers::RIGHT_SUPER) {
|
|
||||||
result.insert(KeyModifiers::SUPER);
|
|
||||||
}
|
|
||||||
result
|
|
||||||
}
|
|
||||||
|
|
||||||
pub fn is_printable(key_code: VirtualKeyCode) -> bool {
|
pub fn is_printable(key_code: VirtualKeyCode) -> bool {
|
||||||
use winit::VirtualKeyCode::*;
|
use winit::VirtualKeyCode::*;
|
||||||
match key_code {
|
match key_code {
|
||||||
|
|
|
@ -14,7 +14,7 @@ use osmesa_sys;
|
||||||
use servo::compositing::windowing::{AnimationState, MouseWindowEvent, WindowEvent};
|
use servo::compositing::windowing::{AnimationState, MouseWindowEvent, WindowEvent};
|
||||||
use servo::compositing::windowing::{EmbedderCoordinates, WindowMethods};
|
use servo::compositing::windowing::{EmbedderCoordinates, WindowMethods};
|
||||||
use servo::embedder_traits::EventLoopWaker;
|
use servo::embedder_traits::EventLoopWaker;
|
||||||
use servo::msg::constellation_msg::{Key, KeyState};
|
use servo::msg::constellation_msg::{Key, KeyState, KeyModifiers};
|
||||||
use servo::script_traits::TouchEventType;
|
use servo::script_traits::TouchEventType;
|
||||||
use servo::servo_config::opts;
|
use servo::servo_config::opts;
|
||||||
use servo::servo_geometry::DeviceIndependentPixel;
|
use servo::servo_geometry::DeviceIndependentPixel;
|
||||||
|
@ -31,13 +31,13 @@ use std::rc::Rc;
|
||||||
use std::sync::Arc;
|
use std::sync::Arc;
|
||||||
use std::thread;
|
use std::thread;
|
||||||
use std::time;
|
use std::time;
|
||||||
use super::keyutils::{self, WinitKeyModifiers};
|
use super::keyutils;
|
||||||
#[cfg(target_os = "windows")]
|
#[cfg(target_os = "windows")]
|
||||||
use user32;
|
use user32;
|
||||||
#[cfg(target_os = "windows")]
|
#[cfg(target_os = "windows")]
|
||||||
use winapi;
|
use winapi;
|
||||||
use winit;
|
use winit;
|
||||||
use winit::{ElementState, Event, MouseButton, MouseScrollDelta, TouchPhase, VirtualKeyCode};
|
use winit::{ElementState, Event, ModifiersState, MouseButton, MouseScrollDelta, TouchPhase, VirtualKeyCode};
|
||||||
use winit::dpi::{LogicalPosition, LogicalSize, PhysicalSize};
|
use winit::dpi::{LogicalPosition, LogicalSize, PhysicalSize};
|
||||||
#[cfg(target_os = "macos")]
|
#[cfg(target_os = "macos")]
|
||||||
use winit::os::macos::{ActivationPolicy, WindowBuilderExt};
|
use winit::os::macos::{ActivationPolicy, WindowBuilderExt};
|
||||||
|
@ -152,7 +152,7 @@ pub struct Window {
|
||||||
mouse_down_point: Cell<TypedPoint2D<i32, DevicePixel>>,
|
mouse_down_point: Cell<TypedPoint2D<i32, DevicePixel>>,
|
||||||
event_queue: RefCell<Vec<WindowEvent>>,
|
event_queue: RefCell<Vec<WindowEvent>>,
|
||||||
mouse_pos: Cell<TypedPoint2D<i32, DevicePixel>>,
|
mouse_pos: Cell<TypedPoint2D<i32, DevicePixel>>,
|
||||||
key_modifiers: Cell<WinitKeyModifiers>,
|
key_modifiers: Cell<KeyModifiers>,
|
||||||
last_pressed_key: Cell<Option<Key>>,
|
last_pressed_key: Cell<Option<Key>>,
|
||||||
animation_state: Cell<AnimationState>,
|
animation_state: Cell<AnimationState>,
|
||||||
fullscreen: Cell<bool>,
|
fullscreen: Cell<bool>,
|
||||||
|
@ -284,7 +284,7 @@ impl Window {
|
||||||
mouse_down_point: Cell::new(TypedPoint2D::new(0, 0)),
|
mouse_down_point: Cell::new(TypedPoint2D::new(0, 0)),
|
||||||
|
|
||||||
mouse_pos: Cell::new(TypedPoint2D::new(0, 0)),
|
mouse_pos: Cell::new(TypedPoint2D::new(0, 0)),
|
||||||
key_modifiers: Cell::new(WinitKeyModifiers::empty()),
|
key_modifiers: Cell::new(KeyModifiers::empty()),
|
||||||
|
|
||||||
last_pressed_key: Cell::new(None),
|
last_pressed_key: Cell::new(None),
|
||||||
gl: gl.clone(),
|
gl: gl.clone(),
|
||||||
|
@ -426,39 +426,32 @@ impl Window {
|
||||||
(last_key, None)
|
(last_key, None)
|
||||||
};
|
};
|
||||||
|
|
||||||
let modifiers = keyutils::winit_mods_to_script_mods(self.key_modifiers.get());
|
let modifiers = self.key_modifiers.get();
|
||||||
let event = WindowEvent::KeyEvent(ch, key, KeyState::Pressed, modifiers);
|
let event = WindowEvent::KeyEvent(ch, key, KeyState::Pressed, modifiers);
|
||||||
self.event_queue.borrow_mut().push(event);
|
self.event_queue.borrow_mut().push(event);
|
||||||
}
|
}
|
||||||
|
|
||||||
fn toggle_keyboard_modifiers(&self, virtual_key_code: VirtualKeyCode) {
|
fn toggle_keyboard_modifiers(&self, mods: ModifiersState) {
|
||||||
match virtual_key_code {
|
self.toggle_modifier(KeyModifiers::CONTROL, mods.ctrl);
|
||||||
VirtualKeyCode::LControl => self.toggle_modifier(WinitKeyModifiers::LEFT_CONTROL),
|
self.toggle_modifier(KeyModifiers::SHIFT, mods.shift);
|
||||||
VirtualKeyCode::RControl => self.toggle_modifier(WinitKeyModifiers::RIGHT_CONTROL),
|
self.toggle_modifier(KeyModifiers::ALT, mods.alt);
|
||||||
VirtualKeyCode::LShift => self.toggle_modifier(WinitKeyModifiers::LEFT_SHIFT),
|
self.toggle_modifier(KeyModifiers::SUPER, mods.logo);
|
||||||
VirtualKeyCode::RShift => self.toggle_modifier(WinitKeyModifiers::RIGHT_SHIFT),
|
|
||||||
VirtualKeyCode::LAlt => self.toggle_modifier(WinitKeyModifiers::LEFT_ALT),
|
|
||||||
VirtualKeyCode::RAlt => self.toggle_modifier(WinitKeyModifiers::RIGHT_ALT),
|
|
||||||
VirtualKeyCode::LWin => self.toggle_modifier(WinitKeyModifiers::LEFT_SUPER),
|
|
||||||
VirtualKeyCode::RWin => self.toggle_modifier(WinitKeyModifiers::RIGHT_SUPER),
|
|
||||||
_ => {}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
fn handle_keyboard_input(&self, element_state: ElementState, virtual_key_code: VirtualKeyCode) {
|
fn handle_keyboard_input(&self, element_state: ElementState, code: VirtualKeyCode, mods: ModifiersState) {
|
||||||
self.toggle_keyboard_modifiers(virtual_key_code);
|
self.toggle_keyboard_modifiers(mods);
|
||||||
|
|
||||||
if let Ok(key) = keyutils::winit_key_to_script_key(virtual_key_code) {
|
if let Ok(key) = keyutils::winit_key_to_script_key(code) {
|
||||||
let state = match element_state {
|
let state = match element_state {
|
||||||
ElementState::Pressed => KeyState::Pressed,
|
ElementState::Pressed => KeyState::Pressed,
|
||||||
ElementState::Released => KeyState::Released,
|
ElementState::Released => KeyState::Released,
|
||||||
};
|
};
|
||||||
if element_state == ElementState::Pressed && keyutils::is_printable(virtual_key_code) {
|
if element_state == ElementState::Pressed && keyutils::is_printable(code) {
|
||||||
// If pressed and printable, we expect a ReceivedCharacter event.
|
// If pressed and printable, we expect a ReceivedCharacter event.
|
||||||
self.last_pressed_key.set(Some(key));
|
self.last_pressed_key.set(Some(key));
|
||||||
} else {
|
} else {
|
||||||
self.last_pressed_key.set(None);
|
self.last_pressed_key.set(None);
|
||||||
let modifiers = keyutils::winit_mods_to_script_mods(self.key_modifiers.get());
|
let modifiers = self.key_modifiers.get();
|
||||||
self.event_queue.borrow_mut().push(WindowEvent::KeyEvent(None, key, state, modifiers));
|
self.event_queue.borrow_mut().push(WindowEvent::KeyEvent(None, key, state, modifiers));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -473,10 +466,10 @@ impl Window {
|
||||||
Event::WindowEvent {
|
Event::WindowEvent {
|
||||||
event: winit::WindowEvent::KeyboardInput {
|
event: winit::WindowEvent::KeyboardInput {
|
||||||
input: winit::KeyboardInput {
|
input: winit::KeyboardInput {
|
||||||
state, virtual_keycode: Some(virtual_keycode), ..
|
state, virtual_keycode: Some(virtual_keycode), modifiers, ..
|
||||||
}, ..
|
}, ..
|
||||||
}, ..
|
}, ..
|
||||||
} => self.handle_keyboard_input(state, virtual_keycode),
|
} => self.handle_keyboard_input(state, virtual_keycode, modifiers),
|
||||||
Event::WindowEvent {
|
Event::WindowEvent {
|
||||||
event: winit::WindowEvent::MouseInput {
|
event: winit::WindowEvent::MouseInput {
|
||||||
state, button, ..
|
state, button, ..
|
||||||
|
@ -576,9 +569,13 @@ impl Window {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn toggle_modifier(&self, modifier: WinitKeyModifiers) {
|
fn toggle_modifier(&self, modifier: KeyModifiers, pressed: bool) {
|
||||||
let mut modifiers = self.key_modifiers.get();
|
let mut modifiers = self.key_modifiers.get();
|
||||||
modifiers.toggle(modifier);
|
if pressed {
|
||||||
|
modifiers.insert(modifier);
|
||||||
|
} else {
|
||||||
|
modifiers.remove(modifier);
|
||||||
|
}
|
||||||
self.key_modifiers.set(modifiers);
|
self.key_modifiers.set(modifiers);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -3,7 +3,6 @@
|
||||||
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
|
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
|
||||||
|
|
||||||
extern crate backtrace;
|
extern crate backtrace;
|
||||||
#[macro_use] extern crate bitflags;
|
|
||||||
extern crate euclid;
|
extern crate euclid;
|
||||||
#[cfg(target_os = "windows")] extern crate gdi32;
|
#[cfg(target_os = "windows")] extern crate gdi32;
|
||||||
extern crate gleam;
|
extern crate gleam;
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue