mirror of
https://github.com/kuhyx/screen-locker.git
synced 2026-11-10 21:07:14 +01:00
The demo promised three escapes and delivered none: the only way out was a hard reboot. Two independent causes, and only one of them was demo-only. launch_workout_app blocks until the app exits. Called straight from a Tk button that froze the event loop, so the Escape binding and the close button could not fire -- measured: zero handlers ran during the block, and the events were never delivered, not merely delivered late. WorkoutSession drives the same phases through `after` instead, on the main thread, so grab_release and grab_input stay where Tk requires them and the loop keeps pumping (199 ticks during a run that previously managed none). The second cause survives a healthy event loop. The Flutter app takes its own gdk_seat_grab with GDK_SEAT_CAPABILITY_ALL and never releases it, so while it is up X delivers the keyboard to it and no binding of ours can fire. Correct for production, fatal for a demo, and no flag turns it off -- so the demo's escape is a file the app cannot intercept: touch ~/.cache/stop-workout-demo. The previous commit's rationale for the blocking was wrong and is corrected here rather than left to mislead. It claimed pumping Tk would let the recovery watchdog steal the screen mid-workout; in fact release() stops the watchdog first and stop() cancels its timers outright, so there were never any ticks to race with. The blocking was incidental, which is why removing it costs the production handoff nothing. Verified with the real debug bundle under Xvfb: with the app up and holding its seat grab, the event loop is alive, the escape file terminates it, and the lock takes the grab back. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01DfJC1Wu1SEgJ6X49k5Jqtg |
||
|---|---|---|
| .. | ||
| __init__.py | ||
| _popup_form_check.py | ||
| _xvfb_reexec.py | ||
| add_scheduled_skip.py | ||
| check_enforcement_armed.py | ||
| check_file_length.py | ||
| check_flutter_coverage.sh | ||
| check_no_crdt_sync_override.sh | ||
| check_requirements_sync.py | ||
| check_silent_failures_dart.py | ||
| check_silent_failures.py | ||
| ci_mirror.sh | ||
| demo_workout_handoff.py | ||
| fix_2026_07_26_sport.py | ||
| refresh_refactor_todo.py | ||
| setup_mcp.sh | ||
| split_dart_test.py | ||
| verify_lock_popup_safety.py | ||
| verify_screen_fits.py | ||