Watch
1
0
Fork
You've already forked souveraine
0
souveraine/surfaces/quickshell/GlobalStates.qml
Fimeg 5cb1be06cd lock primitives: power-from-lock, login1 polkit rule, gesture rail progress
seat0-active polkit rule so power off/reboot/suspend stop returning
challenge into a session with no polkit agent on the lock surface.
Lock-surface buttons stay gated behind allowPowerFromLock (opt-in) and
requirePasswordToPower. SystemGestureRail progressive gesture + mission
control nav flag.
2026-07-19 22:13:08 -04:00

133 lines
5.3 KiB
QML

// Souveraine patch to ii's stock GlobalStates.qml.
//
// Adds dockRevealed: the explicit, persistent dock state driven by the
// Souveraine's integrated navigation rail. Everything else in this file is
// unchanged stock ii — diff against upstream before re-applying this patch if
// ii updates.
import qs.modules.common
import qs.services
import QtQuick
import Quickshell
import Quickshell.Hyprland
import Quickshell.Io
pragma Singleton
pragma ComponentBehavior: Bound
Singleton {
id: root
property bool barOpen: true
property bool crosshairOpen: false
property bool sidebarLeftOpen: false
property bool sidebarRightOpen: false
property bool mediaControlsOpen: false
property bool osdBrightnessOpen: false
property bool osdVolumeOpen: false
property bool oskOpen: false
property bool overlayOpen: false
property bool overviewOpen: false
property bool regionSelectorOpen: false
property bool searchOpen: false
// `screenLocked` is the shell's lock *request*: it drives WlSessionLock
// and hides ordinary surfaces immediately. It is deliberately separate
// from `screenLockSecure`, which is WlSessionLock.secure and only becomes
// true once the compositor has acknowledged the lock. Consumers that
// disclose personal data must gate on secure, not merely on the request.
property bool screenLocked: false
property bool screenLockSecure: false
property bool screenLockContainsCharacters: false
property bool screenUnlockFailed: false
property bool screenTranslatorOpen: false
property bool sessionOpen: false
property bool superDown: false
property bool superReleaseMightTrigger: true
property real superPressTime: 0
property real superLastPressDuration: -1
property real superLastReleaseTime: 0
property bool wallpaperSelectorOpen: false
property bool workspaceShowNumbers: false
// In fullscreen this is the only way the dock becomes visible:
// the navigation rail swipe sets/clears it. It deliberately has no timer
// or secondary state.
property bool dockRevealed: false
// Mission Control: the Souveraine process/task surface, raised by a
// triple swipe-up on the navigation rail. A first-class shell state in
// its own right (like overviewOpen) — the rail only sets it; the
// MissionControl surface owns everything else. Deliberately distinct
// from overviewOpen (the app launcher/search) — this is the running-work
// view, reached by escalating the same upward gesture past a single dock
// reveal.
property bool missionControlOpen: false
// A rail swipe-down on a visible dock dismisses it in ANY state —
// including pinned and shown-on-empty-desktop, which dockRevealed alone
// can't reach (it only governs the fullscreen case). Swipe up clears it.
property bool dockSuppressed: false
// Transient dock reveal: shows the dock for a few seconds and restores
// whatever state ruled before. Callers: the `osk pulseDock` IPC (glance
// at the dock without closing the keyboard) and the agent's harness.
// Restored 2026-07-16 — the definition was lost in a refactor while its
// IPC caller in OnScreenKeyboard.qml survived, so pulseDock threw.
property bool dockRevealPulse: false
function pulseDockReveal() {
root.dockRevealPulse = true;
dockRevealPulseTimer.restart();
}
Timer {
id: dockRevealPulseTimer
interval: 3000
onTriggered: root.dockRevealPulse = false
}
// True while a dock icon drag is in flight. Set by DockAppButton's drag
// lifecycle, read by DockManifest's state checks so structural edits
// (pin/stack mutations) can't land mid-drag and rewrite dock.stacks out
// from under a commit.
property bool dockDragInProgress: false
function superPressDuration() {
const now = Date.now();
if (root.superPressTime > 0)
return now - root.superPressTime;
if (root.superLastReleaseTime > 0 && now - root.superLastReleaseTime < 250)
return root.superLastPressDuration;
return -1;
}
function shouldSuppressSuperReleaseSearch() {
const autoHide = Config?.options?.bar?.autoHide;
const showWhenPressingSuper = autoHide?.showWhenPressingSuper;
if (!autoHide?.enable || !showWhenPressingSuper?.enable || !showWhenPressingSuper?.suppressSearchOnHold)
return false;
const duration = root.superPressDuration();
return duration >= (showWhenPressingSuper?.suppressSearchDelay ?? showWhenPressingSuper?.delay ?? 140);
}
onSidebarRightOpenChanged: {
if (GlobalStates.sidebarRightOpen) {
Notifications.timeoutAll();
Notifications.markAllRead();
}
}
GlobalShortcut {
name: "workspaceNumber"
description: "Hold to show workspace numbers, release to show icons"
onPressed: {
root.superDown = true
root.superPressTime = Date.now()
root.superLastPressDuration = -1
}
onReleased: {
const now = Date.now()
if (root.superPressTime > 0)
root.superLastPressDuration = now - root.superPressTime
root.superLastReleaseTime = now
root.superPressTime = 0
root.superDown = false
}
}
}