fix: fenêtres console Windows apparaissant en boucle

Sous Windows, tout processus console lancé depuis une application GUI ouvre
une fenêtre cmd. WGSecure interroge `ping` et `wireguard` à chaque cycle de
rafraîchissement du statut, ce qui faisait clignoter des fenêtres DOS en
permanence pendant toute la durée d'exécution.

Tous les appels externes passent par run_command() : le drapeau
CREATE_NO_WINDOW y est désormais posé sous Windows, doublé d'un startupinfo
SW_HIDE pour les lanceurs qui l'ignorent. Sans effet sous Linux.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
tuxgyver
2026-08-31 14:19:58 +02:00
co-authored by Claude Opus 5
parent 60e85b1c20
commit 32b44ec323
+22
View File
@@ -39,6 +39,27 @@ def has_root_privileges() -> bool:
return os.geteuid() == 0 return os.geteuid() == 0
# Windows ouvre une fenêtre console pour chaque processus console lancé depuis
# une application GUI. WGSecure interroge `ping` et `wireguard` en boucle pour
# rafraîchir le statut : sans ce drapeau, l'utilisateur voit des fenêtres DOS
# apparaître et disparaître en permanence. CREATE_NO_WINDOW supprime la
# console ; startupinfo/SW_HIDE couvre les lanceurs qui l'ignorent.
_CREATE_NO_WINDOW = 0x08000000
def _no_window_kwargs() -> dict:
"""Options subprocess empêchant l'apparition d'une console sous Windows."""
if not is_windows():
return {}
startupinfo = subprocess.STARTUPINFO()
startupinfo.dwFlags |= subprocess.STARTF_USESHOWWINDOW
startupinfo.wShowWindow = subprocess.SW_HIDE
return {
"creationflags": _CREATE_NO_WINDOW,
"startupinfo": startupinfo,
}
def run_command(cmd: list[str], timeout: int = 10, def run_command(cmd: list[str], timeout: int = 10,
env: dict | None = None) -> tuple[int, str, str]: env: dict | None = None) -> tuple[int, str, str]:
try: try:
@@ -48,6 +69,7 @@ def run_command(cmd: list[str], timeout: int = 10,
text=True, text=True,
timeout=timeout, timeout=timeout,
env=env, env=env,
**_no_window_kwargs(),
) )
return result.returncode, result.stdout.strip(), result.stderr.strip() return result.returncode, result.stdout.strip(), result.stderr.strip()
except subprocess.TimeoutExpired: except subprocess.TimeoutExpired: