Fix minibrowser scroll by keyboard (#33252)

* Fix minibrowser scroll by keyboard

Signed-off-by: crbrz <cristianb@gmail.com>

* Apply suggested change

Co-authored-by: Josh Matthews <josh@joshmatthews.net>
Signed-off-by: Cristian Brinza <cristianb@gmail.com>

---------

Signed-off-by: crbrz <cristianb@gmail.com>
Signed-off-by: Cristian Brinza <cristianb@gmail.com>
Co-authored-by: Josh Matthews <josh@joshmatthews.net>
This commit is contained in:
Cristian Brinza 2024-08-29 19:39:08 +03:00 committed by GitHub
parent 99bd6afa81
commit 9ea02fa4b4
No known key found for this signature in database
GPG key ID: B5690EEEBB952194

View file

@ -526,7 +526,7 @@ where
}
/// 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, webview_id: Option<WebViewId>, event: KeyboardEvent) {
ShortcutMatcher::from_event(event)
.shortcut(CMD_OR_CONTROL, '=', || {
self.event_queue.push(EmbedderEvent::Zoom(1.1))
@ -545,49 +545,67 @@ where
0.0,
-self.window.page_height() + 2.0 * LINE_HEIGHT,
));
self.scroll_window_from_key(scroll_location, TouchEventType::Move);
self.scroll_window_from_key(scroll_location, TouchEventType::Move, webview_id);
})
.shortcut(Modifiers::empty(), Key::PageUp, || {
let scroll_location = ScrollLocation::Delta(Vector2D::new(
0.0,
self.window.page_height() - 2.0 * LINE_HEIGHT,
));
self.scroll_window_from_key(scroll_location, TouchEventType::Move);
self.scroll_window_from_key(scroll_location, TouchEventType::Move, webview_id);
})
.shortcut(Modifiers::empty(), Key::Home, || {
self.scroll_window_from_key(ScrollLocation::Start, TouchEventType::Move);
self.scroll_window_from_key(
ScrollLocation::Start,
TouchEventType::Move,
webview_id,
);
})
.shortcut(Modifiers::empty(), Key::End, || {
self.scroll_window_from_key(ScrollLocation::End, TouchEventType::Move);
self.scroll_window_from_key(ScrollLocation::End, TouchEventType::Move, webview_id);
})
.shortcut(Modifiers::empty(), Key::ArrowUp, || {
self.scroll_window_from_key(
ScrollLocation::Delta(Vector2D::new(0.0, 3.0 * LINE_HEIGHT)),
TouchEventType::Move,
webview_id,
);
})
.shortcut(Modifiers::empty(), Key::ArrowDown, || {
self.scroll_window_from_key(
ScrollLocation::Delta(Vector2D::new(0.0, -3.0 * LINE_HEIGHT)),
TouchEventType::Move,
webview_id,
);
})
.shortcut(Modifiers::empty(), Key::ArrowLeft, || {
self.scroll_window_from_key(
ScrollLocation::Delta(Vector2D::new(LINE_HEIGHT, 0.0)),
TouchEventType::Move,
webview_id,
);
})
.shortcut(Modifiers::empty(), Key::ArrowRight, || {
self.scroll_window_from_key(
ScrollLocation::Delta(Vector2D::new(-LINE_HEIGHT, 0.0)),
TouchEventType::Move,
webview_id,
);
});
}
fn scroll_window_from_key(&mut self, scroll_location: ScrollLocation, phase: TouchEventType) {
let event = EmbedderEvent::Scroll(scroll_location, Point2D::zero(), phase);
fn scroll_window_from_key(
&mut self,
scroll_location: ScrollLocation,
phase: TouchEventType,
webview_id: Option<WebViewId>,
) {
// In minibrowser mode the webview is offset by the toolbar
let origin = webview_id
.and_then(|id| self.webviews.get(&id))
.map(|webview| webview.rect.min.ceil().to_i32())
.unwrap_or(Point2D::zero());
let event = EmbedderEvent::Scroll(scroll_location, origin, phase);
self.event_queue.push(event);
}