diff --git a/default/hypr/helpers.lua b/default/hypr/helpers.lua index 289afe90..d1affbc7 100644 --- a/default/hypr/helpers.lua +++ b/default/hypr/helpers.lua @@ -18,9 +18,20 @@ local function file_exists(path) return false end +-- Hyprland reaps its own children, so os.execute() can't retrieve an exit status +-- from inside the compositor. Read a marker off stdout instead. function o.shell_succeeds(command) - local ok, _, code = os.execute(command .. " >/dev/null 2>&1") - return ok == true or ok == 0 or code == 0 + -- Subshell, so the redirection covers every command rather than binding to + -- the last one and letting an earlier one write its own OK into the pipe. + local pipe = io.popen("( " .. command .. " ) >/dev/null 2>&1 && echo OK") + if not pipe then + return false + end + + local output = pipe:read("*a") or "" + pipe:close() + + return output:find("OK", 1, true) ~= nil end function o.cmd_present(command)