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
85 lines
2.5 KiB
QML
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
|
|
});
|
|
}
|
|
}
|
|
}
|