Nouveau compagnon de Punto Switcher pour Linux : xswitcher

La fin du support de xneur m'a causé certains désagréments au cours des six derniers mois. (avec l'apparition d'OpenSUSE 15.1 sur mes bureaux : lorsque xneur est activé, les fenêtres perdent le focus et clignotent de manière amusante au rythme des frappes au clavier).

«Ah, mince, je recommence encore à taper dans le mauvais agencement» — cela m'arrive de manière indécente dans mon travail. Et cela n'ajoute pas de positif.

Nouveau compagnon de Punto Switcher pour Linux : xswitcher
En même temps, moi (en tant qu'ingénieur concepteur) peux formuler clairement ce que je veux. Et ce que je voulais (d'abord de Punto Switcher, puis, merci Windows Vista, ayant finalement basculé sur Linux, de xneur) était une seule chose. Réalisant qu'il y a des nonsens à l'écran dans le mauvais agencement (ce qui arrive le plus souvent à la fin de la saisie d'un nouveau mot), je voulais frapper «Pause/Break». Et obtenir ce que j'avais tapé.

À ce jour, le produit a un rapport fonctionnalité/complexité optimal (à mon avis). Il est temps de partager.

TL.DR

Ensuite viendront quelques détails techniques, donc d'abord — un lien «à toucher» pour les impatients.

Actuellement, le comportement suivant est codé en dur :

  • «Pause/Break» : supprime (Backspace) le dernier mot, change l'agencement dans la fenêtre active (entre 0 et 1) et le retape.
  • «Ctrl gauche sans rien» : change l'agencement dans la fenêtre active (entre 0 et 1).
  • «Shift gauche sans rien» : active l'agencement n°0 dans la fenêtre active.
  • «Shift droit sans rien» : active l'agencement n°1 dans la fenêtre active.

À partir de maintenant, je prévois de personnaliser le comportement. Sans retour d'information — ce n'est pas intéressant (je suis déjà satisfait). Je suppose qu'il y aura un nombre suffisant d'auditeurs sur Habr avec des problèmes similaires.

N.B. Étant donné que dans la version actuelle, le keylogger est attaché à "/dev/input/", xswitcher doit être lancé avec des droits root :

chown root:root xswitcher
chmod +xs xswitcher

rmem le propriétaire du fichier avec suid doit être root, car celui qui est propriétaire — sera le suid et le transformera lors de l'exécution.

Les paranoïaques (je ne fais pas exception) peuvent cloner depuis GIT et compiler sur place. À peu près comme ça :

go get "github.com/micmonay/keybd_event"
go get "github.com/gvalkov/golang-evdev"

### En-têtes X11 pour OpenSUSE/deb-basé
zypper install libX11-devel libXmu-devel
apt-get install libx11-dev libxmu-dev

cd "x switcher/src/"
go build -o xswitcher -ldflags "-s -w" --tags static_all src/*.go

Ajouter un autostart selon vos préférences (selon l'environnement de bureau).

Ça fonctionne, «ne demande pas de confiture» (≈30 secondes de CPU par jour, ≈12 Mo en RSS).

Détails

Maintenant — les détails.

L'ensemble du référentiel était à l'origine dédié à mon projet personnel, et je suis trop paresseux pour en créer un autre. Donc, tout est mélangé (juste dans des dossiers) et couvert par l'AGPL (« brevet inverse »).

Le code xswitcher est écrit en golang, avec des insertions minimales de C. Ce choix est censé entraîner le moins de travail possible (jusqu'à présent, ça fonctionne). Cela permet également de connecter les parties manquantes via cgo.

Des commentaires sont disposés dans le texte, indiquant d'où provient chaque élément et pourquoi. Étant donné que le code xneur ne m'a pas « inspiré », j'ai pris comme point de départ loloswitcher.

L'utilisation de "/dev/input/" a ses avantages (tout est visible, y compris la touche enfoncée avec répétition automatique) et ses inconvénients. Les inconvénients sont les suivants :

  • La répétition automatique (événements avec le code « 2 ») ne correspond pas à la répétition sur les écrans X.
  • Impossible de voir l'entrée via les interfaces X11 (par exemple, VNC fonctionne ainsi).
  • Un accès root est nécessaire.

D'un autre côté, il est possible de s'abonner aux événements X via « XSelectExtensionEvent() ». On peut consulter le code xinput. Je n'ai trouvé rien de semblable pour Go, et une ébauche a donné d'emblée une centaine de lignes de code C. Pour l'instant, j'ai mis de côté.

La sortie « inverse » a été réalisée via l'ajout d'un clavier virtuel. Merci à l'auteur de keybd_event, mais c'est une abstraction trop haute et il faudra réajuster par la suite. Par exemple, la touche Win droite sélectionne la 3ᵉ ligne. Et en retour, seule la Win gauche est traduite.

Erreurs connues

  • Nous ne savons rien sur l'entrée « composite » (exemple : ½). En ce moment, ce n'est pas nécessaire.
  • Nous reproduisons incorrectement la touche Win droite. Dans mon cas, cela perturbe la disposition des accents.
  • Il n'y a pas d'analyse claire de l'entrée. À la place, plusieurs fonctions : Compare(), CtrlSequence(), RepeatSequence(), SpaceSequence(). Merci nsmcan pour l'attention : j'ai corrigé dans le code et ici. Avec une certaine probabilité, des bugs peuvent survenir lors des remplacements.
    À cet endroit, je ne sais pas « comment faire » et je serais ravi de toute suggestion.
  • (Oh non) utilisation concurrente des canaux (keyboardEvents, miceEvents).

Conclusion

Le code est le plus simple qui soit, procédural. Et aussi bête que moi. Donc, je me console avec l'espoir que n'importe quel technicien pourra écrire ce qui manque. Et que ce produit ne disparaîtra pas sans soutien, comme la plupart des projets juste pour le plaisir.

Bonne chance !

Source : habr.com

Acheter un hébergement fiable pour les sites avec protection DDoS, serveurs VPS VDS 🔥 Acheter un hébergement fiable pour les sites avec protection DDoS, serveurs VPS VDS | ProHoster