Skip to content

Commit 03056e5

Browse files
committed
Fix drag followed by a click causing a double click
1 parent 3f999bf commit 03056e5

1 file changed

Lines changed: 32 additions & 11 deletions

File tree

desktop/src/cef/input/state.rs

Lines changed: 32 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -91,6 +91,13 @@ impl From<&PhysicalPosition<f64>> for MousePosition {
9191
}
9292
}
9393
}
94+
impl MousePosition {
95+
fn within_distance(self, other: Self) -> bool {
96+
let dx = self.x.abs_diff(other.x);
97+
let dy = self.y.abs_diff(other.y);
98+
dx <= MULTICLICK_ALLOWED_TRAVEL && dy <= MULTICLICK_ALLOWED_TRAVEL
99+
}
100+
}
94101

95102
#[derive(Default, Clone)]
96103
pub(crate) struct MouseState {
@@ -133,28 +140,31 @@ impl ClickTracker {
133140
};
134141

135142
let Some(record) = record else {
136-
*record = Some(ClickRecord { position, ..Default::default() });
143+
*record = Some(ClickRecord {
144+
down_position: position,
145+
up_position: position,
146+
..Default::default()
147+
});
137148
return ClickCount::Single;
138149
};
139150

140151
let prev_time = record.time;
141-
let prev_position = record.position;
142-
let prev_count: ClickCount = record.down_count;
143152

144153
let now = Instant::now();
145154
record.time = now;
146-
record.position = position;
147155

148156
match state {
149157
ElementState::Pressed if record.down_count == ClickCount::Triple => {
150158
*record = ClickRecord {
159+
down_position: position,
151160
down_count: ClickCount::Double,
152161
..*record
153162
};
154163
return ClickCount::Double;
155164
}
156165
ElementState::Released if record.up_count == ClickCount::Triple => {
157166
*record = ClickRecord {
167+
up_position: position,
158168
up_count: ClickCount::Double,
159169
..*record
160170
};
@@ -163,10 +173,11 @@ impl ClickTracker {
163173
_ => {}
164174
}
165175

166-
let dx = position.x.abs_diff(prev_position.x);
167-
let dy = position.y.abs_diff(prev_position.y);
168-
let within_dist = dx <= MULTICLICK_ALLOWED_TRAVEL && dy <= MULTICLICK_ALLOWED_TRAVEL;
169176
let within_time = now.saturating_duration_since(prev_time) <= MULTICLICK_TIMEOUT;
177+
let (prev_count, within_dist) = match state {
178+
ElementState::Pressed => (record.down_count, position.within_distance(record.down_position)),
179+
ElementState::Released => (record.up_count, position.within_distance(record.up_position)),
180+
};
170181

171182
let count = match (prev_count, within_time, within_dist) {
172183
(ClickCount::Double, true, true) => ClickCount::Triple,
@@ -175,8 +186,16 @@ impl ClickTracker {
175186
};
176187

177188
*record = match state {
178-
ElementState::Pressed => ClickRecord { down_count: count, ..*record },
179-
ElementState::Released => ClickRecord { up_count: count, ..*record },
189+
ElementState::Pressed => ClickRecord {
190+
down_position: position,
191+
down_count: count,
192+
..*record
193+
},
194+
ElementState::Released => ClickRecord {
195+
up_position: position,
196+
up_count: count,
197+
..*record
198+
},
180199
};
181200
count
182201
}
@@ -202,7 +221,8 @@ impl From<ClickCount> for i32 {
202221
#[derive(Clone, Copy)]
203222
struct ClickRecord {
204223
time: Instant,
205-
position: MousePosition,
224+
down_position: MousePosition,
225+
up_position: MousePosition,
206226
down_count: ClickCount,
207227
up_count: ClickCount,
208228
}
@@ -211,7 +231,8 @@ impl Default for ClickRecord {
211231
fn default() -> Self {
212232
Self {
213233
time: Instant::now(),
214-
position: Default::default(),
234+
down_position: Default::default(),
235+
up_position: Default::default(),
215236
down_count: Default::default(),
216237
up_count: Default::default(),
217238
}

0 commit comments

Comments
 (0)