The /proc/*/environ scraping, wayland/X11 socket probing, and LANG/DBUS guessing arrived with the Omarchy 4 live upgrade cutover, whose upgrade script no longer exists. Every remaining caller runs inside the graphical session with full env. Keep a five-line guard deriving HYPRLAND_INSTANCE_SIGNATURE from the newest instance runtime dir so restarting over ssh still works. Launching now goes straight to the Lua dispatcher: on quattro, classic hyprctl dispatch arguments are evaluated as Lua and fail with exit 0, so the old exec fallback silently did nothing. Check for "ok" output instead of trusting the exit code, with setsid as the real fallback. 180 lines to 94. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
95 lines
2.8 KiB
Bash
Executable File
95 lines
2.8 KiB
Bash
Executable File
#!/bin/bash
|
|
|
|
# omarchy:summary=Restart the Omarchy shell
|
|
# omarchy:examples=omarchy restart shell
|
|
|
|
omarchy_root="${OMARCHY_PATH:-/usr/share/omarchy}"
|
|
if [[ ! -f $omarchy_root/shell/shell.qml && -f /usr/share/omarchy/shell/shell.qml ]]; then
|
|
omarchy_root=/usr/share/omarchy
|
|
fi
|
|
|
|
CONFIG_DIR="$omarchy_root/shell"
|
|
[[ -f $CONFIG_DIR/shell.qml ]] || { echo "Omarchy shell config not found: $CONFIG_DIR" >&2; exit 1; }
|
|
|
|
export OMARCHY_PATH="$omarchy_root"
|
|
export PATH="$omarchy_root/bin:/usr/local/bin:/usr/bin:/bin:$PATH"
|
|
|
|
omarchy_shell_bin=/usr/bin/omarchy-shell
|
|
[[ -x $omarchy_shell_bin ]] || omarchy_shell_bin=omarchy-shell
|
|
|
|
# Allow running from outside the session (e.g. over ssh) by deriving the
|
|
# Hyprland instance signature from the newest instance runtime dir.
|
|
if [[ -z ${HYPRLAND_INSTANCE_SIGNATURE:-} ]]; then
|
|
hypr_dir=$(find "${XDG_RUNTIME_DIR:-/run/user/$UID}/hypr" -mindepth 1 -maxdepth 1 -type d -printf '%T@ %p\n' 2>/dev/null | sort -n | tail -n 1 | cut -d' ' -f2-)
|
|
[[ -n $hypr_dir ]] && export HYPRLAND_INSTANCE_SIGNATURE=${hypr_dir##*/}
|
|
fi
|
|
|
|
hyprland_session_locked() {
|
|
local monitors
|
|
|
|
if monitors=$(hyprctl -j monitors 2>/dev/null); then
|
|
[[ $monitors == *'"LOCK"'* ]] && return 0
|
|
fi
|
|
|
|
monitors=$(hyprctl monitors 2>/dev/null) || return 1
|
|
[[ $monitors == *"session lock"* ]]
|
|
}
|
|
|
|
shell_quote() {
|
|
printf "'"
|
|
printf "%s" "$1" | sed "s/'/'\\\\''/g"
|
|
printf "'"
|
|
}
|
|
|
|
lua_quote() {
|
|
local value=$1
|
|
value=${value//\\/\\\\}
|
|
value=${value//\"/\\\"}
|
|
value=${value//$'\n'/\\n}
|
|
printf '"%s"' "$value"
|
|
}
|
|
|
|
launch_shell() {
|
|
local launch_command
|
|
|
|
launch_command="env OMARCHY_PATH=$(shell_quote "$omarchy_root") PATH=$(shell_quote "$PATH") quickshell -n -p $(shell_quote "$CONFIG_DIR")"
|
|
|
|
# hyprctl dispatch exits 0 even on Lua errors, so check for "ok" output.
|
|
if [[ -n ${HYPRLAND_INSTANCE_SIGNATURE:-} ]] && omarchy-cmd-present hyprctl &&
|
|
[[ $(hyprctl dispatch "hl.dsp.exec_cmd($(lua_quote "$launch_command"))" 2>/dev/null) == ok ]]; then
|
|
return 0
|
|
fi
|
|
|
|
setsid quickshell -n -p "$CONFIG_DIR" >/dev/null 2>&1 &
|
|
}
|
|
|
|
restore_hyprland_session_lock() {
|
|
local attempt
|
|
|
|
for (( attempt = 0; attempt < 50; attempt++ )); do
|
|
if "$omarchy_shell_bin" shell ping >/dev/null 2>&1; then
|
|
"$omarchy_shell_bin" lock lock >/dev/null 2>&1 || true
|
|
return 0
|
|
fi
|
|
sleep 0.1
|
|
done
|
|
|
|
echo "Omarchy shell restarted while Hyprland was session-locked, but lock IPC did not become ready." >&2
|
|
}
|
|
|
|
hyprland_was_session_locked=0
|
|
hyprland_session_locked && hyprland_was_session_locked=1
|
|
|
|
if [[ $("$omarchy_shell_bin" lock isLocked 2>/dev/null || true) == "true" ]]; then
|
|
echo "Refusing to restart Omarchy shell while the session is locked." >&2
|
|
exit 1
|
|
fi
|
|
|
|
pkill -x quickshell 2>/dev/null || true
|
|
sleep 0.2
|
|
launch_shell
|
|
|
|
if (( hyprland_was_session_locked )); then
|
|
restore_hyprland_session_lock
|
|
fi
|