diff options
| author | Christian Duerr <contact@christianduerr.com> | 2025-07-04 02:05:01 +0000 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2025-07-04 02:05:01 +0000 |
| commit | 5168dada106117f85f37eac6b685809b03b31b27 (patch) | |
| tree | 6c45358fdcd32e9bba58b6bad6e7207a8984c529 | |
| parent | 2d79edab16fecfa1ce352c86c9698d078dbbb7d4 (diff) | |
| download | r-alacritty-5168dada106117f85f37eac6b685809b03b31b27.tar.gz r-alacritty-5168dada106117f85f37eac6b685809b03b31b27.tar.bz2 r-alacritty-5168dada106117f85f37eac6b685809b03b31b27.zip | |
Add multi-sequence touch zoom support
This changes the way the touch zoom works by switching into a separate
mode when one of the touch slots is removed, allowing continuous zoom as
long as at least one slot is active.
| -rw-r--r-- | CHANGELOG.md | 1 | ||||
| -rw-r--r-- | alacritty/src/event.rs | 8 | ||||
| -rw-r--r-- | alacritty/src/input/mod.rs | 22 |
3 files changed, 20 insertions, 11 deletions
diff --git a/CHANGELOG.md b/CHANGELOG.md index 7f7914be..961f2aed 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -18,6 +18,7 @@ Notable changes to the `alacritty_terminal` crate are documented in its - Vi motions `*`, `#`, `{`, and `}` - IPC config retrieval using `alacritty msg get-config` +- Multi-sequence touch zoom sequences ### Changed diff --git a/alacritty/src/event.rs b/alacritty/src/event.rs index 5ef29430..45c654e5 100644 --- a/alacritty/src/event.rs +++ b/alacritty/src/event.rs @@ -1702,6 +1702,7 @@ pub enum TouchPurpose { Select(TouchEvent), Scroll(TouchEvent), Zoom(TouchZoom), + ZoomPendingSlot(TouchEvent), Tap(TouchEvent), Invalid(HashSet<u64, RandomState>), } @@ -1744,11 +1745,8 @@ impl TouchZoom { } /// Get active touch slots. - pub fn slots(&self) -> HashSet<u64, RandomState> { - let mut set = HashSet::default(); - set.insert(self.slots.0.id); - set.insert(self.slots.1.id); - set + pub fn slots(&self) -> (TouchEvent, TouchEvent) { + self.slots } /// Calculate distance between slots. diff --git a/alacritty/src/input/mod.rs b/alacritty/src/input/mod.rs index a003f534..57c24d49 100644 --- a/alacritty/src/input/mod.rs +++ b/alacritty/src/input/mod.rs @@ -851,7 +851,16 @@ impl<T: EventListener, A: ActionContext<T>> Processor<T, A> { *touch_purpose = match mem::take(touch_purpose) { TouchPurpose::None => TouchPurpose::Tap(touch), TouchPurpose::Tap(start) => TouchPurpose::Zoom(TouchZoom::new((start, touch))), - TouchPurpose::Zoom(zoom) => TouchPurpose::Invalid(zoom.slots()), + TouchPurpose::ZoomPendingSlot(slot) => { + TouchPurpose::Zoom(TouchZoom::new((slot, touch))) + }, + TouchPurpose::Zoom(zoom) => { + let slots = zoom.slots(); + let mut set = HashSet::default(); + set.insert(slots.0.id); + set.insert(slots.1.id); + TouchPurpose::Invalid(set) + }, TouchPurpose::Scroll(event) | TouchPurpose::Select(event) => { let mut set = HashSet::default(); set.insert(event.id); @@ -905,7 +914,7 @@ impl<T: EventListener, A: ActionContext<T>> Processor<T, A> { self.scroll_terminal(0., delta_y, 1.0); }, TouchPurpose::Select(_) => self.mouse_moved(touch.location), - TouchPurpose::Invalid(_) => (), + TouchPurpose::ZoomPendingSlot(_) | TouchPurpose::Invalid(_) => (), } } @@ -925,12 +934,13 @@ impl<T: EventListener, A: ActionContext<T>> Processor<T, A> { self.mouse_input(ElementState::Pressed, MouseButton::Left); self.mouse_input(ElementState::Released, MouseButton::Left); }, - // Invalidate zoom once a finger was released. + // Transition zoom to pending state once a finger was released. TouchPurpose::Zoom(zoom) => { - let mut slots = zoom.slots(); - slots.remove(&touch.id); - *touch_purpose = TouchPurpose::Invalid(slots); + let slots = zoom.slots(); + let remaining = if slots.0.id == touch.id { slots.1 } else { slots.0 }; + *touch_purpose = TouchPurpose::ZoomPendingSlot(remaining); }, + TouchPurpose::ZoomPendingSlot(_) => *touch_purpose = Default::default(), // Reset touch state once all slots were released. TouchPurpose::Invalid(slots) => { slots.remove(&touch.id); |