aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChristian Duerr <contact@christianduerr.com>2025-07-04 02:05:01 +0000
committerGitHub <noreply@github.com>2025-07-04 02:05:01 +0000
commit5168dada106117f85f37eac6b685809b03b31b27 (patch)
tree6c45358fdcd32e9bba58b6bad6e7207a8984c529
parent2d79edab16fecfa1ce352c86c9698d078dbbb7d4 (diff)
downloadr-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.md1
-rw-r--r--alacritty/src/event.rs8
-rw-r--r--alacritty/src/input/mod.rs22
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);