The last of Section F, and the only thing in Panama that reads an authentication token, so most of the design is about that rather than about the number. It never refreshes the token and never writes to the credentials file. That token expires roughly hourly and Claude Code refreshes it on demand; if this refreshed it too, two processes would be rotating one credential, and a rotation invalidates the other holder's copy. The failure mode is being silently signed out of Claude Code by a status widget, which no bar indicator is worth. So it reads the token, uses it while valid, and reports "waiting for Claude Code to refresh" when not -- which covers the case that matters, because while you are using Claude Code the token is fresh, and while you are not there is nothing to watch. The token never reaches argv either: curl takes the Authorization header on stdin through --config, because a header passed as an argument sits in /proc/<pid>/cmdline for the length of the request. Same rule the password and MOK paths already follow. And it never reaches the output: the record carries percentages and timestamps and nothing else. Both are pinned, and both were checked by sabotaging the collector to pass -H and watching the contract name it. Off by default. It is a coding-tool readout, not something a general-purpose desktop shows without being asked, and it hides unless the collector has real numbers rather than displaying "unknown".
99 lines
7.1 KiB
QML
99 lines
7.1 KiB
QML
pragma Singleton
|
|
|
|
// ─────────────────────────────────────────────────────────────────────────────
|
|
// User-facing knobs. Everything here is something you might reasonably want to
|
|
// change without understanding the rest of the shell.
|
|
//
|
|
// Theme.qml holds *how it looks*; this holds *what it does*.
|
|
// ─────────────────────────────────────────────────────────────────────────────
|
|
|
|
import Quickshell
|
|
import QtQuick
|
|
|
|
Singleton {
|
|
id: root
|
|
|
|
// ── Clock ───────────────────────────────────────────────────────────────
|
|
// Carried over from GNOME: 12-hour, weekday + date shown, seconds on.
|
|
readonly property bool use24Hour: DesktopPreferences.get("use24Hour")
|
|
readonly property bool showSeconds: DesktopPreferences.get("showSeconds")
|
|
readonly property bool showWeekday: DesktopPreferences.get("showWeekday")
|
|
|
|
// ── Weather ─────────────────────────────────────────────────────────────
|
|
// Coordinates taken from the GNOME night-light setting, which had already
|
|
// resolved the location. Uses Open-Meteo, which needs no API key.
|
|
readonly property real latitude: DesktopPreferences.get("weatherLatitude")
|
|
readonly property real longitude: DesktopPreferences.get("weatherLongitude")
|
|
// Open-Meteo returns coordinates but no friendly place name. Keep the
|
|
// label deliberately general rather than exposing precise coordinates in
|
|
// the UI or guessing at a city from them.
|
|
readonly property string weatherLocation: DesktopPreferences.get("weatherLocation")
|
|
readonly property string temperatureUnit: DesktopPreferences.get("temperatureUnit")
|
|
readonly property int weatherRefreshMinutes: DesktopPreferences.get("weatherRefreshMinutes")
|
|
|
|
// ── Vitals ──────────────────────────────────────────────────────────────
|
|
// The GNOME Vitals extension showed processor usage, memory usage and GPU
|
|
// usage, in that order. Same here.
|
|
readonly property int vitalsIntervalMs: DesktopPreferences.get("vitalsIntervalMs")
|
|
readonly property bool showCpu: DesktopPreferences.get("showCpu")
|
|
readonly property bool showMemory: DesktopPreferences.get("showMemory")
|
|
readonly property bool showGpu: DesktopPreferences.get("showGpu")
|
|
readonly property bool showBattery: DesktopPreferences.get("showBattery")
|
|
readonly property bool showAgentUsage: DesktopPreferences.get("showAgentUsage")
|
|
|
|
// ── Battery ─────────────────────────────────────────────────────────────
|
|
readonly property int batteryLowPercent: DesktopPreferences.get("batteryLowPercent")
|
|
readonly property int batteryCriticalPercent: DesktopPreferences.get("batteryCriticalPercent")
|
|
|
|
// amdgpu exposes utilisation here. Verified present on this machine; the
|
|
// widget hides itself if the path is missing rather than showing zeros.
|
|
readonly property string gpuBusyPath: DesktopPreferences.get("gpuBusyPath")
|
|
|
|
// ── Night light ─────────────────────────────────────────────────────────
|
|
// Matches the (disabled) GNOME schedule: 3500K from 17:00 to 10:00.
|
|
readonly property int nightLightTemperature: DesktopPreferences.get("nightLightTemperature")
|
|
readonly property real nightLightFrom: DesktopPreferences.get("nightLightFrom")
|
|
readonly property real nightLightTo: DesktopPreferences.get("nightLightTo")
|
|
readonly property bool nightLightEnabledByDefault: DesktopPreferences.get("nightLightEnabled")
|
|
|
|
// ── Notifications ───────────────────────────────────────────────────────
|
|
readonly property int notificationTimeoutMs: DesktopPreferences.get("notificationTimeoutMs")
|
|
readonly property int notificationTimeoutCriticalMs: DesktopPreferences.get("notificationTimeoutCriticalMs") // 0 = never auto-expire
|
|
readonly property int notificationHistoryLimit: DesktopPreferences.get("notificationHistoryLimit")
|
|
readonly property int maxVisibleToasts: DesktopPreferences.get("maxVisibleToasts")
|
|
|
|
// ── Focus ──────────────────────────────────────────────────────────────
|
|
// One deliberate default rather than a preset picker: quick settings and
|
|
// the keyboard shortcut should start a useful session in one action.
|
|
readonly property int focusDurationMinutes: DesktopPreferences.get("focusDurationMinutes")
|
|
|
|
// ── Dock ────────────────────────────────────────────────────────────────
|
|
// Pinned apps, in order, taken from the GNOME dash favorites.
|
|
readonly property string dockPosition: DesktopPreferences.get("dockPosition")
|
|
readonly property var dockScreens: {
|
|
const stored = DesktopPreferences.get("dockScreens");
|
|
return Array.isArray(stored) ? stored : [];
|
|
}
|
|
readonly property var dockPinned: DesktopPreferences.get("dockPinned")
|
|
|
|
// Dash-to-Dock was set to intellihide against all windows: the dock hides
|
|
// when any window would overlap it, and comes back on hover.
|
|
readonly property bool dockAutohide: DesktopPreferences.get("dockAutohide")
|
|
|
|
// 0: reveal the instant the pointer reaches the bottom edge. A reveal delay
|
|
// is indistinguishable from lag, because the user has already committed to
|
|
// the gesture by the time the strip is hit.
|
|
readonly property int dockRevealDelayMs: DesktopPreferences.get("dockRevealDelayMs")
|
|
|
|
// Hiding keeps a delay, so brushing past the bottom edge or crossing the
|
|
// gap between two icons doesn't make the dock flicker.
|
|
readonly property int dockHideDelayMs: DesktopPreferences.get("dockHideDelayMs")
|
|
|
|
// ── Capture ─────────────────────────────────────────────────────────────
|
|
readonly property string screenshotDir: DesktopPreferences.get("screenshotDir")
|
|
readonly property string recordingDir: DesktopPreferences.get("recordingDir")
|
|
// Passed to wf-recorder. Uses VAAPI on the AMD card so recording does not
|
|
// cost CPU while gaming.
|
|
readonly property string recorderArgs: DesktopPreferences.get("recorderArgs")
|
|
}
|