fix(typing): setxkbmap fr avant xdotool type — fix AZERTY dans VM QEMU
Some checks failed
security-audit / Bandit (scan statique) (push) Successful in 12s
security-audit / pip-audit (CVE dépendances) (push) Successful in 11s
security-audit / Scan secrets (grep) (push) Successful in 8s
tests / Lint (ruff + black) (push) Successful in 15s
tests / Tests unitaires (sans GPU) (push) Failing after 13s
tests / Tests sécurité (critique) (push) Has been skipped

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) <noreply@anthropic.com>
This commit is contained in:
Dom
2026-04-18 23:52:19 +02:00
parent 71523cebd3
commit 95fddeebb3

View File

@@ -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
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)