From 3aa806a63076c3c7f53f7a9d620552b81ea10447 Mon Sep 17 00:00:00 2001 From: Dom Date: Sat, 18 Apr 2026 23:18:21 +0200 Subject: [PATCH] =?UTF-8?q?fix(typing):=20hybride=20xdotool=20type+key=20?= =?UTF-8?q?=E2=80=94=20rapide=20et=20compatible=20AZERTY/VM?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit xdotool type pour les segments alphanumériques (un seul appel, rapide), xdotool key avec keysym uniquement pour les caractères spéciaux (:, /, @, etc.) qui cassent en AZERTY dans les VM. Évite le subprocess par caractère (trop lent, effet visuel désagréable). Co-Authored-By: Claude Opus 4.6 (1M context) --- .../backend/api_v3/execute.py | 40 +++++++++++++------ 1 file changed, 27 insertions(+), 13 deletions(-) diff --git a/visual_workflow_builder/backend/api_v3/execute.py b/visual_workflow_builder/backend/api_v3/execute.py index f0d5476e8..d66590efb 100644 --- a/visual_workflow_builder/backend/api_v3/execute.py +++ b/visual_workflow_builder/backend/api_v3/execute.py @@ -38,25 +38,39 @@ _CHAR_TO_KEYSYM = { def _xdotool_type_by_keysym(text): - """Tape du texte via xdotool key, caractère par caractère avec keysyms. + """Tape du texte via xdotool — hybride rapide + fiable. - Indépendant du layout clavier — fonctionne en AZERTY dans une VM QWERTY - et inversement. Plus lent que xdotool type mais 100% fiable. + Les caractères alphanumériques passent par xdotool type (un seul appel, + rapide). Les caractères spéciaux (:, /, @, etc.) passent par xdotool key + avec les noms de keysym X11 pour éviter les erreurs AZERTY dans les VM. """ - keys = [] + segments = [] + buf = [] + + def flush_buf(): + if buf: + segments.append(('type', ''.join(buf))) + buf.clear() + for ch in text: if ch in _CHAR_TO_KEYSYM: - keys.append(_CHAR_TO_KEYSYM[ch]) - elif ch.isalnum(): - keys.append(ch) + flush_buf() + segments.append(('key', _CHAR_TO_KEYSYM[ch])) else: - keys.append(ch) + buf.append(ch) + flush_buf() - for key in keys: - subprocess.run( - ['xdotool', 'key', '--clearmodifiers', key], - timeout=2, check=True - ) + for kind, value in segments: + if kind == 'type': + subprocess.run( + ['xdotool', 'type', '--delay', '0', '--clearmodifiers', '--', value], + timeout=10, check=True + ) + else: + subprocess.run( + ['xdotool', 'key', '--clearmodifiers', value], + timeout=2, check=True + ) time.sleep(0.02)