Skip to content

Commit 5ab0b00

Browse files
Owen McGirrOwen McGirr
authored andcommitted
Clean up injected input when Remote resets scanning
- Route Remote reset edges through the existing cleanup and retry path before processing more input. - Verify interrupted drag cleanup retains failed releases for retry. 🤖 Auto-generated
1 parent f6bdaa2 commit 5ab0b00

2 files changed

Lines changed: 26 additions & 9 deletions

File tree

src-tauri/src/scan_executor.rs

Lines changed: 21 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -235,7 +235,11 @@ mod tests {
235235
}
236236
fn set_pointer_button(&mut self, button: MouseButton, down: bool) -> Result<(), String> {
237237
self.events.push(format!("button {button:?} {down}"));
238-
Ok(())
238+
if !down && self.fail_release {
239+
Err("release failed".into())
240+
} else {
241+
Ok(())
242+
}
239243
}
240244
fn scroll(&mut self, dx: i32, dy: i32) -> Result<(), String> {
241245
self.events.push(format!("scroll {dx} {dy}"));
@@ -262,6 +266,22 @@ mod tests {
262266
}
263267
}
264268
#[test]
269+
fn resetting_an_executing_drag_releases_input_and_retains_failed_cleanup_for_retry() {
270+
let mut input = DesktopInput::new(Fake::default());
271+
execute(&mut input, Request::DragStart((100, 200)), true).unwrap();
272+
execute(&mut input, Request::DragMove((150, 250)), true).unwrap();
273+
input.injector.fail_release = true;
274+
assert!(input.release_all().is_err());
275+
assert!(input.has_active_drag());
276+
input.injector.fail_release = false;
277+
input.release_all().unwrap();
278+
assert!(!input.has_active_drag());
279+
assert!(input
280+
.injector
281+
.events
282+
.ends_with(&["button Left false".into()]));
283+
}
284+
#[test]
265285
fn editing_shortcuts_preserve_focus_and_release_keys_in_reverse_order() {
266286
let mut input = DesktopInput::new(Fake::default());
267287
execute(

src-tauri/src/scanning_runtime.rs

Lines changed: 5 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -524,17 +524,14 @@ fn tick<A: Adapter>(app: &AppHandle) {
524524
publish::<A>(app);
525525
}
526526
for edge in edges {
527+
if matches!(edge, crate::remote_scan::Edge::Reset) {
528+
reset_scanner::<A>(app, "Remote switches changed. Scan reset.");
529+
return;
530+
}
527531
let action = {
528532
let mut d = c.data.lock().unwrap_or_else(|p| p.into_inner());
529533
match edge {
530-
crate::remote_scan::Edge::Reset => {
531-
d.pressed.cancel();
532-
d.remote_hold_started = None;
533-
if let Some(engine) = d.engine.as_mut() {
534-
engine.reset();
535-
}
536-
None
537-
}
534+
crate::remote_scan::Edge::Reset => unreachable!(),
538535
crate::remote_scan::Edge::Down(id) => {
539536
if !d.pressed.held() {
540537
d.remote_hold_started = Some(now_ms);

0 commit comments

Comments
 (0)