Încetarea suportului pentru xneur mi-a provocat anumite neplăceri în ultimele șase luni (de când a apărut OpenSUSE 15.1 pe desktopurile mele: cu xneur activ, feroneriile pierd focusul și clipește amuzant în ritmul introducerii de pe tastatură).
„Ah, naiba, din nou am început să scriu cu o altă dispoziție” — se întâmplă cu o frecvență inacceptabilă în munca mea. Și nu adaugă deloc pozitivism.

În același timp, eu (ca inginer proiectant) pot formula destul de clar ceea ce vreau. Și am vrut (mai întâi de la Punto Switcher, iar apoi, mulțumită Windows Vista, întorcându-mă complet pe Linux, de la xneur) un singur lucru. Realizând că pe ecran este un amestec de caractere dintr-o altă dispoziție (acest lucru apare de obicei la sfârșitul introducerii unui cuvânt nou), să apăs pe „Pause/Break”. Și să primesc ceea ce am tastat.
În prezent, produsul are un raport optim (din perspectiva mea) între funcționalitate și complexitate. E timpul să împărtășesc.
TL.DR
Urmează diverse detalii tehnice, așa că mai întâi — pentru cei nerăbdători.
În acest moment, comportamentul următor este hardcodat:
- „Pause/Break”: șterge (Backspace) ultimul cuvânt, comută dispoziția în fereastra activă (între 0 și 1) și reintroduce încă o dată.
- „Ctrl stânga fără altceva”: comută dispoziția în fereastra activă (între 0 și 1).
- „Shift stânga fără altceva”: activează în fereastra activă dispoziția nr. 0.
- „Shift dreapta fără altceva”: activează în fereastra activă dispoziția nr. 1.
De acum înainte, intenționez să personalizăm comportamentul. Fără feedback — nu este interesant (mă mulțumește deja). Cred că pe Habr se va găsi un procent suficient de audiență cu probleme similare.
N.B. Dacă în versiunea curentă keyloggerul este asociat cu "/dev/input/", xswitcher trebuie să fie lansat cu drepturi de root:
chown root:root xswitcher
chmod +xs xswitcherRețineți: proprietarul fișierului cu suid trebuie să fie root, deoarece cine este proprietar — acela va deveni suid la lansare.
Paranoicii (eu nu sunt o excepție) pot clona din și compila local. Aproximativ așa:
go get "github.com/micmonay/keybd_event"
go get "github.com/gvalkov/golang-evdev"
### Header X11 pentru 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
Autolansați conform preferințelor (în funcție de DE).
Funcționează, „nu consumă resurse” (≈30 secunde CPU pe zi, ≈12 MB în RSS).
Detalii
Acum — detaliile.
Întregul repository a fost dedicat inițial proiectului meu personal, iar crea altul — mă simt prea leneș. Așa că, totul este amestecat (pur și simplu pe foldere) și acoperit de AGPL („brevet invers”).
Codul xswitcher a fost scris în golang, cu câteva inserții de C. Se presupune că această abordare va oferi cele mai mici cheltuieli de muncă (până acum așa este). Menținând posibilitatea de a conecta lipsurile prin cgo.
Pe text sunt notate comentarii despre de unde am împrumutat și de ce. Deoarece codul xneur nu m-a „inspirat”, am folosit ca punct de plecare .
Utilizarea "\/dev\/input\/" are atât avantaje (totul este vizibil, inclusiv apăsarea unei taste cu repetare automată), cât și dezavantaje. Dezavantajele sunt următoarele:
- Repetarea automată (evenimente cu codul „2”) nu se corelează cu repetarea de la X.
- Nu se vede introducerea prin interfețele X11 (de exemplu, VNC funcționează astfel).
- Este nevoie de root.
Pe de altă parte, se pot abona la evenimente X prin „XSelectExtensionEvent()”. Poate fi verificat în . Pentru go nu am găsit ceva similar, iar implementarea preliminară a dat instantaneu o sută de linii de cod C. Până atunci, am pus-o deoparte.
Ieşirea „înapoi” a fost realizată temporar prin conectarea unei tastaturi virtuale. Mulțumesc autorului keybd_event, dar acolo este o abstractizare prea de nivel înalt și va trebui să o refac. De exemplu, tasta Win dreapta din rândul 3 selectează. Și înapoi se transmite doar tasta Win stânga.
Erori cunoscute
- Nu știm nimic despre introducerea „compozit” (ex. ½). În acest moment nu este necesar.
- Reproduci greșit tasta Win dreaptă. În cazul meu, distruge aranjarea accentelor.
- Nu există o analiză clară a introducerii. În schimb, sunt câteva funcții: Compare(), CtrlSequence(), RepeatSequence(), SpaceSequence(). Mulțumesc pentru atenție: am corectat în cod și aici. Cu o probabilitate certă, se pot întâlni bug-uri la înlocuire.
În acest loc nu știu „cum ar trebui” și aș fi bucuros pentru orice sugestie. - (O, groază) utilizarea concurentă a canalelor (keyboardEvents, miceEvents).
Concluzie
Codul este un procedural simplu. Și prost ca mine. Așa că, mă consolez cu speranța că ceea ce îmi doresc poate fi terminat de aproape orice tehnician. Și acest produs, datorită acestui lucru, nu va dispărea fără suport, asemenea majorității celor just-for-fun.
Mult noroc!
Sursa: habr.com
