From d4d1b518e0dd2d52f9797b8327888650ef452774 Mon Sep 17 00:00:00 2001 From: David Heinemeier Hansson Date: Sun, 19 Jul 2026 17:36:34 -0700 Subject: [PATCH] Remove redundant Hyprland launch wrapper With initial workspace tracking disabled, windows naturally open on the active workspace. Remove the explicit Hyprland workspace dispatch and let shell actions, shell restarts, and presentation terminals launch directly. --- bin/omarchy-hyprland-launch | 30 ----------- ...launch-floating-terminal-with-presentation | 11 +--- bin/omarchy-restart-shell | 3 +- shell/Commons/Util.qml | 6 +-- shell/plugins/bar/Bar.qml | 5 +- shell/plugins/launcher/Launcher.qml | 4 +- shell/plugins/menu/Menu.qml | 2 +- test/shell.d/floating-terminal-test.sh | 28 +++------- test/shell.d/launcher-search-test.sh | 8 +-- test/shell.d/restart-shell-test.sh | 8 +-- test/shell.d/shell-launch-test.sh | 51 +------------------ 11 files changed, 21 insertions(+), 135 deletions(-) delete mode 100755 bin/omarchy-hyprland-launch diff --git a/bin/omarchy-hyprland-launch b/bin/omarchy-hyprland-launch deleted file mode 100755 index 6d932090..00000000 --- a/bin/omarchy-hyprland-launch +++ /dev/null @@ -1,30 +0,0 @@ -#!/bin/bash - -# omarchy:summary=Launch a command on the active Hyprland workspace -# omarchy:args= - -cmd="$*" -[[ -n $cmd ]] || exit 0 - -lua_quote() { - local value=$1 - - value=${value//\\/\\\\} - value=${value//\"/\\\"} - value=${value//$'\n'/\\n} - printf '"%s"' "$value" -} - -active_workspace() { - hyprctl activeworkspace -j 2>/dev/null | jq -r '.name // .id // empty' 2>/dev/null -} - -if [[ -n ${HYPRLAND_INSTANCE_SIGNATURE:-} ]] && omarchy-cmd-present hyprctl && omarchy-cmd-present jq; then - workspace="$(active_workspace)" - # hyprctl dispatch exits 0 even on Lua errors, so check for "ok" output. - if [[ -n $workspace && $(hyprctl dispatch "function() hl.exec_cmd($(lua_quote "$cmd"), { workspace = $(lua_quote "$workspace") }) end" 2>/dev/null) == ok ]]; then - exit 0 - fi -fi - -exec bash -lc "$cmd" diff --git a/bin/omarchy-launch-floating-terminal-with-presentation b/bin/omarchy-launch-floating-terminal-with-presentation index 1d81ac34..cd6db0d2 100755 --- a/bin/omarchy-launch-floating-terminal-with-presentation +++ b/bin/omarchy-launch-floating-terminal-with-presentation @@ -6,13 +6,4 @@ cmd="$*" presentation_script="omarchy-show-logo; $cmd; if (( \$? != 130 )); then omarchy-show-done; fi" -shell_quote() { - local value=$1 - - printf "'" - printf "%s" "$value" | sed "s/'/'\\\\''/g" - printf "'" -} - -terminal_command="setsid uwsm-app -- xdg-terminal-exec --app-id=org.omarchy.terminal --title=Omarchy -e bash -c $(shell_quote "$presentation_script")" -exec omarchy-hyprland-launch "$terminal_command" +exec setsid uwsm-app -- xdg-terminal-exec --app-id=org.omarchy.terminal --title=Omarchy -e bash -c "$presentation_script" diff --git a/bin/omarchy-restart-shell b/bin/omarchy-restart-shell index 0dfd557d..8537cca7 100755 --- a/bin/omarchy-restart-shell +++ b/bin/omarchy-restart-shell @@ -28,8 +28,7 @@ if (( attempt == 50 )); then exit 1 fi -printf -v launch_command 'setsid quickshell -n -p %q >/dev/null 2>&1 &' "$CONFIG_DIR" -omarchy-hyprland-launch "$launch_command" +setsid quickshell -n -p "$CONFIG_DIR" >/dev/null 2>&1 & for (( attempt = 0; attempt < 20; attempt++ )); do OMARCHY_SHELL_IPC_TIMEOUT=0.5s omarchy-shell shell ping >/dev/null 2>&1 && exit 0 diff --git a/shell/Commons/Util.qml b/shell/Commons/Util.qml index 2fb554a6..d92091ee 100644 --- a/shell/Commons/Util.qml +++ b/shell/Commons/Util.qml @@ -7,8 +7,6 @@ import QtQuick QtObject { id: root - readonly property string omarchyPath: Quickshell.env("OMARCHY_PATH") - function clamp(value, min, max) { var n = Number(value) if (!isFinite(n)) return min @@ -41,8 +39,8 @@ QtObject { return "'" + String(value || "").replace(/'/g, "'\\''") + "'" } - function hyprExecCommand(command) { - return [omarchyPath + "/bin/omarchy-hyprland-launch", command] + function execDetached(command) { + Quickshell.execDetached(["bash", "-lc", command]) } function isPlainObject(value) { diff --git a/shell/plugins/bar/Bar.qml b/shell/plugins/bar/Bar.qml index e3511ea0..eb96bb12 100644 --- a/shell/plugins/bar/Bar.qml +++ b/shell/plugins/bar/Bar.qml @@ -488,8 +488,7 @@ Item { function run(command) { if (!command) return - launcher.command = Util.hyprExecCommand(command) - launcher.startDetached() + Util.execDetached(command) } function toggleTransparency() { @@ -786,8 +785,6 @@ Item { clearTooltip() } - Process { id: launcher } - Timer { id: tooltipTimer interval: 400 diff --git a/shell/plugins/launcher/Launcher.qml b/shell/plugins/launcher/Launcher.qml index d120355e..00b1f9e5 100644 --- a/shell/plugins/launcher/Launcher.qml +++ b/shell/plugins/launcher/Launcher.qml @@ -269,7 +269,7 @@ Item { root.beginLaunchFeedback(entry) root.dismiss() - Quickshell.execDetached(Util.hyprExecCommand("gtk-launch " + Util.shellQuote(desktopId))) + Util.execDetached("gtk-launch " + Util.shellQuote(desktopId)) } function requestDeleteIndex(index) { @@ -297,7 +297,7 @@ Item { var name = root.entryName(entry) var command = Util.shellQuote(root.omarchyPath + "/bin/omarchy-remove-launcher-entry") + " " + Util.shellQuote(desktopId) + " " + Util.shellQuote(name) root.dismiss() - Quickshell.execDetached(Util.hyprExecCommand(command)) + Util.execDetached(command) } function beginLaunchFeedback(entry) { diff --git a/shell/plugins/menu/Menu.qml b/shell/plugins/menu/Menu.qml index 4d7e31a8..1cf5d36d 100644 --- a/shell/plugins/menu/Menu.qml +++ b/shell/plugins/menu/Menu.qml @@ -126,7 +126,7 @@ Item { var command = String(action || "") if (!command) return - Quickshell.execDetached(Util.hyprExecCommand(command)) + Util.execDetached(command) } function rowHeightForDetail(detail) { diff --git a/test/shell.d/floating-terminal-test.sh b/test/shell.d/floating-terminal-test.sh index 578bb178..86ae8912 100644 --- a/test/shell.d/floating-terminal-test.sh +++ b/test/shell.d/floating-terminal-test.sh @@ -7,33 +7,17 @@ source "$(cd -- "$(dirname -- "${BASH_SOURCE[0]}")" && pwd)/base-test.sh" tmp_dir="$(mktemp -d)" trap 'rm -rf "$tmp_dir"' EXIT -cat >"$tmp_dir/hyprctl" <<'SCRIPT' +cat >"$tmp_dir/setsid" <<'SCRIPT' #!/bin/bash -case "$1" in - activeworkspace) - printf '{"id":2,"name":"2"}\n' - ;; - dispatch) - printf '%s\n' "$2" >>"$TEST_LOG" - ;; -esac +printf '%s\n' "$*" >"$TEST_LOG" SCRIPT -chmod +x "$tmp_dir/hyprctl" - -cat >"$tmp_dir/jq" <<'SCRIPT' -#!/bin/bash -cat >/dev/null -printf '2\n' -SCRIPT -chmod +x "$tmp_dir/jq" +chmod +x "$tmp_dir/setsid" export TEST_LOG="$tmp_dir/log" export PATH="$tmp_dir:$ROOT/bin:$PATH" -export HYPRLAND_INSTANCE_SIGNATURE=test "$ROOT/bin/omarchy-launch-floating-terminal-with-presentation" "echo hello" -dispatch=$(<"$TEST_LOG") -[[ $dispatch == *'workspace = "2"'* ]] || fail "floating terminal targets active workspace" "$dispatch" -[[ $dispatch == *"xdg-terminal-exec --app-id=org.omarchy.terminal"* ]] || fail "floating terminal dispatch launches Omarchy terminal" "$dispatch" -pass "floating terminal targets active workspace" +launch=$(<"$TEST_LOG") +[[ $launch == *"xdg-terminal-exec --app-id=org.omarchy.terminal"* ]] || fail "floating terminal launches Omarchy terminal" "$launch" +pass "floating terminal launches Omarchy terminal" diff --git a/test/shell.d/launcher-search-test.sh b/test/shell.d/launcher-search-test.sh index 023fd892..a6e1a3a4 100644 --- a/test/shell.d/launcher-search-test.sh +++ b/test/shell.d/launcher-search-test.sh @@ -100,8 +100,8 @@ assert( 'launcher delete closes launcher after confirmation' ) assert( - confirmDeleteMatch[1].includes('Util.hyprExecCommand(command)'), - 'launcher delete routes remover through Hyprland' + confirmDeleteMatch[1].includes('Util.execDetached(command)'), + 'launcher delete runs remover through the shell' ) const activateMatch = launcherQml.match(/function activateIndex\(index\) \{([\s\S]*?)\n \}/) @@ -111,8 +111,8 @@ assert( 'launcher does not execute desktop entries directly' ) assert( - activateMatch[1].includes('gtk-launch') && activateMatch[1].includes('Util.hyprExecCommand'), - 'launcher routes desktop entry launch through Hyprland' + activateMatch[1].includes('gtk-launch') && activateMatch[1].includes('Util.execDetached'), + 'launcher runs desktop entry launch through the shell' ) assert( diff --git a/test/shell.d/restart-shell-test.sh b/test/shell.d/restart-shell-test.sh index 90d5cc4f..ce83312b 100755 --- a/test/shell.d/restart-shell-test.sh +++ b/test/shell.d/restart-shell-test.sh @@ -42,12 +42,6 @@ touch "$restart_root/shell/shell.qml" ln -s "$ROOT/bin/omarchy-shell" "$restart_bin/omarchy-shell" ln -s "$ROOT/bin/omarchy-cmd-missing" "$restart_bin/omarchy-cmd-missing" -cat >"$restart_bin/omarchy-hyprland-launch" <<'SH' -#!/bin/bash - -bash -c "$1" -SH - cat >"$restart_bin/qs" <<'SH' #!/bin/bash @@ -91,7 +85,7 @@ if [[ ${1:-} == "-j" && ${2:-} == "monitors" ]]; then fi SH -chmod +x "$restart_bin/qs" "$restart_bin/quickshell" "$restart_bin/hyprctl" "$restart_bin/omarchy-hyprland-launch" +chmod +x "$restart_bin/qs" "$restart_bin/quickshell" "$restart_bin/hyprctl" printf '101\n202\n' >"$restart_state" diff --git a/test/shell.d/shell-launch-test.sh b/test/shell.d/shell-launch-test.sh index ad096e0a..0ff91459 100644 --- a/test/shell.d/shell-launch-test.sh +++ b/test/shell.d/shell-launch-test.sh @@ -9,55 +9,8 @@ const fs = require('fs') const utilQml = fs.readFileSync(path.join(root, 'shell/Commons/Util.qml'), 'utf8') assert( - utilQml.includes('import Quickshell'), - 'shell launch helper can read Omarchy path' -) -assert( - utilQml.includes('Quickshell.env("OMARCHY_PATH")'), - 'shell launch helper uses Omarchy path' -) -assert( - /function hyprExecCommand\(command\)[\s\S]*omarchy-hyprland-launch/.test(utilQml), - 'shell launch helper routes through Hyprland launch command' + /function execDetached\(command\)[\s\S]*Quickshell\.execDetached\(\["bash", "-lc", command\]\)/.test(utilQml), + 'detached command helper uses a login shell' ) JS - -tmp_dir="$(mktemp -d)" -trap 'rm -rf "$tmp_dir"' EXIT - -cat >"$tmp_dir/hyprctl" <<'SCRIPT' -#!/bin/bash -case "$1" in - activeworkspace) - printf '{"id":2,"name":"2"}\n' - ;; - dispatch) - printf '%s\n' "$2" >>"$TEST_LOG" - ;; -esac -SCRIPT -chmod +x "$tmp_dir/hyprctl" - -cat >"$tmp_dir/jq" <<'SCRIPT' -#!/bin/bash -cat >/dev/null -printf '2\n' -SCRIPT -chmod +x "$tmp_dir/jq" - -export TEST_LOG="$tmp_dir/log" -export PATH="$tmp_dir:$ROOT/bin:$PATH" -export HYPRLAND_INSTANCE_SIGNATURE=test - -"$ROOT/bin/omarchy-hyprland-launch" "echo hello" - -dispatch=$(<"$TEST_LOG") -[[ $dispatch == *'workspace = "2"'* ]] || fail "hyprland launch targets active workspace" "$dispatch" -[[ $dispatch == *'hl.exec_cmd("echo hello"'* ]] || fail "hyprland launch dispatches command" "$dispatch" -pass "hyprland launch targets active workspace" - -unset HYPRLAND_INSTANCE_SIGNATURE -"$ROOT/bin/omarchy-hyprland-launch" "printf fallback > $(printf '%q' "$tmp_dir/fallback")" -[[ $(<"$tmp_dir/fallback") == "fallback" ]] || fail "hyprland launch falls back outside Hyprland" -pass "hyprland launch falls back outside Hyprland"