fuzzel could only answer "which app", so launching Brave at a URL meant picking the app, waiting for it, then typing the address somewhere else. The launcher now takes a verb and an object in one line: type `gitlab.enqs.de` and every app that can open it sorts to the top, default browser first, ready for Enter — or arrow/hjkl down to Brave's New Incognito Window, which is offered as a peer of Brave itself rather than hidden behind a submenu. services/Apps.qml is the brain and holds no UI: it flattens desktop entries and their actions into one index, classifies the typed argument (url / mail / path), ranks by fuzzy match plus handler affinity plus frecency, and launches. Launching through `uwsm app` keeps each app in its own scope; entries whose Exec declares no field code (Brave's `--incognito` action, among others) are launched by tokenising Exec per the Desktop Entry spec and appending the argument, never via `sh -c`. Four prefixes reuse the same window, so there is one picker and one set of keys: `>` runs a command, `=` evaluates arithmetic, `:` is clipboard history (cliphist, which had been a second fuzzel invocation), and a dmenu mode is driven over IPC. quickshell/scripts/takemi-dmenu is the bridge for that last one — a `fuzzel --dmenu` drop-in for scripts that want a picker, symlinked into ~/.local/bin. fluxo's bt menu now goes through it. Living in the Quickshell process means the window is on screen on the frame the bind fires, with no process to spawn. Removes fuzzel entirely: its config, its theme submodule, the package, and the last consumers (the bar sigil, fluxo's menu_command). Also drops hypr/scripts/powermenu.sh, which was fuzzel-based and bound to nothing.
45 lines
1.4 KiB
QML
45 lines
1.4 KiB
QML
import QtQuick
|
|
import Quickshell
|
|
import "root:/config"
|
|
import "root:/components"
|
|
import "root:/services"
|
|
|
|
// The house mark, far left. Click launches the app menu; right click reloads
|
|
// the shell, which is handy while tweaking the config.
|
|
BarPill {
|
|
id: root
|
|
|
|
required property var screenRef
|
|
|
|
accent: Theme.accent
|
|
slash: true
|
|
padding: Theme.padS
|
|
lean: Theme.skew
|
|
implicitWidth: Theme.barHeight + contentPad
|
|
|
|
onClicked: Actions.toggleLauncher()
|
|
onRightClicked: Actions.reloadShell()
|
|
|
|
// The wordmark. Was the Death arcana skull (nf-md-skull, U+F068C) — a
|
|
// pictogram in a shell that otherwise says everything in heavy italic
|
|
// type. SplitText puts it in the display face with the crimson-and-black
|
|
// offset every other heading carries, so the house mark is built out of
|
|
// the same parts as the rest of the bar.
|
|
SplitText {
|
|
id: mark
|
|
anchors.centerIn: parent
|
|
text: "P5"
|
|
pixelSize: Theme.fsLarge
|
|
letterSpacing: 0
|
|
color: root.hovered ? Theme.accent : Theme.primary
|
|
}
|
|
|
|
// Kick the ghosts out and let them snap back. The skull could spin a full
|
|
// turn and still read as a skull; a wordmark upside down just reads as
|
|
// broken, so the click gets the glitch instead.
|
|
Connections {
|
|
target: root
|
|
function onClicked() { mark.glitch(); }
|
|
}
|
|
}
|