diff --git a/dzgui/init/proc.py b/dzgui/init/proc.py index 8d094c3..cc02a88 100644 --- a/dzgui/init/proc.py +++ b/dzgui/init/proc.py @@ -3,29 +3,40 @@ import subprocess import shutil import sys -from dzgui.const.constants import DAYZ_BINARY, STEAM_CMD +from dzgui.const.constants import ( + DAYZ_BINARY, + STEAM_CMD, + FLATPAK_APPID, + FLATPAK_RUN_CMD, + FLATPAK_SANDBOX, +) from dzgui.views.dialogs.early_alert import EarlyAlertDialog from dzgui.util.strings import init # TODO: move to util.proc +def is_dayz_running() -> bool: + return is_running(DAYZ_BINARY) -# TODO: simplify -def is_dayz_running(dialog: bool = False) -> bool | None: - if dialog is False: - return is_running(DAYZ_BINARY) - if is_running(DAYZ_BINARY) is True: - EarlyAlertDialog(init.is_dayz_running) - sys.exit(1) - - -def is_steam_running(dialog: bool = False) -> bool | None: - # TODO: check proc name of flatpak steam - if dialog is False: +def is_steam_running(cmd: str) -> bool: + if cmd == STEAM_CMD: + if has_cmd(STEAM_CMD) is False: + return False return is_running(STEAM_CMD) - if is_running(STEAM_CMD) is False: - EarlyAlertDialog(init.is_steam_running) - sys.exit(1) + elif cmd == FLATPAK_RUN_CMD or FLATPAK_SANDBOX: + return is_flatpak_steam_running() + else: + raise TypeError("Not a valid Steam client selection") + + +def is_flatpak_steam_running() -> bool: + if has_cmd(FLATPAK_CMD) is False: + return False + proc = subprocess.check_output([FLATPAK_CMD, "ps"], capture_output=True, text=True) + lines = proc.stdout.splitlines() + if FLATPAK_APPID in lines: + return True + return False def is_running(proc: str) -> bool: @@ -43,8 +54,10 @@ def has_cmd(cmd: str) -> bool: def foreground(cmd: str, pid: int) -> None: if cmd == "wmctrl": - proc = subprocess.run(["wmctrl", "-ilp"], capture_output=True, text=True) - lines = proc.stdout.splitlines() + proc = subprocess.check_output( + ["wmctrl", "-ilp"], capture_output=True, text=True + ) + lines = proc.splitlines() for line in lines: els = line.split(" ") if str(pid) in els: @@ -52,5 +65,11 @@ def foreground(cmd: str, pid: int) -> None: break subprocess.run(["wmctrl", "-ia", wid]) elif cmd == "xdotool": - args = [cmd, "search", "--onlyvisible", "--name", "DZGUI", "windowactivate"] - subprocess.Popen([*args]) + args = [cmd, "search", "--pid", str(pid)] + proc = subprocess.check_output([*args], stderr=subprocess.DEVNULL) + lines = proc.splitlines() + ## NOTE: some forked subprocesses may fail, so skip over them + for line in lines: + subprocess.run( + ["xdotool", "windowactivate", line], stderr=subprocess.DEVNULL + ) diff --git a/dzgui/main.py b/dzgui/main.py index 1e1c2be..e3f0ce0 100644 --- a/dzgui/main.py +++ b/dzgui/main.py @@ -122,6 +122,8 @@ def main() -> None: if allow is True: check_updates(version) + # TODO: config wizard: check has_steam_client() prior to VDF exploration + if _is_steam_deck is False: # TODO: sudo escalation dialog count = get_map_count() @@ -129,10 +131,6 @@ def main() -> None: if has_steam_client() is False: EarlyAlertDialog(init.requires_steam) - is_dayz_installed(XDG.config) - is_dayz_running(dialog=True) - is_steam_running(dialog=True) - # NOTE: clear versions file of unlinked mods rebuild_symlinks(XDG.config) remove_stale_signatures(XDG.config, XDG.version)