Watch
1
0
Fork
You've already forked souveraine
0

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:
Fimeg 2026-08-07 01:11:13 -04:00
commit 075ddf19eb

View file

@ -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