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.
This commit is contained in:
David Heinemeier Hansson
2026-07-19 17:36:34 -07:00
parent 146f73bf85
commit d4d1b518e0
11 changed files with 21 additions and 135 deletions
-30
View File
@@ -1,30 +0,0 @@
#!/bin/bash
# omarchy:summary=Launch a command on the active Hyprland workspace
# omarchy:args=<command>
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"
@@ -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"
+1 -2
View File
@@ -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
+2 -4
View File
@@ -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) {
+1 -4
View File
@@ -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
+2 -2
View File
@@ -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) {
+1 -1
View File
@@ -126,7 +126,7 @@ Item {
var command = String(action || "")
if (!command) return
Quickshell.execDetached(Util.hyprExecCommand(command))
Util.execDetached(command)
}
function rowHeightForDetail(detail) {
+6 -22
View File
@@ -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"
+4 -4
View File
@@ -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(
+1 -7
View File
@@ -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"
+2 -49
View File
@@ -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"