Nouveau Punto Switcher pour Linux: xswitcher

La fin de la prise en charge de xneur m'a causé des souffrances au cours des six derniers mois (avec l'avènement d'OpenSUSE 15.1 sur mes ordinateurs de bureau: lorsque xneur est allumé, les fenêtres perdent le focus et scintillent de manière amusante au rythme d'entrée du clavier) .

«Ah, bon sang, j'ai recommencé à taper dans la mauvaise disposition» - c'est souvent obscène dans mon travail. Et n'ajoute pas de positif.


En même temps, je (en tant qu'ingénieur de conception) peux exprimer clairement ce que je veux. Et je voulais (d'abord de Punto Switcher, puis, grâce à Windows Vista, enfin replanter sur Linux, de xneur) exactement un. En réalisant que les déchets sur l'écran ne sont pas dans cette disposition (cela se produit généralement à la fin d'un nouveau jeu de mots), appuyez sur "Pause / Break". Et obtenez ce que j'ai imprimé.

À l'heure actuelle, le produit présente un rapport fonctionnalité / complexité optimal (du point de vue de moi). Il est temps de partager.

TL.DR


Toutes sortes de détails techniques continueront, donc tout d'abord - un lien «tactile» pour les impatients.

Le comportement suivant est actuellement codé en dur:

  • "Pause / Break": recule le dernier mot, change la mise en page dans la fenêtre active (entre 0 et 1) et retape.
  • Ctrl gauche sans rien: bascule la disposition dans la fenêtre active (entre 0 et 1).
  • "Maj gauche sans rien": active la disposition 0 dans la fenêtre active.
  • «Décalage à droite sans rien»: active la disposition n ° 1 dans la fenêtre active.

A partir de maintenant, je prévois de personnaliser le comportement. Sans commentaires, ce n'est pas intéressant (j'en suis satisfait quand même). Je pense que sur Habré, il y aura un pourcentage suffisant d'audience avec des problèmes similaires.

NB Depuis dans la version actuelle, le keylogger est vissé sur "/ dev / input /", xswitcher devrait fonctionner avec les droits root:

chown root:root xswitcher
chmod +xs xswitcher

Veuillez noter: le propriétaire du fichier avec suid doit être root, comme qui est le propriétaire est suid et activera le démarrage.

Les paranoïdes (je ne fais pas exception) peuvent cloner à partir de GIT et s'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

Démarrage automatique ajouter au goût (en fonction de DE).

Cela fonctionne, "ne demandez pas de bouillie" (seconds30 secondes CPU par jour, ≈12 Mo en RSS).

Détails


Maintenant pour les détails.

Le référentiel entier était à l'origine dédié à mon projet pour animaux de compagnie, et en démarrer un autre est trop paresseux. Ainsi, tout est empilé (juste dans des dossiers) et recouvert d'AGPL ("brevet vice versa").

Le code xswitcher est écrit en golang, avec un splash minimal de C. On suppose que cette approche donnera le moins d'effort (jusqu'à présent, elle l'est). Tout en conservant la possibilité de connecter les disparus via cgo.

Le texte du commentaire est présenté, d'où il a été emprunté et pourquoi. Parce que le code xneur "ne m'a pas inspiré", a pris loloswitcher comme point de départ .

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

  • La répétition automatique (événements avec le code «2») n'est pas corrélée avec la répétition avec X.
  • Vous ne pouvez pas voir l'entrée via les interfaces X11 (par exemple, VNC fonctionne).
  • Besoin d'une racine.

Alternativement, vous pouvez vous abonner aux événements X via "XSelectExtensionEvent ()". Vous pouvez jeter un œil au code xinput . Pour commencer, je n'ai rien trouvé de tel, et le projet d'implémentation a donné une centaine de lignes de code C à la fois. Jusqu'ici mis de côté.

La conclusion "retour" jusqu'à présent a été faite en vissant le clavier virtuel. Merci à l'auteur keybd_event, mais il y a une abstraction de trop haut niveau et devra être refaite plus loin. Par exemple, j'ai la bonne clé Win, la 3ème ligne sélectionne. Et seule la victoire de gauche est retransmise.

Bugs connus


  • Nous ne savons rien de l'entrée «composite» (exemple: ½). Ce n'est pas nécessaire pour le moment.
  • Nous reproduisons incorrectement le bon Win. Dans mon cas, ça casse la disposition des accents.
  • Il n'y a pas d'analyse claire de l'entrée. Au lieu de cela, il existe plusieurs fonctions: Compare (), CtrlSequence (), RepeatSequence (), SpaceSequence (). remerciernsmcanpour l'attention: fixé dans le code ici. Avec une certaine probabilité, vous pouvez attraper des bogues lors du remplacement.
    Dans cet endroit, je ne sais pas comment faire et je serai heureux de toute suggestion.
  • (Oh, horreur) utilisation compétitive des canaux (KeyboardEvents, miceEvents).

Conclusion


Le code est la procédure la plus simple. Et stupide comme moi. Donc, je me console avec l'espoir que presque n'importe quel technicien sera en mesure de terminer ce qu'il veut. Et ce produit ne disparaîtra pas sans support comme la plupart juste pour le plaisir.

Bonne chance

All Articles