@@ -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 ) ]
96103pub ( 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 ) ]
203222struct 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