shell: the keyboard owns the bottom edge, and nothing measures it
Two bugs with one cause — the bottom edge was being reasoned about twice, by hand, against a compositor that is gone. The rail set ExclusionMode.Ignore (exclusive zone -1: ignore what everyone else reserved, anchor to the whole screen) and then computed its own lift from the keyboard's height, probed by shelling out to `hyprctl -j layers`. Under viewtop there is no hyprctl, so every probe threw a JSON.parse on empty output and logged it in a loop every second or two, forever, while the margin stayed at a hardcoded fallback measured against a keyboard that is not the one running. A 200px fallback against some other height is exactly "the pill spawns in the middle of the keyboard". Zone 0 with Normal — the idiom SidebarRight and ReloadPopup already use — reserves nothing and respects what others reserved, so the compositor anchors the rail to the top of the keyboard's exclusive zone. Correct at any height, any rotation, across a swap, with nothing to go stale. The probe, its retry timer and probeOskHeight() are deleted rather than ported: a second measurement of a number the protocol already carries is what this class of bug is made of. The dock consulted oskOpen only in its empty-desktop branch, below effectivePinned, so a PINNED dock ignored the keyboard and sat under it. DockManifest.dockState() has always reported "suppressed-by-osk" and _blockReason() has always refused mutations with "osk-open" — the manifest promised a suppression the dock never performed, so the agent's view of the screen and the screen disagreed. The check moves above pinning and applies in every state, staying below dockRevealPulse because an explicit reveal is the one thing that should outrank the keyboard. Verified on the phone: the probe loop is gone from the journal. The resulting pill and dock positions want eyes on the glass.
This commit is contained in:
parent
1f028c129e
commit
ca44b0be2a
2 changed files with 64 additions and 83 deletions
|
|
@ -79,6 +79,24 @@ Scope { // Scope
|
|||
// glance at the dock while the keyboard is up.
|
||||
if (GlobalStates.dockRevealPulse)
|
||||
return Dock.DockState.Shown;
|
||||
// The keyboard owns the bottom edge, pinned or not.
|
||||
//
|
||||
// This check used to live below `effectivePinned` and inside the
|
||||
// empty-desktop branch only, so a PINNED dock ignored the OSK entirely
|
||||
// and sat under the keyboard — "the dock is still always showing with
|
||||
// keyboard". Meanwhile DockManifest.dockState() has always reported
|
||||
// "suppressed-by-osk" whenever oskOpen, and _blockReason() refuses
|
||||
// mutations with "osk-open": the manifest promised a suppression the
|
||||
// dock did not perform, so the agent's view of the screen and the
|
||||
// screen disagreed. Same shape as the pill layerrule in
|
||||
// INTERFACE-ARCHITECTURE — a documented guarantee the code does not
|
||||
// enforce.
|
||||
//
|
||||
// Below the pulse deliberately: an explicit reveal is the one thing
|
||||
// that outranks the keyboard, because glancing at the dock while
|
||||
// typing is exactly what it is for.
|
||||
if (GlobalStates.oskOpen)
|
||||
return Dock.DockState.Hidden;
|
||||
// Rail swipe-down dismissed a visible dock; swipe up brings it back.
|
||||
if (GlobalStates.dockSuppressed)
|
||||
return Dock.DockState.Hidden;
|
||||
|
|
@ -86,9 +104,9 @@ Scope { // Scope
|
|||
return Dock.DockState.Pinned;
|
||||
if (root.previewShowing)
|
||||
return Dock.DockState.Shown;
|
||||
// Empty desktop (nothing focused) reveals the dock, unless the OSK
|
||||
// took the bottom edge.
|
||||
if (!GlobalStates.oskOpen && !ToplevelManager.activeToplevel?.activated)
|
||||
// Empty desktop (nothing focused) reveals the dock. The OSK is handled
|
||||
// above now, for every state rather than only this one.
|
||||
if (!ToplevelManager.activeToplevel?.activated)
|
||||
return Dock.DockState.Shown;
|
||||
return Dock.DockState.Hidden;
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in a new issue