mirror of
https://github.com/servo/servo.git
synced 2025-08-07 06:25:32 +01:00
Pass keyboard events to WebView on Windows (#33225)
* Pass keyboard events to webview on Windows Signed-off-by: crbrz <cristianb@gmail.com> * Refactor WebViewManager::handle_key_from_window Signed-off-by: crbrz <cristianb@gmail.com> --------- Signed-off-by: crbrz <cristianb@gmail.com>
This commit is contained in:
parent
8dd40ed2bd
commit
99bd6afa81
1 changed files with 56 additions and 66 deletions
|
@ -416,11 +416,9 @@ where
|
||||||
|
|
||||||
/// Handle key events before sending them to Servo.
|
/// Handle key events before sending them to Servo.
|
||||||
fn handle_key_from_window(&mut self, key_event: KeyboardEvent) {
|
fn handle_key_from_window(&mut self, key_event: KeyboardEvent) {
|
||||||
ShortcutMatcher::from_event(key_event.clone())
|
let embedder_event = ShortcutMatcher::from_event(key_event.clone())
|
||||||
.shortcut(CMD_OR_CONTROL, 'R', || {
|
.shortcut(CMD_OR_CONTROL, 'R', || {
|
||||||
if let Some(id) = self.focused_webview_id {
|
self.focused_webview_id.map(EmbedderEvent::Reload)
|
||||||
self.event_queue.push(EmbedderEvent::Reload(id));
|
|
||||||
}
|
|
||||||
})
|
})
|
||||||
.shortcut(CMD_OR_CONTROL, 'L', || {
|
.shortcut(CMD_OR_CONTROL, 'L', || {
|
||||||
if !opts::get().minibrowser {
|
if !opts::get().minibrowser {
|
||||||
|
@ -435,28 +433,24 @@ where
|
||||||
|
|
||||||
let title = "URL or search query";
|
let title = "URL or search query";
|
||||||
let input = tinyfiledialogs::input_box(title, title, &tiny_dialog_escape(&url));
|
let input = tinyfiledialogs::input_box(title, title, &tiny_dialog_escape(&url));
|
||||||
if let Some(input) = input {
|
input.and_then(|input| {
|
||||||
if let Some(url) = location_bar_input_to_url(&input) {
|
location_bar_input_to_url(&input).and_then(|url| {
|
||||||
if let Some(id) = self.focused_webview_id {
|
self.focused_webview_id
|
||||||
self.event_queue.push(EmbedderEvent::LoadUrl(id, url));
|
.map(|id| EmbedderEvent::LoadUrl(id, url))
|
||||||
}
|
})
|
||||||
}
|
})
|
||||||
}
|
} else {
|
||||||
|
None
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
.shortcut(CMD_OR_CONTROL, 'W', || {
|
.shortcut(CMD_OR_CONTROL, 'W', || {
|
||||||
if let Some(id) = self.focused_webview_id {
|
self.focused_webview_id.map(EmbedderEvent::CloseWebView)
|
||||||
self.event_queue.push(EmbedderEvent::CloseWebView(id));
|
|
||||||
}
|
|
||||||
})
|
})
|
||||||
.shortcut(CMD_OR_CONTROL, 'T', || {
|
.shortcut(CMD_OR_CONTROL, 'T', || {
|
||||||
let url = ServoUrl::parse("servo:newtab").unwrap();
|
let url = ServoUrl::parse("servo:newtab").unwrap();
|
||||||
self.event_queue
|
Some(EmbedderEvent::NewWebView(url, WebViewId::new()))
|
||||||
.push(EmbedderEvent::NewWebView(url, WebViewId::new()));
|
|
||||||
})
|
|
||||||
.shortcut(CMD_OR_CONTROL, 'Q', || {
|
|
||||||
self.event_queue.push(EmbedderEvent::Quit);
|
|
||||||
})
|
})
|
||||||
|
.shortcut(CMD_OR_CONTROL, 'Q', || Some(EmbedderEvent::Quit))
|
||||||
.shortcut(CMD_OR_CONTROL, 'P', || {
|
.shortcut(CMD_OR_CONTROL, 'P', || {
|
||||||
let rate = env::var("SAMPLING_RATE")
|
let rate = env::var("SAMPLING_RATE")
|
||||||
.ok()
|
.ok()
|
||||||
|
@ -466,74 +460,70 @@ where
|
||||||
.ok()
|
.ok()
|
||||||
.and_then(|s| s.parse().ok())
|
.and_then(|s| s.parse().ok())
|
||||||
.unwrap_or(10);
|
.unwrap_or(10);
|
||||||
self.event_queue.push(EmbedderEvent::ToggleSamplingProfiler(
|
Some(EmbedderEvent::ToggleSamplingProfiler(
|
||||||
Duration::from_millis(rate),
|
Duration::from_millis(rate),
|
||||||
Duration::from_secs(duration),
|
Duration::from_secs(duration),
|
||||||
));
|
))
|
||||||
})
|
})
|
||||||
.shortcut(Modifiers::CONTROL, Key::F9, || {
|
.shortcut(Modifiers::CONTROL, Key::F9, || {
|
||||||
self.event_queue.push(EmbedderEvent::CaptureWebRender)
|
Some(EmbedderEvent::CaptureWebRender)
|
||||||
})
|
})
|
||||||
.shortcut(Modifiers::CONTROL, Key::F10, || {
|
.shortcut(Modifiers::CONTROL, Key::F10, || {
|
||||||
self.event_queue.push(EmbedderEvent::ToggleWebRenderDebug(
|
Some(EmbedderEvent::ToggleWebRenderDebug(
|
||||||
WebRenderDebugOption::RenderTargetDebug,
|
WebRenderDebugOption::RenderTargetDebug,
|
||||||
));
|
))
|
||||||
})
|
})
|
||||||
.shortcut(Modifiers::CONTROL, Key::F11, || {
|
.shortcut(Modifiers::CONTROL, Key::F11, || {
|
||||||
self.event_queue.push(EmbedderEvent::ToggleWebRenderDebug(
|
Some(EmbedderEvent::ToggleWebRenderDebug(
|
||||||
WebRenderDebugOption::TextureCacheDebug,
|
WebRenderDebugOption::TextureCacheDebug,
|
||||||
));
|
))
|
||||||
})
|
})
|
||||||
.shortcut(Modifiers::CONTROL, Key::F12, || {
|
.shortcut(Modifiers::CONTROL, Key::F12, || {
|
||||||
self.event_queue.push(EmbedderEvent::ToggleWebRenderDebug(
|
Some(EmbedderEvent::ToggleWebRenderDebug(
|
||||||
WebRenderDebugOption::Profiler,
|
WebRenderDebugOption::Profiler,
|
||||||
));
|
))
|
||||||
})
|
})
|
||||||
.shortcut(CMD_OR_ALT, Key::ArrowRight, || {
|
.shortcut(CMD_OR_ALT, Key::ArrowRight, || {
|
||||||
if let Some(id) = self.focused_webview_id {
|
self.focused_webview_id
|
||||||
let event = EmbedderEvent::Navigation(id, TraversalDirection::Forward(1));
|
.map(|id| EmbedderEvent::Navigation(id, TraversalDirection::Forward(1)))
|
||||||
self.event_queue.push(event);
|
|
||||||
}
|
|
||||||
})
|
})
|
||||||
|
.optional_shortcut(
|
||||||
|
cfg!(not(target_os = "windows")),
|
||||||
|
CMD_OR_CONTROL,
|
||||||
|
']',
|
||||||
|
|| {
|
||||||
|
self.focused_webview_id()
|
||||||
|
.map(|id| EmbedderEvent::Navigation(id, TraversalDirection::Forward(1)))
|
||||||
|
},
|
||||||
|
)
|
||||||
.shortcut(CMD_OR_ALT, Key::ArrowLeft, || {
|
.shortcut(CMD_OR_ALT, Key::ArrowLeft, || {
|
||||||
if let Some(id) = self.focused_webview_id {
|
self.focused_webview_id
|
||||||
let event = EmbedderEvent::Navigation(id, TraversalDirection::Back(1));
|
.map(|id| EmbedderEvent::Navigation(id, TraversalDirection::Back(1)))
|
||||||
|
})
|
||||||
|
.optional_shortcut(
|
||||||
|
cfg!(not(target_os = "windows")),
|
||||||
|
CMD_OR_CONTROL,
|
||||||
|
'[',
|
||||||
|
|| {
|
||||||
|
self.focused_webview_id
|
||||||
|
.map(|id| EmbedderEvent::Navigation(id, TraversalDirection::Back(1)))
|
||||||
|
},
|
||||||
|
)
|
||||||
|
.optional_shortcut(
|
||||||
|
self.window.get_fullscreen(),
|
||||||
|
Modifiers::empty(),
|
||||||
|
Key::Escape,
|
||||||
|
|| self.focused_webview_id.map(EmbedderEvent::ExitFullScreen),
|
||||||
|
)
|
||||||
|
.otherwise(|| {
|
||||||
|
self.focused_webview_id
|
||||||
|
.map(|_id| EmbedderEvent::Keyboard(key_event))
|
||||||
|
})
|
||||||
|
.flatten();
|
||||||
|
if let Some(event) = embedder_event {
|
||||||
self.event_queue.push(event);
|
self.event_queue.push(event);
|
||||||
}
|
}
|
||||||
})
|
|
||||||
.shortcut(Modifiers::empty(), Key::Escape, || {
|
|
||||||
let state = self.window.get_fullscreen();
|
|
||||||
if state {
|
|
||||||
if let Some(id) = self.focused_webview_id {
|
|
||||||
let event = EmbedderEvent::ExitFullScreen(id);
|
|
||||||
self.event_queue.push(event);
|
|
||||||
}
|
}
|
||||||
} else {
|
|
||||||
self.platform_handle_key(key_event.clone());
|
|
||||||
}
|
|
||||||
})
|
|
||||||
.otherwise(|| self.platform_handle_key(key_event));
|
|
||||||
}
|
|
||||||
|
|
||||||
#[cfg(not(target_os = "windows"))]
|
|
||||||
fn platform_handle_key(&mut self, key_event: KeyboardEvent) {
|
|
||||||
if let Some(id) = self.focused_webview_id {
|
|
||||||
if let Some(event) = ShortcutMatcher::from_event(key_event.clone())
|
|
||||||
.shortcut(CMD_OR_CONTROL, '[', || {
|
|
||||||
EmbedderEvent::Navigation(id, TraversalDirection::Back(1))
|
|
||||||
})
|
|
||||||
.shortcut(CMD_OR_CONTROL, ']', || {
|
|
||||||
EmbedderEvent::Navigation(id, TraversalDirection::Forward(1))
|
|
||||||
})
|
|
||||||
.otherwise(|| EmbedderEvent::Keyboard(key_event))
|
|
||||||
{
|
|
||||||
self.event_queue.push(event)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#[cfg(target_os = "windows")]
|
|
||||||
fn platform_handle_key(&mut self, _key_event: KeyboardEvent) {}
|
|
||||||
|
|
||||||
/// Handle key events after they have been handled by Servo.
|
/// Handle key events after they have been handled by Servo.
|
||||||
fn handle_key_from_servo(&mut self, _: Option<WebViewId>, event: KeyboardEvent) {
|
fn handle_key_from_servo(&mut self, _: Option<WebViewId>, event: KeyboardEvent) {
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue