From 41425481db9c2aada6f2d910a09654c97d85ac61 Mon Sep 17 00:00:00 2001 From: David Heinemeier Hansson Date: Wed, 20 May 2026 13:57:22 +0200 Subject: [PATCH] app-launcher to just launcher --- default/hypr/apps/omarchy-shell.lua | 4 ++-- default/hypr/bindings/utilities.lua | 2 +- default/omarchy-skill/SKILL.md | 4 ++-- default/omarchy/omarchy-menu.jsonc | 2 +- default/themed/shell.toml.tpl | 4 ++-- docs/omarchy-shell.md | 4 ++-- migrations/1779210892.sh | 4 ++-- migrations/1779277899.sh | 20 +++++++++++++++++ shell/Commons/Color.qml | 16 +++++++------- shell/README.md | 2 +- shell/plugins/README.md | 6 ++--- shell/plugins/app-launcher/manifest.json | 15 ------------- .../AppLauncher.qml => launcher/Launcher.qml} | 22 +++++++++---------- shell/plugins/launcher/manifest.json | 15 +++++++++++++ shell/plugins/panels/Audio.qml | 2 +- shell/plugins/panels/Bluetooth.qml | 2 +- shell/plugins/panels/Monitor.qml | 2 +- shell/plugins/panels/Network.qml | 2 +- shell/plugins/panels/Power.qml | 2 +- ...-entries.sh => launcher-hidden-entries.sh} | 0 20 files changed, 75 insertions(+), 55 deletions(-) create mode 100644 migrations/1779277899.sh delete mode 100644 shell/plugins/app-launcher/manifest.json rename shell/plugins/{app-launcher/AppLauncher.qml => launcher/Launcher.qml} (96%) create mode 100644 shell/plugins/launcher/manifest.json rename shell/scripts/{app-launcher-hidden-entries.sh => launcher-hidden-entries.sh} (100%) diff --git a/default/hypr/apps/omarchy-shell.lua b/default/hypr/apps/omarchy-shell.lua index 83de77ce..eb2c4238 100644 --- a/default/hypr/apps/omarchy-shell.lua +++ b/default/hypr/apps/omarchy-shell.lua @@ -5,8 +5,8 @@ -- Keep the bar instant: no layer-shell fade/slide animation. 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. -hl.layer_rule({ match = { namespace = "^(omarchy-menu|omarchy-app-launcher|omarchy-image-selector|omarchy-emoji-picker|omarchy-clipboard-picker)$" }, no_anim = true, animation = "none" }) +-- Launcher, image selector, emoji picker, and clipboard overlays should also pop without animation. +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 -- tiling — it's a transient dialog, not a workspace surface. diff --git a/default/hypr/bindings/utilities.lua b/default/hypr/bindings/utilities.lua index dee63d09..0e870a9e 100644 --- a/default/hypr/bindings/utilities.lua +++ b/default/hypr/bindings/utilities.lua @@ -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 + C", "Capture menu", "omarchy-shell menu toggle capture") o.bind("SUPER + CTRL + O", "Toggle menu", "omarchy-shell menu toggle toggle") diff --git a/default/omarchy-skill/SKILL.md b/default/omarchy-skill/SKILL.md index 460d5a8d..563a2d57 100644 --- a/default/omarchy-skill/SKILL.md +++ b/default/omarchy-skill/SKILL.md @@ -78,7 +78,7 @@ Omarchy is built on: | **Arch Linux** | Base OS | `/etc/`, `~/.config/` | | **Hyprland** | Wayland compositor/WM | `~/.config/hypr/` | | **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//` | | **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 # - 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 -# - App launcher: restart with `omarchy restart shell` +# - Launcher: restart with `omarchy restart shell` # - Terminals: MUST restart with `omarchy restart terminal` ``` diff --git a/default/omarchy/omarchy-menu.jsonc b/default/omarchy/omarchy-menu.jsonc index f03c4cf0..4a793dde 100644 --- a/default/omarchy/omarchy-menu.jsonc +++ b/default/omarchy/omarchy-menu.jsonc @@ -13,7 +13,7 @@ // checked shell condition; append ✓ when it succeeds // 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"}, "trigger": {"icon":"󱓞","label":"Trigger","keywords":"actions capture share toggle hardware reminder"}, "style": {"icon":"","label":"Style","keywords":"theme background font bar quickshell hyprland appearance"}, diff --git a/default/themed/shell.toml.tpl b/default/themed/shell.toml.tpl index bdbc4998..e82960d3 100644 --- a/default/themed/shell.toml.tpl +++ b/default/themed/shell.toml.tpl @@ -127,8 +127,8 @@ border = "{{ accent }}" border-alpha = 1.0 countdown = "{{ accent }}" -[app-launcher] -# Same six tokens as [menu], applied to the app launcher overlay. Alpha +[launcher] +# Same six tokens as [menu], applied to the launcher overlay. Alpha # companions go from 0 (invisible) to 1 (opaque). scrim is the full-screen # dim layer behind the card; background is the card itself. Defaults # mirror [menu] with the card at 0.95 to preserve the legacy translucency. diff --git a/docs/omarchy-shell.md b/docs/omarchy-shell.md index 5191472f..d9e2f21f 100644 --- a/docs/omarchy-shell.md +++ b/docs/omarchy-shell.md @@ -116,7 +116,7 @@ The shell exposes these tokens to QML via two singletons in - `Color` — palette (`foreground`, `background`, `accent`, `urgent`) and per-surface roles (`Color.bar.*`, `Color.popups.*`, `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.*`. - `Style` — structural tokens (`cornerRadius`), shared interactive 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 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]`. `[controls]` only governs the shared button/dropdown chrome. diff --git a/migrations/1779210892.sh b/migrations/1779210892.sh index c5058c5d..bf8adc11 100644 --- a/migrations/1779210892.sh +++ b/migrations/1779210892.sh @@ -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 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 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 done diff --git a/migrations/1779277899.sh b/migrations/1779277899.sh new file mode 100644 index 00000000..1aa494cb --- /dev/null +++ b/migrations/1779277899.sh @@ -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 diff --git a/shell/Commons/Color.qml b/shell/Commons/Color.qml index 9170e4e4..773a638b 100644 --- a/shell/Commons/Color.qml +++ b/shell/Commons/Color.qml @@ -66,14 +66,14 @@ QtObject { property color border: root.composed("notifications.border", "notifications.border-alpha", root.accent, 1.0) property color countdown: root.pick("notifications.countdown", root.accent) } - readonly property QtObject appLauncher: QtObject { - property color background: root.composed("app-launcher.background", "app-launcher.background-alpha", root.background, 1.0) - property color text: root.pick("app-launcher.text", root.foreground) - property color border: root.composed("app-launcher.border", "app-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 selectedBackground: root.composed("app-launcher.selected-background", "app-launcher.selected-background-alpha", root.foreground, 0.08) - property color selectedText: root.pick("app-launcher.selected-text", root.accent) - property color selectedBorder: root.composed("app-launcher.selected-border", "app-launcher.selected-border-alpha", root.foreground, 0.0) + readonly property QtObject launcher: QtObject { + property color background: root.composed("launcher.background", "launcher.background-alpha", root.background, 1.0) + property color text: root.pick("launcher.text", root.foreground) + property color border: root.composed("launcher.border", "launcher.border-alpha", root.foreground, 1.0) + property color scrim: root.composed("launcher.scrim", "launcher.scrim-alpha", root.background, 0.5) + property color selectedBackground: root.composed("launcher.selected-background", "launcher.selected-background-alpha", root.foreground, 0.08) + property color selectedText: root.pick("launcher.selected-text", root.accent) + property color selectedBorder: root.composed("launcher.selected-border", "launcher.selected-border-alpha", root.foreground, 0.0) } readonly property QtObject menu: QtObject { property color background: root.composed("menu.background", "menu.background-alpha", root.background, 1.0) diff --git a/shell/README.md b/shell/README.md index c3973e80..09020e2d 100644 --- a/shell/README.md +++ b/shell/README.md @@ -29,7 +29,7 @@ shell/ plugins/ bar/ first-party plugins (see plugins/README.md) settings/ - app-launcher/ + launcher/ image-picker/ menu/ notifications/ diff --git a/shell/plugins/README.md b/shell/plugins/README.md index d4f7fa7b..3d7fdf35 100644 --- a/shell/plugins/README.md +++ b/shell/plugins/README.md @@ -13,7 +13,7 @@ User-installed plugins live alongside these conceptually but on disk under |---------------|---------------------------|-----------|---------------------------------------| | Bar | `omarchy.bar` | `bar` | `bar/Bar.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` | | Emoji picker | `omarchy.emoji-picker` | `overlay` | `emoji-picker/EmojiPicker.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 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 long-running shell with the legacy launcher card dimensions, colors, row spacing, icon sizing, and keyboard behavior. Summoned directly over shell IPC diff --git a/shell/plugins/app-launcher/manifest.json b/shell/plugins/app-launcher/manifest.json deleted file mode 100644 index c905b014..00000000 --- a/shell/plugins/app-launcher/manifest.json +++ /dev/null @@ -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" - } -} diff --git a/shell/plugins/app-launcher/AppLauncher.qml b/shell/plugins/launcher/Launcher.qml similarity index 96% rename from shell/plugins/app-launcher/AppLauncher.qml rename to shell/plugins/launcher/Launcher.qml index cffc8a26..4bd1a54f 100644 --- a/shell/plugins/app-launcher/AppLauncher.qml +++ b/shell/plugins/launcher/Launcher.qml @@ -26,16 +26,16 @@ Item { property string launchOsdMessage: "" 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 // singleton), so consumers can drop them straight into a Rectangle. - property color background: Color.appLauncher.background - property color foreground: Color.appLauncher.text - property color border: Color.appLauncher.border - property color scrim: Color.appLauncher.scrim - property color selectedBackground: Color.appLauncher.selectedBackground - property color selectedText: Color.appLauncher.selectedText - property color selectedBorder: Color.appLauncher.selectedBorder + property color background: Color.launcher.background + property color foreground: Color.launcher.text + property color border: Color.launcher.border + property color scrim: Color.launcher.scrim + property color selectedBackground: Color.launcher.selectedBackground + property color selectedText: Color.launcher.selectedText + property color selectedBorder: Color.launcher.selectedBorder property string fontFamily: Quickshell.env("OMARCHY_MENU_FONT") || "monospace" property int cardWidth: 644 @@ -75,7 +75,7 @@ Item { function dismiss() { root.opened = false 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) { @@ -127,7 +127,7 @@ Item { 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 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) } @@ -318,7 +318,7 @@ Item { visible: root.opened anchors { top: true; bottom: true; left: true; right: true } color: "transparent" - WlrLayershell.namespace: "omarchy-app-launcher" + WlrLayershell.namespace: "omarchy-launcher" WlrLayershell.layer: WlrLayer.Overlay WlrLayershell.keyboardFocus: WlrKeyboardFocus.Exclusive exclusionMode: ExclusionMode.Ignore diff --git a/shell/plugins/launcher/manifest.json b/shell/plugins/launcher/manifest.json new file mode 100644 index 00000000..a036bc57 --- /dev/null +++ b/shell/plugins/launcher/manifest.json @@ -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" + } +} diff --git a/shell/plugins/panels/Audio.qml b/shell/plugins/panels/Audio.qml index a4a84c65..47d4f15e 100644 --- a/shell/plugins/panels/Audio.qml +++ b/shell/plugins/panels/Audio.qml @@ -568,7 +568,7 @@ for block in re.split(r"(?m)^Sink #", sys.stdin.read())[1:]: KeyboardPanel { id: panel anchorItem: button - owner: ctrl + owner: root bar: root.bar open: root.opened focusTarget: keyCatcher diff --git a/shell/plugins/panels/Bluetooth.qml b/shell/plugins/panels/Bluetooth.qml index 7fd7c74d..aa2411e1 100644 --- a/shell/plugins/panels/Bluetooth.qml +++ b/shell/plugins/panels/Bluetooth.qml @@ -343,7 +343,7 @@ Panel { KeyboardPanel { id: panel anchorItem: button - owner: ctrl + owner: root bar: root.bar open: root.opened focusTarget: keyCatcher diff --git a/shell/plugins/panels/Monitor.qml b/shell/plugins/panels/Monitor.qml index 5ea5ebc4..d59d9b44 100644 --- a/shell/plugins/panels/Monitor.qml +++ b/shell/plugins/panels/Monitor.qml @@ -351,7 +351,7 @@ Panel { KeyboardPanel { id: panel anchorItem: button - owner: ctrl + owner: root bar: root.bar open: root.opened focusTarget: keyCatcher diff --git a/shell/plugins/panels/Network.qml b/shell/plugins/panels/Network.qml index f5718bfd..6b6ffad3 100644 --- a/shell/plugins/panels/Network.qml +++ b/shell/plugins/panels/Network.qml @@ -643,7 +643,7 @@ fi KeyboardPanel { id: panel anchorItem: button - owner: ctrl + owner: root bar: root.bar open: root.opened focusTarget: keyCatcher diff --git a/shell/plugins/panels/Power.qml b/shell/plugins/panels/Power.qml index 13d23bb0..a89277f6 100644 --- a/shell/plugins/panels/Power.qml +++ b/shell/plugins/panels/Power.qml @@ -165,7 +165,7 @@ printf 'time\t%s\n' "$($OMARCHY_PATH/bin/omarchy-battery-remaining-time 2>/dev/n KeyboardPanel { id: panel anchorItem: button - owner: ctrl + owner: root bar: root.bar open: root.opened focusTarget: keyCatcher diff --git a/shell/scripts/app-launcher-hidden-entries.sh b/shell/scripts/launcher-hidden-entries.sh similarity index 100% rename from shell/scripts/app-launcher-hidden-entries.sh rename to shell/scripts/launcher-hidden-entries.sh