mirror of
https://github.com/aclist/dztui.git
synced 2026-08-28 02:37:20 +02:00
94 lines
2.5 KiB
Python
94 lines
2.5 KiB
Python
import psutil
|
|
import subprocess
|
|
import shutil
|
|
import logging
|
|
|
|
from warnings import deprecated
|
|
|
|
from dzgui.const.constants import (
|
|
APP_NAME,
|
|
DAYZ_BINARY,
|
|
STEAM_CMD,
|
|
FLATPAK_APPID,
|
|
FLATPAK_CMD,
|
|
FLATPAK_RUN_CMD,
|
|
FLATPAK_SANDBOX,
|
|
)
|
|
|
|
from dzgui.util.format import format_exception
|
|
|
|
logger = logging.getLogger(APP_NAME)
|
|
|
|
|
|
# TODO: move to util.proc
|
|
def is_dayz_running() -> bool:
|
|
"""Subprocesses spawned from Steam will not show up in regular process tree"""
|
|
procs = []
|
|
substring = DAYZ_BINARY
|
|
for proc in psutil.process_iter():
|
|
try:
|
|
procs.append(proc.cmdline())
|
|
except Exception as e:
|
|
msg = format_exception(e)
|
|
logger.warning(msg)
|
|
continue
|
|
return any(substring in item for sublist in procs for item in sublist)
|
|
|
|
|
|
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)
|
|
elif cmd == FLATPAK_RUN_CMD or FLATPAK_SANDBOX:
|
|
return is_flatpak_steam_running()
|
|
else:
|
|
raise TypeError("Not a valid Steam client selection")
|
|
|
|
|
|
# CHORE: test alternate clients
|
|
# TODO: has_flatpak_steam
|
|
def is_flatpak_steam_running() -> bool:
|
|
if has_cmd(FLATPAK_CMD) is False:
|
|
return False
|
|
proc = subprocess.check_output([FLATPAK_CMD, "ps"], text=True)
|
|
lines = proc.splitlines()
|
|
if FLATPAK_APPID in lines:
|
|
return True
|
|
return False
|
|
|
|
|
|
def is_running(proc: str) -> bool:
|
|
for process in psutil.process_iter(["pid", "name"]):
|
|
if process.info["name"] == proc:
|
|
return True
|
|
return False
|
|
|
|
|
|
def has_cmd(cmd: str) -> bool:
|
|
if shutil.which(cmd) is not None:
|
|
return True
|
|
return False
|
|
|
|
|
|
@deprecated("dropped in favor of Gtk native methods")
|
|
def foreground(cmd: str, pid: int) -> None:
|
|
if cmd == "wmctrl":
|
|
proc = subprocess.run(["wmctrl", "-ilp"], capture_output=True, text=True)
|
|
lines = proc.stdout.splitlines()
|
|
for line in lines:
|
|
els = line.split(" ")
|
|
if str(pid) in els:
|
|
wid = els[0]
|
|
break
|
|
subprocess.run(["wmctrl", "-ia", wid])
|
|
elif cmd == "xdotool":
|
|
args = [cmd, "search", "--pid", str(pid)]
|
|
proc = subprocess.run([*args], capture_output=True, text=True)
|
|
lines = proc.stdout.splitlines()
|
|
## NOTE: some forked subprocesses may fail, so skip over them
|
|
for line in lines:
|
|
subprocess.run(
|
|
["xdotool", "windowactivate", line], stderr=subprocess.DEVNULL
|
|
)
|