Two things, both closing gaps in work that was already reported done. GNOME's Multitasking panel, in Hyprland's terms: tiling layout, split behaviour, floating-window snapping, workspace wrap-around and back-and-forth, whether applications may take focus, and whether the pointer changes the active display. Hyprland creates and destroys workspaces as you use them, so there is no fixed count to expose, and the page says so rather than leaving a conspicuous absence. The Desktop page described the first two of these as read-only facts -- "Layout: Tiling", "Workspace movement: Dynamic" -- which was never true. Both are ordinary Hyprland options that happened to have no controls, and TextRow's own documentation says a setting the user could reasonably change does not belong in it. Schema defaults are Panama's shipped values from looks.lua rather than Hyprland's own, so restoring defaults returns the desktop to how it ships. 43 mapped options now, from 35. The launcher had no light theme. vicinae.json already selected a theme per system appearance, but both entries pointed at Moon, so choosing light mode left the most frequently opened window on the desktop dark -- a hole in the light/dark work, not a missing feature. Day is authored from the same palette as the kitty Day theme so the two cannot drift, and link-dotfiles now installs every authored theme rather than only the dark one, which is why the gap survived being noticed. Its placeholder colour is not Tokyo Night Day's own: that measures 2.54:1 against the background, below the 3:1 floor for secondary text. This is 3.25:1, the same value used for neovim's light comments. Claude-Session: https://claude.ai/code/session_01BRvzt4H8XXLPVH5MyYdk9L
110 lines
4.5 KiB
QML
110 lines
4.5 KiB
QML
pragma Singleton
|
|
|
|
// Search across every setting, not just page names.
|
|
//
|
|
// The sidebar's field used to filter the twelve page labels, so "gaps",
|
|
// "wallpaper", and "repeat delay" all found nothing — which is precisely the
|
|
// thing that makes a settings app feel smaller than it is. This indexes the
|
|
// schema itself, so any setting is reachable by typing what it does, and a new
|
|
// schema entry becomes searchable with no change here.
|
|
//
|
|
// Shortcuts are indexed too: "screenshot" should find the key that takes one.
|
|
|
|
import Quickshell
|
|
import QtQuick
|
|
import qs.config
|
|
|
|
Singleton {
|
|
id: root
|
|
|
|
// Which page shows the settings in a given schema group. A group with no
|
|
// entry here still appears in results and routes to Home rather than being
|
|
// dropped, so adding a group can never make a setting unreachable.
|
|
readonly property var groupPages: ({
|
|
"clock": "appearance",
|
|
"vitals": "appearance",
|
|
"windows": "appearance",
|
|
"effects": "appearance",
|
|
"wallpaper": "appearance",
|
|
"dock": "desktop",
|
|
"focus": "desktop",
|
|
"display": "displays",
|
|
"nightLight": "displays",
|
|
"idle": "power",
|
|
"accessibility": "accessibility",
|
|
"input": "shortcuts",
|
|
"pointer": "mouse",
|
|
"touchpad": "mouse",
|
|
"multitasking": "desktop",
|
|
"weather": "appearance",
|
|
"notifications": "notifications",
|
|
"capture": "screen-intelligence"
|
|
})
|
|
|
|
// Settings that are real but have no schema entry, because the system owns
|
|
// them rather than Panama. Without these, searching "timezone" would fail
|
|
// on a settings app that plainly has one.
|
|
readonly property var extraEntries: [
|
|
{ label: "Timezone", detail: "Set the system timezone", page: "datetime" },
|
|
{ label: "Network time", detail: "Synchronise the clock with a time server", page: "datetime" },
|
|
{ label: "Wi-Fi", detail: "Managed by GNOME Settings", page: "connectivity" },
|
|
{ label: "Bluetooth", detail: "Managed by GNOME Settings", page: "connectivity" },
|
|
{ label: "Printers", detail: "Managed by GNOME Settings", page: "connectivity" },
|
|
{ label: "Default applications", detail: "Browser, mail, files", page: "applications" },
|
|
{ label: "Restore defaults", detail: "Return every Panama setting to its shipped value", page: "desktop" },
|
|
{ label: "Keyboard shortcuts", detail: "Every shortcut the compositor has bound", page: "shortcuts" }
|
|
]
|
|
|
|
function pageFor(group: string): string {
|
|
return root.groupPages[group] ?? "home";
|
|
}
|
|
|
|
// [{ label, detail, page, kind }] for a query. Empty query yields nothing:
|
|
// the sidebar shows its normal navigation in that case.
|
|
function search(query: string): var {
|
|
const needle = String(query).trim().toLowerCase();
|
|
if (needle === "")
|
|
return [];
|
|
|
|
const results = [];
|
|
const seen = {};
|
|
|
|
function add(label, detail, page, kind) {
|
|
const dedupe = `${kind}:${label}:${page}`;
|
|
if (seen[dedupe])
|
|
return;
|
|
seen[dedupe] = true;
|
|
results.push({ label: label, detail: detail, page: page, kind: kind });
|
|
}
|
|
|
|
for (const entry of PreferenceSchema.entries) {
|
|
if (entry.internal)
|
|
continue;
|
|
const haystack = `${entry.label} ${entry.detail ?? ""} ${entry.group}`.toLowerCase();
|
|
if (haystack.indexOf(needle) >= 0)
|
|
add(entry.label, entry.detail ?? "", root.pageFor(entry.group), "setting");
|
|
}
|
|
|
|
for (const entry of root.extraEntries) {
|
|
if (`${entry.label} ${entry.detail}`.toLowerCase().indexOf(needle) >= 0)
|
|
add(entry.label, entry.detail, entry.page, "setting");
|
|
}
|
|
|
|
for (const bind of Keybinds.binds) {
|
|
if (bind.description.toLowerCase().indexOf(needle) >= 0)
|
|
add(bind.description, bind.chord, "shortcuts", "shortcut");
|
|
}
|
|
|
|
// Exact prefix matches first: typing "blur" should put "Blur" above
|
|
// "Blur radius", and both above a setting that merely mentions blur in
|
|
// its explanation.
|
|
return results.sort((a, b) => {
|
|
const al = a.label.toLowerCase();
|
|
const bl = b.label.toLowerCase();
|
|
const ap = al === needle ? 0 : (al.indexOf(needle) === 0 ? 1 : 2);
|
|
const bp = bl === needle ? 0 : (bl.indexOf(needle) === 0 ? 1 : 2);
|
|
return ap !== bp ? ap - bp : al.localeCompare(bl);
|
|
}).slice(0, 40);
|
|
}
|
|
}
|