Invert wheel deltas for Servo scroll
This commit is contained in:
@@ -1,4 +1,4 @@
|
||||
use gpui::{Bounds, Pixels, Point};
|
||||
use gpui::{Bounds, Pixels, Point, point};
|
||||
|
||||
#[derive(Clone, Copy, Debug, Default, Eq, PartialEq)]
|
||||
pub(super) struct WebSurfaceSize {
|
||||
@@ -129,6 +129,10 @@ impl WebSurfaceScrollDelta {
|
||||
}
|
||||
}
|
||||
|
||||
pub(super) fn servo_scroll_delta_from_wheel_delta(delta: Point<Pixels>) -> Point<Pixels> {
|
||||
point(-delta.x, -delta.y)
|
||||
}
|
||||
|
||||
fn viewport_dimension(pixels: Pixels, scale_factor: f32) -> Option<u32> {
|
||||
let value = (f32::from(pixels) * positive_scale_or_one(scale_factor)).round();
|
||||
if !value.is_finite() || value < 1.0 || value > u32::MAX as f32 {
|
||||
@@ -192,3 +196,26 @@ fn combined_scroll_delta(current: i32, next: i32) -> i32 {
|
||||
fn positive_scale_or_one(scale_factor: f32) -> f32 {
|
||||
if scale_factor.is_finite() && scale_factor > 0.0 { scale_factor } else { 1.0 }
|
||||
}
|
||||
|
||||
#[cfg(test)]
|
||||
mod tests {
|
||||
use gpui::{point, px};
|
||||
|
||||
use super::servo_scroll_delta_from_wheel_delta;
|
||||
|
||||
#[test]
|
||||
fn wheel_delta_down_becomes_servo_scroll_down() {
|
||||
let delta = servo_scroll_delta_from_wheel_delta(point(px(0.0), px(-120.0)));
|
||||
|
||||
assert_eq!(f32::from(delta.x), 0.0);
|
||||
assert_eq!(f32::from(delta.y), 120.0);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn wheel_delta_up_becomes_servo_scroll_up() {
|
||||
let delta = servo_scroll_delta_from_wheel_delta(point(px(0.0), px(80.0)));
|
||||
|
||||
assert_eq!(f32::from(delta.x), 0.0);
|
||||
assert_eq!(f32::from(delta.y), -80.0);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -4,7 +4,10 @@ use gpui::{
|
||||
ParentElement, Styled, StyledImage, Window, canvas, div, img, px, rgb, surface,
|
||||
};
|
||||
|
||||
use super::{ElyShell, web_surface_frame::WebSurfaceFrame};
|
||||
use super::{
|
||||
ElyShell, web_surface_frame::WebSurfaceFrame,
|
||||
web_surface_geometry::servo_scroll_delta_from_wheel_delta,
|
||||
};
|
||||
use ely_design_system::colors;
|
||||
|
||||
pub(super) fn render_ready_web_surface(
|
||||
@@ -146,7 +149,8 @@ fn render_input_overlay(
|
||||
});
|
||||
})
|
||||
.on_scroll_wheel(move |event, window, cx| {
|
||||
let delta = event.delta.pixel_delta(window.line_height());
|
||||
let delta =
|
||||
servo_scroll_delta_from_wheel_delta(event.delta.pixel_delta(window.line_height()));
|
||||
let scale_factor = window.scale_factor();
|
||||
scroll_entity.update(cx, |shell, cx| {
|
||||
shell.scroll_external_web_viewport(
|
||||
|
||||
Reference in New Issue
Block a user