From 5bdb2871ad6dcbcee45234e882f06b3e3ce80f66 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=9B=B7=E7=94=B5=E8=8A=BD=E8=A1=A3?= Date: Wed, 13 May 2026 01:20:10 -0400 Subject: [PATCH] Invert wheel deltas for Servo scroll --- .../ely_app/src/shell/web_surface_geometry.rs | 29 ++++++++++++++++++- crates/ely_app/src/shell/web_surface_view.rs | 8 +++-- 2 files changed, 34 insertions(+), 3 deletions(-) diff --git a/crates/ely_app/src/shell/web_surface_geometry.rs b/crates/ely_app/src/shell/web_surface_geometry.rs index f99a677..44b644e 100644 --- a/crates/ely_app/src/shell/web_surface_geometry.rs +++ b/crates/ely_app/src/shell/web_surface_geometry.rs @@ -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) -> Point { + point(-delta.x, -delta.y) +} + fn viewport_dimension(pixels: Pixels, scale_factor: f32) -> Option { 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); + } +} diff --git a/crates/ely_app/src/shell/web_surface_view.rs b/crates/ely_app/src/shell/web_surface_view.rs index 39310ba..60e87b9 100644 --- a/crates/ely_app/src/shell/web_surface_view.rs +++ b/crates/ely_app/src/shell/web_surface_view.rs @@ -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(