Invert wheel deltas for Servo scroll

This commit is contained in:
2026-05-13 01:20:10 -04:00
parent 1325f043b4
commit 5bdb2871ad
2 changed files with 34 additions and 3 deletions
@@ -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);
}
}
+6 -2
View File
@@ -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(