Nouvel analogue de Punto Switcher pour Linux : xswitcher

La fin du support xneur m'a causé quelques souffrances au cours des six derniers mois. (avec l'avènement d'OpenSUSE 15.1 sur mes bureaux : avec xneur activé, Windows perd le focus et scintille de manière amusante au rythme de la saisie au clavier).

"Oh, bon sang, j'ai encore commencé à taper dans la mauvaise mise en page" - dans mon travail, cela arrive souvent de manière indécente. Et cela n’apporte rien de positif.

Nouvel analogue de Punto Switcher pour Linux : xswitcher
En même temps, je (en tant qu'ingénieur d'études) peux formuler très clairement ce que je veux. Mais je voulais (d'abord depuis Punto Switcher, puis, grâce à Windows Vista, enfin passer à Linux, depuis xneur) exactement une chose. Après avoir réalisé que les déchets à l'écran sont dans la mauvaise disposition (cela se produit généralement à la fin de la saisie d'un nouveau mot), appuyez sur « Pause/Pause ». Et récupérez ce que vous avez imprimé.

Pour le moment, le produit a le rapport fonctionnalité/complexité optimal (de mon point de vue). Il est temps de partager.

TL.DR

Il y aura toutes sortes de détails techniques plus tard, alors d'abord... lien "toucher" pour les impatients.

Actuellement, le comportement suivant est codé en dur :

  • « Pause/Pause » : recule le dernier mot, change la disposition dans la fenêtre active (entre 0 et 1) et compose à nouveau.
  • « Ctrl gauche sans rien » : change la disposition dans la fenêtre active (entre 0 et 1).
  • « Shift gauche sans rien » : active la mise en page n°0 dans la fenêtre active.
  • « Shift droite sans rien » : active la mise en page n°1 dans la fenêtre active.

A partir de maintenant, je prévois de personnaliser le comportement. Sans feedback, ce n’est pas intéressant (ça me va en tout cas). Je pense que sur Habré, il y aura un pourcentage suffisant d'auditeurs confrontés à des problèmes similaires.

NB Parce que dans la version actuelle, le keylogger est attaché à "/dev/input/", xswitcher doit être lancé avec les droits root :

chown root:root xswitcher
chmod +xs xswitcher

S'il vous plaît noter: Le propriétaire du fichier avec suid doit être root, car quel que soit le propriétaire, il sera transformé en suid au démarrage.

Les paranoïaques (je ne fais pas exception) peuvent cloner depuis GIT et assembler sur place. Comme ça:

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

### X11 headers for OpenSUSE/deb-based
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

Ajoutez un démarrage automatique au goût (selon DE).

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

détails

Maintenant, les détails.

L’intégralité du référentiel était à l’origine dédiée à mon projet favori, et je suis trop paresseux pour en démarrer un autre. Du coup, tout est entassé (juste dans des dossiers) et couvert par l'AGPL (« reverse patent »).

Le code xswitcher est écrit en golang, avec des inclusions minimales de C. On suppose que cette approche entraînera le moins d'effort (jusqu'à présent). Tout en conservant la possibilité de connecter ce qui manque à l'aide de cgo.

Le texte contient des commentaires sur l'endroit où il a été emprunté et pourquoi. Parce que le code xneur "ne m'a pas inspiré", je l'ai pris comme point de départ loloswitcher.

Utiliser "/dev/input/" présente à la fois des avantages (tout est visible, y compris la touche de répétition automatique enfoncée) et des inconvénients. Les inconvénients sont :

  • La répétition automatique (événements avec le code « 2 ») n'est pas en corrélation avec la répétition avec x.
  • L'entrée via les interfaces X11 n'est pas visible (c'est ainsi que fonctionne VNC, par exemple).
  • Besoin de racine.

En revanche, il est possible de s'abonner aux événements X via "XSelectExtensionEvent()". Vous pouvez jeter un coup d'oeil à code d'entrée. Je n'ai rien trouvé de tel, et l'implémentation approximative a immédiatement nécessité une centaine de lignes de code C. Mettez-le de côté pour le moment.

La sortie « inverse » se fait actuellement par vissage du clavier virtuel. Merci à l'auteur de keybd_event, mais l'abstraction y est de trop haut niveau et devra être refaite davantage. Par exemple, j'utilise la touche Win droite pour sélectionner la 3ème ligne. Et seul le Win gauche est retransmis.

Bogues connus

  • Nous ne savons rien de l’entrée « composite » (exemple : ½). Ce n'est pas nécessaire pour le moment.
  • Nous jouons incorrectement le bon Win. Dans mon cas, cela brise l'accent.
  • Il n’y a pas d’analyse d’entrée claire. Au lieu de cela, il existe plusieurs fonctions : Compare(), CtrlSequence(), RepeatSequence(), SpaceSequence(). merci nsmcan pour vos soins : corrigé dans le code et ici. Avec une certaine probabilité, vous pouvez détecter des bugs lors du remplacement.
    À ce stade, je ne sais pas « comment faire » et j’apprécierais toute suggestion.
  • (Oh mon Dieu) utilisation compétitive des canaux (keyboardEvents, mouseEvents).

Conclusion

Le code est la procédure la plus simple. Et stupide comme moi. Alors, je me flatte d'espérer que presque n'importe quel technicien pourra réaliser ce qu'il veut. Et grâce à cela, ce produit ne périra pas sans soutien, comme la plupart des produits juste pour le plaisir.

Bonne chance!

Source: habr.com

Ajouter un commentaire