diff --git a/crates/editor/src/element.rs b/crates/editor/src/element.rs index c935df7d07a47479b032cc16aad0d585c04a3c2a..1881d14842fe02cb37b89419e3ac6cf5f75f983e 100644 --- a/crates/editor/src/element.rs +++ b/crates/editor/src/element.rs @@ -1582,6 +1582,7 @@ impl Element for EditorElement { position, delta, precise, + .. }) => self.scroll(*position, *delta, *precise, layout, paint, cx), &Event::ModifiersChanged(event) => self.modifiers_changed(event, cx), diff --git a/crates/gpui/src/elements/flex.rs b/crates/gpui/src/elements/flex.rs index 1d577344c6e387e100687ab229c047486dc7e472..798fb3e8c0106b3d5ec9dc7d2578418721b38c36 100644 --- a/crates/gpui/src/elements/flex.rs +++ b/crates/gpui/src/elements/flex.rs @@ -293,6 +293,7 @@ impl Element for Flex { position, delta, precise, + .. }) = event { if *remaining_space < 0. && bounds.contains_point(position) { diff --git a/crates/gpui/src/elements/list.rs b/crates/gpui/src/elements/list.rs index e0ca47b598e2cd20c82917bc3d56f28dcd54703d..d3c15c4e2b73bd167e450020258581173733e745 100644 --- a/crates/gpui/src/elements/list.rs +++ b/crates/gpui/src/elements/list.rs @@ -316,6 +316,7 @@ impl Element for List { position, delta, precise, + .. }) = event { if bounds.contains_point(*position) diff --git a/crates/gpui/src/elements/uniform_list.rs b/crates/gpui/src/elements/uniform_list.rs index bf9a0a4e3024808fcc9039c5cfe6f3f563dc8f2a..103cb00d8cc1f46d77d85928e95aea666c589bed 100644 --- a/crates/gpui/src/elements/uniform_list.rs +++ b/crates/gpui/src/elements/uniform_list.rs @@ -315,6 +315,7 @@ impl Element for UniformList { position, delta, precise, + .. }) = event { if bounds.contains_point(*position) diff --git a/crates/gpui/src/platform/event.rs b/crates/gpui/src/platform/event.rs index 6ac75926be426e2a7512d35ea9c06cd5c7f64047..010fc9a7336c344413a9218c2a02abf428712a83 100644 --- a/crates/gpui/src/platform/event.rs +++ b/crates/gpui/src/platform/event.rs @@ -24,6 +24,10 @@ pub struct ScrollWheelEvent { pub position: Vector2F, pub delta: Vector2F, pub precise: bool, + pub ctrl: bool, + pub alt: bool, + pub shift: bool, + pub cmd: bool, } #[derive(Hash, PartialEq, Eq, Copy, Clone, Debug)] diff --git a/crates/gpui/src/platform/mac/event.rs b/crates/gpui/src/platform/mac/event.rs index a53e00958905f3d1caf3cc1a3c06086bf4d9022e..c6f838b431ac232463501be6f21e1ad8aea38e25 100644 --- a/crates/gpui/src/platform/mac/event.rs +++ b/crates/gpui/src/platform/mac/event.rs @@ -148,6 +148,8 @@ impl Event { }) } NSEventType::NSScrollWheel => window_height.map(|window_height| { + let modifiers = native_event.modifierFlags(); + Self::ScrollWheel(ScrollWheelEvent { position: vec2f( native_event.locationInWindow().x as f32, @@ -158,6 +160,10 @@ impl Event { native_event.scrollingDeltaY() as f32, ), precise: native_event.hasPreciseScrollingDeltas() == YES, + ctrl: modifiers.contains(NSEventModifierFlags::NSControlKeyMask), + alt: modifiers.contains(NSEventModifierFlags::NSAlternateKeyMask), + shift: modifiers.contains(NSEventModifierFlags::NSShiftKeyMask), + cmd: modifiers.contains(NSEventModifierFlags::NSCommandKeyMask), }) }), NSEventType::NSLeftMouseDragged diff --git a/crates/terminal/src/terminal.rs b/crates/terminal/src/terminal.rs index ff313478c5125172583365c981178950e1aa1114..ed77b0070746c5c0756af3b25a453eda8ac833bd 100644 --- a/crates/terminal/src/terminal.rs +++ b/crates/terminal/src/terminal.rs @@ -703,7 +703,7 @@ impl Terminal { ///Scroll the terminal pub fn scroll(&mut self, scroll: &ScrollWheelEvent, origin: Vector2F) { - if self.mouse_mode(false) { + if self.mouse_mode(scroll.shift) { //TODO: Currently this only sends the current scroll reports as they come in. Alacritty //Sends the *entire* scroll delta on *every* scroll event, only resetting it when //The scroll enters 'TouchPhase::Started'. Do I need to replicate this? @@ -720,6 +720,7 @@ impl Terminal { } else if self .last_mode .contains(TermMode::ALT_SCREEN | TermMode::ALTERNATE_SCROLL) + && !scroll.shift { //TODO: See above TODO, also applies here. let scroll_lines = ((scroll.delta.y() * ALACRITTY_SCROLL_MULTIPLIER)