From 95fddeebb356b6bc7f521ba838ca3e73d027353b Mon Sep 17 00:00:00 2001 From: Dom Date: Sat, 18 Apr 2026 23:52:19 +0200 Subject: [PATCH] =?UTF-8?q?fix(typing):=20setxkbmap=20fr=20avant=20xdotool?= =?UTF-8?q?=20type=20=E2=80=94=20fix=20AZERTY=20dans=20VM=20QEMU?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Le refresh du layout X11 juste avant xdotool type force le bon keymap. Sans ça, xdotool envoie des keycodes décalés (: → M, / → !, etc.) dans les VM spice/QEMU. Solution trouvée via askubuntu.com/questions/914718. Co-Authored-By: Claude Opus 4.6 (1M context) --- .../backend/api_v3/execute.py | 43 ++++++++++--------- 1 file changed, 22 insertions(+), 21 deletions(-) diff --git a/visual_workflow_builder/backend/api_v3/execute.py b/visual_workflow_builder/backend/api_v3/execute.py index 1fd57ecb9..6807f90d5 100644 --- a/visual_workflow_builder/backend/api_v3/execute.py +++ b/visual_workflow_builder/backend/api_v3/execute.py @@ -78,16 +78,30 @@ def safe_type_text(text): """Saisie de texte compatible VM/Citrix et claviers AZERTY/QWERTY. Priorité : - 1. Presse-papier (xclip) + Ctrl+V → fiable, traverse spice/Citrix/RDP - 2. xdotool type → fallback si clipboard échoue - 3. pyautogui.write() → dernier recours + 1. xdotool type avec refresh layout → traverse les VM spice/QEMU + 2. Presse-papier (xclip) + Ctrl+V → fallback + 3. pyautogui.write() → dernier recours """ import shutil import pyautogui - # Méthode 1 : Presse-papier (le plus fiable) - # Traverse les VM via spice-vdagent et les sessions Citrix/RDP - # via le clipboard partagé natif. Pas de problème de layout clavier. + # Méthode 1 : xdotool type avec refresh du layout clavier + # setxkbmap fr AVANT xdotool force X11 à recharger le keymap + # → xdotool utilise les bons keycodes AZERTY + if shutil.which('xdotool') and shutil.which('setxkbmap'): + try: + subprocess.run(['setxkbmap', 'fr'], timeout=2) + subprocess.run( + ['xdotool', 'type', '--delay', '0', '--clearmodifiers', '--', text], + timeout=max(30, len(text) * 0.05), + check=True + ) + print(f" ✅ Saisie via xdotool type ({len(text)} car.)") + return + except Exception as e: + print(f" ⚠️ xdotool type échoué: {e}") + + # Méthode 2 : Presse-papier (fonctionne en local, pas toujours en VM) xclip = shutil.which('xclip') if xclip: try: @@ -107,21 +121,8 @@ def safe_type_text(text): except Exception as e: print(f" ⚠️ xclip échoué: {e}") - # Méthode 2 : xdotool type (fallback si clipboard échoue) - if shutil.which('xdotool'): - try: - subprocess.run( - ['xdotool', 'type', '--delay', '0', '--clearmodifiers', '--', text], - timeout=max(30, len(text) * 0.05), - check=True - ) - print(f" ✅ Saisie via xdotool type ({len(text)} car.)") - return - except Exception as e: - print(f" ⚠️ xdotool type échoué: {e}") - - # Méthode 3 : pyautogui (dernier recours — problèmes AZERTY possibles) - print(" ⚠️ Saisie via pyautogui.write() (AZERTY non garanti)") + # Méthode 3 : pyautogui (dernier recours) + print(" ⚠️ Saisie via pyautogui.write()") pyautogui.write(text)