mirror of
https://github.com/kuhyx/screen-locker.git
synced 2026-11-11 19:33:56 +01:00
The phone is lost, so no workout can be recorded and enforcement has been disarmed since 2026-08-21. This gives the PC a first-class way to do the workout, reusing the existing app rather than reimplementing the progression rules a second time -- two implementations would guarantee the divergence the "same weights everywhere" requirement forbids. Storage: sqflite has no Linux plugin, so main() installs sqflite_common_ffi's factory, which runs the same schema and migrations against the same SQL. It was already a dev dependency driving the test suite; this only promotes it. Auth: the account password in ~/.config/crdt-sync no longer authenticates (verified: HTTP 400 INVALID_LOGIN_CREDENTIALS). The PC fleet has been running on the cached refresh token all along, so the desktop credential store reads that same 0600 file -- the Dart and Python credential JSON keys are already identical -- and passes null instead of the stale password. This also avoids google_sign_in, which ships no Linux implementation. Lock mode: --lock-mode makes the window the lock surface. There is no Dart API for this, so the runner sets override-redirect and takes an exclusive gdk_seat_grab. Two details cost a debugging cycle each and are commented in place: override-redirect must be set BEFORE the first map, or the window stays mapped and never repaints; and gtk_window_fullscreen() only ASKS the window manager, which cannot see an override-redirect window -- so the geometry is set from the monitor directly, otherwise a strip of live desktop is left uncovered at the edge of a larger screen. The grab is acquired by retry rather than by asking the supervisor to release first: the Python locker keeps its grab while this window maps on top, so the screen is covered continuously instead of exposing the desktop for the whole of Flutter's cold start. Verified against the live data: pulls all 7 exercises from Firebase (Bench 17.5x12, RDL 27.5x8, Row 25x6, Situp 10x31 -- the real weights, not factory defaults), leaves the remote progression byte-identical, and mints its own device id rather than reusing the phone's. A Tk client is refused the grab while the lock holds it. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01DfJC1Wu1SEgJ6X49k5Jqtg
24 lines
998 B
Dart
24 lines
998 B
Dart
/// Whether this process is acting as the screen lock.
|
|
///
|
|
/// The Linux runner takes the X grab and drops the window decorations when
|
|
/// `--lock-mode` is passed (see `linux/runner/my_application.cc`); this is the
|
|
/// Dart half, which removes the ways *out* of the app. Both halves read the
|
|
/// same argument so they can never disagree about which mode is live.
|
|
///
|
|
/// The distinction matters because a lock the user can dismiss is not a lock:
|
|
/// with enforcement armed, leaving the workout early has to be impossible
|
|
/// rather than merely discouraged.
|
|
library;
|
|
|
|
/// True when the process was started with `--lock-mode`.
|
|
///
|
|
/// Set once from `main()`; defaults to false so every test and the ordinary
|
|
/// windowed launch behave exactly as before.
|
|
bool lockModeEnabled = false;
|
|
|
|
/// The flag the runner and the Dart side agree on.
|
|
const String kLockModeFlag = '--lock-mode';
|
|
|
|
/// Returns whether [args] requests lock mode.
|
|
bool parseLockMode(List<String> args) => args.contains(kLockModeFlag);
|