From 32b44ec323367018b79d453f5d9ca721e8424583 Mon Sep 17 00:00:00 2001 From: tuxgyver Date: Mon, 31 Aug 2026 14:19:58 +0200 Subject: [PATCH] =?UTF-8?q?fix:=20fen=C3=AAtres=20console=20Windows=20appa?= =?UTF-8?q?raissant=20en=20boucle?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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 --- app/utils/platform_utils.py | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/app/utils/platform_utils.py b/app/utils/platform_utils.py index eb81bf0..648560b 100644 --- a/app/utils/platform_utils.py +++ b/app/utils/platform_utils.py @@ -39,6 +39,27 @@ def has_root_privileges() -> bool: 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, env: dict | None = None) -> tuple[int, str, str]: try: @@ -48,6 +69,7 @@ def run_command(cmd: list[str], timeout: int = 10, text=True, timeout=timeout, env=env, + **_no_window_kwargs(), ) return result.returncode, result.stdout.strip(), result.stderr.strip() except subprocess.TimeoutExpired: