Files
Panama/config/dot/quickshell/wallpaper-settings-harness.qml
Gabriel Brown f8f5b25510 Make Shell a category, the bar legible, and the dock a real dock
Desktop & Dock becomes Shell — Bar, Dock, Control Center, Tiling,
Workspaces — the home for everything Quickshell draws. The settings-
management cluster moves to System as Sync & Backup, Appearance's
Shell tab dissolves, and 24-hour time finally lives on Date & Time,
which always owned it.

The bar gets what it never had: a way to survive the wallpaper. A
second neutral text family (follow theme, or forced light or dark),
a one-layer shadow under every glyph, and a gradient scrim for
wallpapers nothing else survives — all off by default, pixel-identical
until asked. Widgets earn toggles (weather, media, clipboard, calendar
countdown), the vitals cluster stops leaving a dead pill behind, and
Control Center's sections learn to step aside.

The dock graduates from MVP: a context menu with window rows, pin,
unpin, quit and new-window; scroll an icon to cycle its windows; drag
to reorder on the dock itself; hover previews with one-shot captures;
and "Add App to Dock" in the launcher. Three real bugs died en route —
menus that slid away with the autohide, a readonly-property crash on
every menu open, and a drag that drifted half a slot per icon on side
docks. The pinned-apps editor in Settings becomes a drag strip.

166 contracts; the full suite is green except two live display and
switcher tests that cannot run behind a locked session — re-verified
on unlock.

Claude-Session: https://claude.ai/code/session_01Ms2FbjQy31TVf3CEvQhGM8
2026-08-24 04:28:20 -04:00

85 lines
2.5 KiB
QML

import Quickshell
import Quickshell.Io
import QtQuick
import qs.modules.settings
ShellRoot {
id: root
property var calls: []
function record(call: string): void {
root.calls = root.calls.concat([call]);
}
WallpaperControls {
id: controls
width: 620
outputs: ["DP-2", "HDMI-A-1"]
mode: "per-monitor"
setModeAction: mode => root.record("mode:" + mode)
setIntervalAction: minutes => root.record("interval:" + minutes)
setShuffleAction: enabled => root.record("shuffle:" + enabled)
}
WallpaperPicker {
id: picker
width: 620
videoAware: false
selectedOutput: "DP-2"
mode: "single"
activeByOutput: ({ "DP-2": "/images/a.jpg", "HDMI-A-1": "/images/b.jpg" })
slideshowPaths: ["/images/b.jpg", "/images/c.jpg"]
assignments: ({ "DP-2": "/images/c.jpg" })
setSingleAction: path => root.record("single:" + path)
toggleSlideshowAction: path => root.record("toggle:" + path)
setAssignmentAction: (output, path) => root.record("assign:" + output + ":" + path)
}
IpcHandler {
target: "wallpaper-settings-test"
function activate(mode: string, path: string): string {
root.calls = [];
picker.mode = mode;
picker.activate(path);
return JSON.stringify(root.calls);
}
function selectOutput(output: string): void {
controls.selectedOutput = output;
}
function updateOutputs(outputs: string): void {
controls.outputs = outputs === "" ? [] : outputs.split("|");
}
function selectedOutput(): string { return controls.selectedOutput; }
function states(): string {
picker.mode = "single";
const single = {
current: picker.isCurrent("/images/a.jpg"),
selected: picker.selected("/images/a.jpg")
};
picker.mode = "slideshow";
const slideshow = {
current: picker.isCurrent("/images/b.jpg"),
selected: picker.selected("/images/b.jpg")
};
picker.mode = "per-monitor";
const perMonitor = {
current: picker.isCurrent("/images/c.jpg"),
selected: picker.selected("/images/c.jpg")
};
return JSON.stringify({
selectedOutput: controls.selectedOutput,
single,
slideshow,
perMonitor
});
}
}
}