Desktop: Support triple-click inputs (#3671)

* Fix triple-click text to select paragraph on desktop

* fixup

---------

Co-authored-by: Timon <me@timon.zip>
This commit is contained in:
Vishnu Tejas 2026-02-03 17:45:08 +05:30 committed by GitHub
parent 8e8428a572
commit 2e297777a0
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
1 changed files with 14 additions and 7 deletions

View File

@ -139,25 +139,26 @@ impl ClickTracker {
let prev_time = record.time;
let prev_position = record.position;
let prev_count: ClickCount = record.down_count;
let now = Instant::now();
record.time = now;
record.position = position;
match state {
ElementState::Pressed if record.down_count == ClickCount::Double => {
ElementState::Pressed if record.down_count == ClickCount::Triple => {
*record = ClickRecord {
down_count: ClickCount::Single,
down_count: ClickCount::Double,
..*record
};
return ClickCount::Single;
return ClickCount::Double;
}
ElementState::Released if record.up_count == ClickCount::Double => {
ElementState::Released if record.up_count == ClickCount::Triple => {
*record = ClickRecord {
up_count: ClickCount::Single,
up_count: ClickCount::Double,
..*record
};
return ClickCount::Single;
return ClickCount::Double;
}
_ => {}
}
@ -167,7 +168,11 @@ impl ClickTracker {
let within_dist = dx <= MULTICLICK_ALLOWED_TRAVEL && dy <= MULTICLICK_ALLOWED_TRAVEL;
let within_time = now.saturating_duration_since(prev_time) <= MULTICLICK_TIMEOUT;
let count = if within_time && within_dist { ClickCount::Double } else { ClickCount::Single };
let count = match (prev_count, within_time, within_dist) {
(ClickCount::Double, true, true) => ClickCount::Triple,
(_, true, true) => ClickCount::Double,
_ => ClickCount::Single,
};
*record = match state {
ElementState::Pressed => ClickRecord { down_count: count, ..*record },
@ -182,12 +187,14 @@ pub(crate) enum ClickCount {
#[default]
Single,
Double,
Triple,
}
impl From<ClickCount> for i32 {
fn from(count: ClickCount) -> i32 {
match count {
ClickCount::Single => 1,
ClickCount::Double => 2,
ClickCount::Triple => 3,
}
}
}