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)]
|
#[derive(Clone, Copy, Debug, Default, Eq, PartialEq)]
|
||||||
pub(super) struct WebSurfaceSize {
|
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> {
|
fn viewport_dimension(pixels: Pixels, scale_factor: f32) -> Option<u32> {
|
||||||
let value = (f32::from(pixels) * positive_scale_or_one(scale_factor)).round();
|
let value = (f32::from(pixels) * positive_scale_or_one(scale_factor)).round();
|
||||||
if !value.is_finite() || value < 1.0 || value > u32::MAX as f32 {
|
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 {
|
fn positive_scale_or_one(scale_factor: f32) -> f32 {
|
||||||
if scale_factor.is_finite() && scale_factor > 0.0 { scale_factor } else { 1.0 }
|
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,
|
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;
|
use ely_design_system::colors;
|
||||||
|
|
||||||
pub(super) fn render_ready_web_surface(
|
pub(super) fn render_ready_web_surface(
|
||||||
@@ -146,7 +149,8 @@ fn render_input_overlay(
|
|||||||
});
|
});
|
||||||
})
|
})
|
||||||
.on_scroll_wheel(move |event, window, cx| {
|
.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();
|
let scale_factor = window.scale_factor();
|
||||||
scroll_entity.update(cx, |shell, cx| {
|
scroll_entity.update(cx, |shell, cx| {
|
||||||
shell.scroll_external_web_viewport(
|
shell.scroll_external_web_viewport(
|
||||||
|
|||||||
Reference in New Issue
Block a user