face: locking sends her away, and she stays away
Gated on screenLockSecure, the compositor's ack, not on screenLocked. The request drifts: measured on the phone, `session lock` answered already-locked while logind reported LockedHint=no and the phone was in use. That is a shadow copy of state the protocol owns, and a face gated on it would have been permanently dismissed with nothing on screen to explain why. No return on unlock. You come back to the clock and summon her if you want her, rather than finding whatever was left on.
This commit is contained in:
parent
c8dc24d3d1
commit
075ddf19eb
1 changed files with 38 additions and 10 deletions
|
|
@ -25,6 +25,7 @@ pragma Singleton
|
|||
import QtQuick
|
||||
import Quickshell
|
||||
import Quickshell.Io
|
||||
import qs
|
||||
import qs.modules.common
|
||||
|
||||
Singleton {
|
||||
|
|
@ -79,16 +80,6 @@ Singleton {
|
|||
root.join();
|
||||
}
|
||||
|
||||
// How big she is on the glass.
|
||||
//
|
||||
// She has to be **smaller than the usable zone**, and that is the whole
|
||||
// reason this is set rather than left to the host's default. The
|
||||
// compositor stands furniture up centred and lifted off the bottom edge —
|
||||
// but it can only lift her into slack that exists, and at the default
|
||||
// 540x960 she measured 997 tall against a 931 zone (GTK adds ~37px of
|
||||
// titlebar even with decorations off), so she overflowed, had no slack,
|
||||
// and sat pinned at the top with nowhere to go. Under the zone, and the
|
||||
// lift is what puts her up by the clock instead of down on the dock.
|
||||
// Her size on the glass, and the canvas is not a crop — it is her scale.
|
||||
//
|
||||
// The Cubism view fits the rig to the canvas, so shrinking the canvas
|
||||
|
|
@ -286,6 +277,43 @@ Singleton {
|
|||
sock.write(JSON.stringify(msg) + "\n");
|
||||
}
|
||||
|
||||
// ## She is the user's, so she leaves when the user does
|
||||
//
|
||||
// Casey, 2026-08-06: "if I lock the screen, she should probably assume to
|
||||
// turn off... she's not for everyone, just the user." Explicitly *not* the
|
||||
// same as switching to an app — she persists across app use; only the lock
|
||||
// takes her away.
|
||||
//
|
||||
// Gated on `screenLockSecure` — the compositor's acknowledgement — and NOT
|
||||
// on `screenLocked`, which is only the request.
|
||||
//
|
||||
// The request drifts. Measured on the phone 2026-08-06: `session lock`
|
||||
// answered `already-locked` while logind reported `LockedHint=no` and the
|
||||
// phone was in use, so `screenLocked` had been stuck true for some time.
|
||||
// That is CLAUDE.md's rule 2 exactly — a shadow copy of state the protocol
|
||||
// owns — and a face gated on it would have been permanently dismissed with
|
||||
// nothing on screen to explain why. `screenLockSecure` is the one
|
||||
// GlobalStates itself calls "the real 'session is locked' signal".
|
||||
//
|
||||
// Nothing is lost by waiting for the ack: the compositor composites lock
|
||||
// surfaces and nothing else while locked, so she is already off the glass
|
||||
// before this runs. This is about not holding 283MB of webview through a
|
||||
// locked night, not about disclosure.
|
||||
// She does not come back on unlock, deliberately. Casey, 2026-08-06: "I
|
||||
// want it recognized it locked, and going back to clock, and being clock
|
||||
// until we retrigger it." Unlocking returns you to the clock, and summoning
|
||||
// her is a double tap away — so the state you find is the plain one, and
|
||||
// the face is something you choose each time rather than something that
|
||||
// was left on.
|
||||
Connections {
|
||||
target: GlobalStates
|
||||
|
||||
function onScreenLockSecureChanged() {
|
||||
if (GlobalStates.screenLockSecure && root.joined)
|
||||
root.leave();
|
||||
}
|
||||
}
|
||||
|
||||
// Where fingers are, straight from the compositor, so she can look at them.
|
||||
//
|
||||
// Only open while she is up, because the compositor throttles but does not
|
||||
|
|
|
|||
Loading…
Reference in a new issue