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)