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"