Skip to content

Commit 36366b3

Browse files
Desktop: Fix drag followed by a click causing a double click (#3721)
* Fix drag followed by a click causing a double click * Review * Fix quadruple click bug and cleanup bug: quadruple bypassing time and distance check logic * Improve readability --------- Co-authored-by: Timon <me@timon.zip>
1 parent 11b7af6 commit 36366b3

File tree

1 file changed

+29
-32
lines changed

1 file changed

+29
-32
lines changed

desktop/src/cef/input/state.rs

Lines changed: 29 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -133,51 +133,46 @@ impl ClickTracker {
133133
};
134134

135135
let Some(record) = record else {
136-
*record = Some(ClickRecord { position, ..Default::default() });
136+
*record = Some(ClickRecord {
137+
down_position: position,
138+
up_position: position,
139+
..Default::default()
140+
});
137141
return ClickCount::Single;
138142
};
139143

140-
let prev_time = record.time;
141-
let prev_position = record.position;
142-
let prev_count: ClickCount = record.down_count;
143-
144144
let now = Instant::now();
145-
record.time = now;
146-
record.position = position;
145+
let within_time = now.saturating_duration_since(record.time) <= MULTICLICK_TIMEOUT;
147146

148-
match state {
149-
ElementState::Pressed if record.down_count == ClickCount::Triple => {
150-
*record = ClickRecord {
151-
down_count: ClickCount::Double,
152-
..*record
153-
};
154-
return ClickCount::Double;
155-
}
156-
ElementState::Released if record.up_count == ClickCount::Triple => {
157-
*record = ClickRecord {
158-
up_count: ClickCount::Double,
159-
..*record
160-
};
161-
return ClickCount::Double;
162-
}
163-
_ => {}
164-
}
147+
let (prev_count, prev_position) = match state {
148+
ElementState::Pressed => (record.down_count, record.down_position),
149+
ElementState::Released => (record.up_count, record.up_position),
150+
};
165151

166152
let dx = position.x.abs_diff(prev_position.x);
167153
let dy = position.y.abs_diff(prev_position.y);
168154
let within_dist = dx <= MULTICLICK_ALLOWED_TRAVEL && dy <= MULTICLICK_ALLOWED_TRAVEL;
169-
let within_time = now.saturating_duration_since(prev_time) <= MULTICLICK_TIMEOUT;
170155

171156
let count = match (prev_count, within_time, within_dist) {
157+
(ClickCount::Single, true, true) => ClickCount::Double,
172158
(ClickCount::Double, true, true) => ClickCount::Triple,
173-
(_, true, true) => ClickCount::Double,
159+
(ClickCount::Triple, true, true) => ClickCount::Double,
174160
_ => ClickCount::Single,
175161
};
176162

177-
*record = match state {
178-
ElementState::Pressed => ClickRecord { down_count: count, ..*record },
179-
ElementState::Released => ClickRecord { up_count: count, ..*record },
180-
};
163+
record.time = now;
164+
165+
match state {
166+
ElementState::Pressed => {
167+
record.down_position = position;
168+
record.down_count = count;
169+
}
170+
ElementState::Released => {
171+
record.up_position = position;
172+
record.up_count = count;
173+
}
174+
}
175+
181176
count
182177
}
183178
}
@@ -202,7 +197,8 @@ impl From<ClickCount> for i32 {
202197
#[derive(Clone, Copy)]
203198
struct ClickRecord {
204199
time: Instant,
205-
position: MousePosition,
200+
down_position: MousePosition,
201+
up_position: MousePosition,
206202
down_count: ClickCount,
207203
up_count: ClickCount,
208204
}
@@ -211,7 +207,8 @@ impl Default for ClickRecord {
211207
fn default() -> Self {
212208
Self {
213209
time: Instant::now(),
214-
position: Default::default(),
210+
down_position: Default::default(),
211+
up_position: Default::default(),
215212
down_count: Default::default(),
216213
up_count: Default::default(),
217214
}

0 commit comments

Comments
 (0)