app-launcher to just launcher

This commit is contained in:
David Heinemeier Hansson
2026-05-20 13:57:22 +02:00
parent ea1b0e7ced
commit 41425481db
20 changed files with 75 additions and 55 deletions
+2 -2
View File
@@ -5,8 +5,8 @@
-- Keep the bar instant: no layer-shell fade/slide animation. -- Keep the bar instant: no layer-shell fade/slide animation.
hl.layer_rule({ match = { namespace = "omarchy-bar" }, no_anim = true, animation = "none" }) hl.layer_rule({ match = { namespace = "omarchy-bar" }, no_anim = true, animation = "none" })
-- App launcher, image selector, emoji picker, and clipboard overlays should also pop without animation. -- Launcher, image selector, emoji picker, and clipboard overlays should also pop without animation.
hl.layer_rule({ match = { namespace = "^(omarchy-menu|omarchy-app-launcher|omarchy-image-selector|omarchy-emoji-picker|omarchy-clipboard-picker)$" }, no_anim = true, animation = "none" }) hl.layer_rule({ match = { namespace = "^(omarchy-menu|omarchy-launcher|omarchy-image-selector|omarchy-emoji-picker|omarchy-clipboard-picker)$" }, no_anim = true, animation = "none" })
-- Bar settings floats centered with a sensible default size instead of -- Bar settings floats centered with a sensible default size instead of
-- tiling — it's a transient dialog, not a workspace surface. -- tiling — it's a transient dialog, not a workspace surface.
+1 -1
View File
@@ -1,4 +1,4 @@
o.bind("SUPER + SPACE", "Launch apps", "omarchy-shell shell toggle omarchy.app-launcher \"{}\"") o.bind("SUPER + SPACE", "Launch apps", "omarchy-shell shell toggle omarchy.launcher \"{}\"")
o.bind("SUPER + CTRL + E", "Emoji picker", "omarchy-shell shell toggle omarchy.emoji-picker \"{}\"") o.bind("SUPER + CTRL + E", "Emoji picker", "omarchy-shell shell toggle omarchy.emoji-picker \"{}\"")
o.bind("SUPER + CTRL + C", "Capture menu", "omarchy-shell menu toggle capture") o.bind("SUPER + CTRL + C", "Capture menu", "omarchy-shell menu toggle capture")
o.bind("SUPER + CTRL + O", "Toggle menu", "omarchy-shell menu toggle toggle") o.bind("SUPER + CTRL + O", "Toggle menu", "omarchy-shell menu toggle toggle")
+2 -2
View File
@@ -78,7 +78,7 @@ Omarchy is built on:
| **Arch Linux** | Base OS | `/etc/`, `~/.config/` | | **Arch Linux** | Base OS | `/etc/`, `~/.config/` |
| **Hyprland** | Wayland compositor/WM | `~/.config/hypr/` | | **Hyprland** | Wayland compositor/WM | `~/.config/hypr/` |
| **Omarchy shell** | Status bar + notifications (Quickshell) | `~/.config/omarchy/shell.json` | | **Omarchy shell** | Status bar + notifications (Quickshell) | `~/.config/omarchy/shell.json` |
| **App launcher** | Quickshell app launcher | `~/.config/omarchy/shell.json` | | **Launcher** | Quickshell launcher | `~/.config/omarchy/shell.json` |
| **Alacritty/Foot/Kitty/Ghostty** | Terminals | `~/.config/<terminal>/` | | **Alacritty/Foot/Kitty/Ghostty** | Terminals | `~/.config/<terminal>/` |
| **Omarchy OSD** | On-screen display | Quickshell plugin | | **Omarchy OSD** | On-screen display | Quickshell plugin |
@@ -201,7 +201,7 @@ cp ~/.config/hypr/bindings.conf ~/.config/hypr/bindings.conf.bak.$(date +%s)
# 4. Apply changes # 4. Apply changes
# - Hyprland: auto-reloads on save, but MUST validate with `hyprctl reload` and `hyprctl configerrors` # - Hyprland: auto-reloads on save, but MUST validate with `hyprctl reload` and `hyprctl configerrors`
# - Omarchy shell: shell.json hot-reloads; use `omarchy-restart-shell` for plugin/widget code changes # - Omarchy shell: shell.json hot-reloads; use `omarchy-restart-shell` for plugin/widget code changes
# - App launcher: restart with `omarchy restart shell` # - Launcher: restart with `omarchy restart shell`
# - Terminals: MUST restart with `omarchy restart terminal` # - Terminals: MUST restart with `omarchy restart terminal`
``` ```
+1 -1
View File
@@ -13,7 +13,7 @@
// checked shell condition; append ✓ when it succeeds // checked shell condition; append ✓ when it succeeds
// Root Menu // Root Menu
"apps": {"icon":"󰀻","label":"Apps","aliases":["app","applications"],"keywords":"launch launcher quickshell","action":"omarchy-shell shell summon omarchy.app-launcher '{}'"}, "apps": {"icon":"󰀻","label":"Apps","aliases":["app","applications"],"keywords":"launch launcher quickshell","action":"omarchy-shell shell summon omarchy.launcher '{}'"},
"learn": {"icon":"󰧑","label":"Learn","keywords":"manual docs help reference"}, "learn": {"icon":"󰧑","label":"Learn","keywords":"manual docs help reference"},
"trigger": {"icon":"󱓞","label":"Trigger","keywords":"actions capture share toggle hardware reminder"}, "trigger": {"icon":"󱓞","label":"Trigger","keywords":"actions capture share toggle hardware reminder"},
"style": {"icon":"","label":"Style","keywords":"theme background font bar quickshell hyprland appearance"}, "style": {"icon":"","label":"Style","keywords":"theme background font bar quickshell hyprland appearance"},
+2 -2
View File
@@ -127,8 +127,8 @@ border = "{{ accent }}"
border-alpha = 1.0 border-alpha = 1.0
countdown = "{{ accent }}" countdown = "{{ accent }}"
[app-launcher] [launcher]
# Same six tokens as [menu], applied to the app launcher overlay. Alpha # Same six tokens as [menu], applied to the launcher overlay. Alpha
# companions go from 0 (invisible) to 1 (opaque). scrim is the full-screen # companions go from 0 (invisible) to 1 (opaque). scrim is the full-screen
# dim layer behind the card; background is the card itself. Defaults # dim layer behind the card; background is the card itself. Defaults
# mirror [menu] with the card at 0.95 to preserve the legacy translucency. # mirror [menu] with the card at 0.95 to preserve the legacy translucency.
+2 -2
View File
@@ -116,7 +116,7 @@ The shell exposes these tokens to QML via two singletons in
- `Color` — palette (`foreground`, `background`, `accent`, `urgent`) - `Color` — palette (`foreground`, `background`, `accent`, `urgent`)
and per-surface roles (`Color.bar.*`, `Color.popups.*`, and per-surface roles (`Color.bar.*`, `Color.popups.*`,
`Color.tooltip.*`, `Color.notifications.*`, `Color.menu.*`, `Color.tooltip.*`, `Color.notifications.*`, `Color.menu.*`,
`Color.appLauncher.*`, `Color.imagePicker.*`, `Color.polkit.*`, `Color.launcher.*`, `Color.imagePicker.*`, `Color.polkit.*`,
`Color.lock.*`). The clipboard and emoji pickers share `Color.menu.*`. `Color.lock.*`). The clipboard and emoji pickers share `Color.menu.*`.
- `Style` — structural tokens (`cornerRadius`), shared interactive - `Style` — structural tokens (`cornerRadius`), shared interactive
state tokens/helpers, spacing (`Style.spacing.*` / `Style.space(px)`), state tokens/helpers, spacing (`Style.spacing.*` / `Style.space(px)`),
@@ -131,7 +131,7 @@ and `selected`. State colors accept palette roles (`foreground`,
`accent`, `urgent`, `background`) or hex strings; the default template `accent`, `urgent`, `background`) or hex strings; the default template
ships hex values. Fill/border alphas are applied to that state's color. ships hex values. Fill/border alphas are applied to that state's color.
Surfaces like `[menu]`, `[app-launcher]`, and `[image-picker]` define Surfaces like `[menu]`, `[launcher]`, and `[image-picker]` define
their own `selected-*` tokens and do **not** inherit from `[controls]`. their own `selected-*` tokens and do **not** inherit from `[controls]`.
`[controls]` only governs the shared button/dropdown chrome. `[controls]` only governs the shared button/dropdown chrome.
+2 -2
View File
@@ -1,4 +1,4 @@
echo "Remove Walker app-launcher services and Elephant providers" echo "Remove Walker launcher services and Elephant providers"
pkill elephant 2>/dev/null || true pkill elephant 2>/dev/null || true
systemctl --user disable --now elephant.service 2>/dev/null || true systemctl --user disable --now elephant.service 2>/dev/null || true
@@ -10,7 +10,7 @@ sudo rm -f /etc/pacman.d/hooks/walker-restart.hook
for bindings_file in ~/.config/hypr/bindings/utilities.lua ~/.config/hypr/bindings.lua; do for bindings_file in ~/.config/hypr/bindings/utilities.lua ~/.config/hypr/bindings.lua; do
if [[ -f $bindings_file ]]; then if [[ -f $bindings_file ]]; then
sed -i 's#omarchy-launch-walker#omarchy-shell shell toggle omarchy.app-launcher \\"{}\\"#g' "$bindings_file" sed -i 's#omarchy-launch-walker#omarchy-shell shell toggle omarchy.launcher \\"{}\\"#g' "$bindings_file"
fi fi
done done
+20
View File
@@ -0,0 +1,20 @@
echo "Rename app launcher shell plugin to launcher"
config_files=(
"$HOME/.config/hypr/bindings/utilities.lua"
"$HOME/.config/hypr/bindings.lua"
"$HOME/.config/hypr/apps/omarchy-shell.lua"
"$HOME/.config/omarchy/omarchy-menu.jsonc"
"$HOME/.config/omarchy/current/theme/shell.toml"
)
for config_file in "${config_files[@]}"; do
if [[ -f $config_file ]]; then
sed -i \
-e 's/omarchy\.app-launcher/omarchy.launcher/g' \
-e 's/omarchy-app-launcher/omarchy-launcher/g' \
-e 's/\[app-launcher\]/[launcher]/g' \
-e 's/app-launcher\./launcher./g' \
"$config_file"
fi
done
+8 -8
View File
@@ -66,14 +66,14 @@ QtObject {
property color border: root.composed("notifications.border", "notifications.border-alpha", root.accent, 1.0) property color border: root.composed("notifications.border", "notifications.border-alpha", root.accent, 1.0)
property color countdown: root.pick("notifications.countdown", root.accent) property color countdown: root.pick("notifications.countdown", root.accent)
} }
readonly property QtObject appLauncher: QtObject { readonly property QtObject launcher: QtObject {
property color background: root.composed("app-launcher.background", "app-launcher.background-alpha", root.background, 1.0) property color background: root.composed("launcher.background", "launcher.background-alpha", root.background, 1.0)
property color text: root.pick("app-launcher.text", root.foreground) property color text: root.pick("launcher.text", root.foreground)
property color border: root.composed("app-launcher.border", "app-launcher.border-alpha", root.foreground, 1.0) property color border: root.composed("launcher.border", "launcher.border-alpha", root.foreground, 1.0)
property color scrim: root.composed("app-launcher.scrim", "app-launcher.scrim-alpha", root.background, 0.5) property color scrim: root.composed("launcher.scrim", "launcher.scrim-alpha", root.background, 0.5)
property color selectedBackground: root.composed("app-launcher.selected-background", "app-launcher.selected-background-alpha", root.foreground, 0.08) property color selectedBackground: root.composed("launcher.selected-background", "launcher.selected-background-alpha", root.foreground, 0.08)
property color selectedText: root.pick("app-launcher.selected-text", root.accent) property color selectedText: root.pick("launcher.selected-text", root.accent)
property color selectedBorder: root.composed("app-launcher.selected-border", "app-launcher.selected-border-alpha", root.foreground, 0.0) property color selectedBorder: root.composed("launcher.selected-border", "launcher.selected-border-alpha", root.foreground, 0.0)
} }
readonly property QtObject menu: QtObject { readonly property QtObject menu: QtObject {
property color background: root.composed("menu.background", "menu.background-alpha", root.background, 1.0) property color background: root.composed("menu.background", "menu.background-alpha", root.background, 1.0)
+1 -1
View File
@@ -29,7 +29,7 @@ shell/
plugins/ plugins/
bar/ first-party plugins (see plugins/README.md) bar/ first-party plugins (see plugins/README.md)
settings/ settings/
app-launcher/ launcher/
image-picker/ image-picker/
menu/ menu/
notifications/ notifications/
+3 -3
View File
@@ -13,7 +13,7 @@ User-installed plugins live alongside these conceptually but on disk under
|---------------|---------------------------|-----------|---------------------------------------| |---------------|---------------------------|-----------|---------------------------------------|
| Bar | `omarchy.bar` | `bar` | `bar/Bar.qml` | | Bar | `omarchy.bar` | `bar` | `bar/Bar.qml` |
| Bar settings | `omarchy.settings` | `panel` | `settings/SettingsPanel.qml` | | Bar settings | `omarchy.settings` | `panel` | `settings/SettingsPanel.qml` |
| App launcher | `omarchy.app-launcher` | `overlay` | `app-launcher/AppLauncher.qml` | | Launcher | `omarchy.launcher` | `overlay` | `launcher/Launcher.qml` |
| Image picker | `omarchy.image-picker` | `overlay` | `image-picker/ImagePicker.qml` | | Image picker | `omarchy.image-picker` | `overlay` | `image-picker/ImagePicker.qml` |
| Emoji picker | `omarchy.emoji-picker` | `overlay` | `emoji-picker/EmojiPicker.qml` | | Emoji picker | `omarchy.emoji-picker` | `overlay` | `emoji-picker/EmojiPicker.qml` |
| Clipboard mgr | `omarchy.clipboard-picker`| `overlay` | `clipboard-picker/ClipboardPicker.qml`| | Clipboard mgr | `omarchy.clipboard-picker`| `overlay` | `clipboard-picker/ClipboardPicker.qml`|
@@ -45,9 +45,9 @@ Visual editor for the bar layout. Summoned by
- dynamic per-widget settings forms that write inline back to the - dynamic per-widget settings forms that write inline back to the
corresponding shell.json entry corresponding shell.json entry
## App launcher ## Launcher
Quickshell-powered app launcher. It uses Quickshell's native Quickshell-powered launcher. It uses Quickshell's native
`DesktopEntries` model for discovery/activation and renders inside the `DesktopEntries` model for discovery/activation and renders inside the
long-running shell with the legacy launcher card dimensions, colors, row long-running shell with the legacy launcher card dimensions, colors, row
spacing, icon sizing, and keyboard behavior. Summoned directly over shell IPC spacing, icon sizing, and keyboard behavior. Summoned directly over shell IPC
-15
View File
@@ -1,15 +0,0 @@
{
"schemaVersion": 1,
"id": "omarchy.app-launcher",
"name": "App launcher",
"version": "1.0.0",
"author": "Omarchy",
"description": "A Quickshell-powered application launcher",
"kinds": [
"overlay"
],
"keepLoaded": true,
"entryPoints": {
"overlay": "AppLauncher.qml"
}
}
@@ -26,16 +26,16 @@ Item {
property string launchOsdMessage: "" property string launchOsdMessage: ""
property var hiddenEntryIds: ({}) property var hiddenEntryIds: ({})
// Bound to the central [app-launcher] section in shell.toml via Color.qml. // Bound to the central [launcher] section in shell.toml via Color.qml.
// Each color already includes its alpha companion (composed in the // Each color already includes its alpha companion (composed in the
// singleton), so consumers can drop them straight into a Rectangle. // singleton), so consumers can drop them straight into a Rectangle.
property color background: Color.appLauncher.background property color background: Color.launcher.background
property color foreground: Color.appLauncher.text property color foreground: Color.launcher.text
property color border: Color.appLauncher.border property color border: Color.launcher.border
property color scrim: Color.appLauncher.scrim property color scrim: Color.launcher.scrim
property color selectedBackground: Color.appLauncher.selectedBackground property color selectedBackground: Color.launcher.selectedBackground
property color selectedText: Color.appLauncher.selectedText property color selectedText: Color.launcher.selectedText
property color selectedBorder: Color.appLauncher.selectedBorder property color selectedBorder: Color.launcher.selectedBorder
property string fontFamily: Quickshell.env("OMARCHY_MENU_FONT") || "monospace" property string fontFamily: Quickshell.env("OMARCHY_MENU_FONT") || "monospace"
property int cardWidth: 644 property int cardWidth: 644
@@ -75,7 +75,7 @@ Item {
function dismiss() { function dismiss() {
root.opened = false root.opened = false
if (root.shell && typeof root.shell.hide === "function") if (root.shell && typeof root.shell.hide === "function")
root.shell.hide((root.manifest && root.manifest.id) || "omarchy.app-launcher") root.shell.hide((root.manifest && root.manifest.id) || "omarchy.launcher")
} }
function iconSource(icon) { function iconSource(icon) {
@@ -127,7 +127,7 @@ Item {
function hiddenEntryScanCommand() { function hiddenEntryScanCommand() {
var desktop = [Quickshell.env("XDG_CURRENT_DESKTOP"), Quickshell.env("XDG_SESSION_DESKTOP"), Quickshell.env("DESKTOP_SESSION")].filter(function(v) { return String(v || "").length > 0 }).join(":") var desktop = [Quickshell.env("XDG_CURRENT_DESKTOP"), Quickshell.env("XDG_SESSION_DESKTOP"), Quickshell.env("DESKTOP_SESSION")].filter(function(v) { return String(v || "").length > 0 }).join(":")
var script = root.omarchyPath + "/shell/scripts/app-launcher-hidden-entries.sh" var script = root.omarchyPath + "/shell/scripts/launcher-hidden-entries.sh"
return Util.shellQuote(script) + " " + Util.shellQuote(desktop) return Util.shellQuote(script) + " " + Util.shellQuote(desktop)
} }
@@ -318,7 +318,7 @@ Item {
visible: root.opened visible: root.opened
anchors { top: true; bottom: true; left: true; right: true } anchors { top: true; bottom: true; left: true; right: true }
color: "transparent" color: "transparent"
WlrLayershell.namespace: "omarchy-app-launcher" WlrLayershell.namespace: "omarchy-launcher"
WlrLayershell.layer: WlrLayer.Overlay WlrLayershell.layer: WlrLayer.Overlay
WlrLayershell.keyboardFocus: WlrKeyboardFocus.Exclusive WlrLayershell.keyboardFocus: WlrKeyboardFocus.Exclusive
exclusionMode: ExclusionMode.Ignore exclusionMode: ExclusionMode.Ignore
+15
View File
@@ -0,0 +1,15 @@
{
"schemaVersion": 1,
"id": "omarchy.launcher",
"name": "Launcher",
"version": "1.0.0",
"author": "Omarchy",
"description": "A Quickshell-powered launcher",
"kinds": [
"overlay"
],
"keepLoaded": true,
"entryPoints": {
"overlay": "Launcher.qml"
}
}
+1 -1
View File
@@ -568,7 +568,7 @@ for block in re.split(r"(?m)^Sink #", sys.stdin.read())[1:]:
KeyboardPanel { KeyboardPanel {
id: panel id: panel
anchorItem: button anchorItem: button
owner: ctrl owner: root
bar: root.bar bar: root.bar
open: root.opened open: root.opened
focusTarget: keyCatcher focusTarget: keyCatcher
+1 -1
View File
@@ -343,7 +343,7 @@ Panel {
KeyboardPanel { KeyboardPanel {
id: panel id: panel
anchorItem: button anchorItem: button
owner: ctrl owner: root
bar: root.bar bar: root.bar
open: root.opened open: root.opened
focusTarget: keyCatcher focusTarget: keyCatcher
+1 -1
View File
@@ -351,7 +351,7 @@ Panel {
KeyboardPanel { KeyboardPanel {
id: panel id: panel
anchorItem: button anchorItem: button
owner: ctrl owner: root
bar: root.bar bar: root.bar
open: root.opened open: root.opened
focusTarget: keyCatcher focusTarget: keyCatcher
+1 -1
View File
@@ -643,7 +643,7 @@ fi
KeyboardPanel { KeyboardPanel {
id: panel id: panel
anchorItem: button anchorItem: button
owner: ctrl owner: root
bar: root.bar bar: root.bar
open: root.opened open: root.opened
focusTarget: keyCatcher focusTarget: keyCatcher
+1 -1
View File
@@ -165,7 +165,7 @@ printf 'time\t%s\n' "$($OMARCHY_PATH/bin/omarchy-battery-remaining-time 2>/dev/n
KeyboardPanel { KeyboardPanel {
id: panel id: panel
anchorItem: button anchorItem: button
owner: ctrl owner: root
bar: root.bar bar: root.bar
open: root.opened open: root.opened
focusTarget: keyCatcher focusTarget: keyCatcher