Nou analog al Punto Switcher pentru Linux: xswitcher

Sfârșitul sprijinului xneur mi-a provocat o anumită suferință în ultimele șase luni. (odată cu apariția OpenSUSE 15.1 pe desktopurile mele: cu xneur activat, Windows își pierde focalizarea și pâlpâie amuzant în timp cu introducerea de la tastatură).

„Oh, la naiba, am început să scriu din nou în aspectul greșit” - în munca mea acest lucru se întâmplă indecent de des. Și nu adaugă nimic pozitiv.

Nou analog al Punto Switcher pentru Linux: xswitcher
În același timp, eu (ca inginer proiectant) pot formula destul de clar ceea ce vreau. Dar mi-am dorit (mai întâi de la Punto Switcher, și apoi, datorită Windows Vista, trecând în sfârșit la Linux, de la xneur) exact un lucru. După ce v-ați dat seama că gunoiul de pe ecran este într-un aspect greșit (acest lucru se întâmplă de obicei la sfârșitul tastării unui cuvânt nou), apăsați pe „Pauză/Pauză”. Și obțineți ceea ce ați imprimat.

In momentul de fata, produsul are raportul optim (din punctul meu de vedere) functionalitate/complexitate. E timpul să împărtășești.

TL.DR

Vor fi tot felul de detalii tehnice mai târziu, așa că mai întâi - link "a atinge" pentru cei nerăbdători.

În prezent, următorul comportament este codificat:

  • „Pauză/Pauză”: face înapoi ultimul cuvânt, schimbă aspectul în fereastra activă (între 0 și 1) și formează din nou.
  • „Ctrl stânga fără nimic”: schimbă aspectul în fereastra activă (între 0 și 1).
  • „Shift la stânga fără nimic”: activează aspectul nr. 0 în fereastra activă.
  • „Shift la dreapta fără nimic”: activează aspectul nr. 1 în fereastra activă.

De acum intenționez să personalizez comportamentul. Fără feedback, nu este interesant (oricum sunt bine cu el). Cred că pe Habré va fi un procent suficient de public cu probleme similare.

NB Deoarece în versiunea curentă, keylogger-ul este atașat la „/dev/input/”, xswitcher-ul trebuie să fie lansat cu drepturi root:

chown root:root xswitcher
chmod +xs xswitcher

Vă rugăm să rețineți: Proprietarul fișierului cu suid trebuie să fie root, deoarece oricine este proprietarul va fi transformat în suid la pornire.

Paranoizii (nu sunt o excepție) pot clona de la GIT și asamblați la fața locului. Ca asta:

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

Adăugați autostart după gust (în funcție de DE).

Funcționează, „nu cere terci” (≈30 de secunde CPU pe zi, ≈12 MB în RSS).

detalii

Acum - detaliile.

Întregul depozit a fost inițial dedicat proiectului meu de companie și îmi este prea lene să încep altul. Deci, totul este îngrămădit (doar în foldere) și acoperit de AGPL („brevet inversat”).

Codul xswitcher este scris în golang, cu incluziuni minime de C. Se presupune că această abordare va duce la cel mai mic efort (până în prezent). Menținând în același timp capacitatea de a conecta ceea ce lipsește folosind cgo.

Textul conține comentarii despre de unde a fost împrumutat și de ce. Deoarece codul xneur „nu m-a inspirat”, l-am luat ca punct de plecare loloswitcher.

Folosirea „/dev/input/” are atât avantajele sale (totul este vizibil, inclusiv tasta de repetare automată apăsată), cât și dezavantaje. Dezavantajele sunt:

  • Repetarea automată (evenimentele cu codul „2”) nu se corelează cu repetarea cu x.
  • Intrarea prin interfețele X11 nu este vizibilă (așa funcționează VNC, de exemplu).
  • Aveți nevoie de rădăcină.

Pe de altă parte, este posibil să vă abonați la X evenimente prin „XSelectExtensionEvent()”. Poți să te uiți la codul xinput. Nu am găsit așa ceva pentru Go, iar implementarea brută a luat imediat o sută de linii de cod C. Pune-o deoparte deocamdată.

Ieșirea „inversă” se face în prezent prin înșurubarea tastaturii virtuale. Mulțumim autorului keybd_event, dar abstracția de acolo este la un nivel prea înalt și va trebui refăcută în continuare. De exemplu, folosesc tasta Win dreapta pentru a selecta al 3-lea rând. Și numai Win stânga este transmis înapoi.

Bug-uri cunoscute

  • Nu știm nimic despre intrarea „compozită” (exemplu: ½). Nu este nevoie acum.
  • Jucăm incorect Win-ul corect. În cazul meu, sparge accentul.
  • Nu există o analiză clară a intrărilor. În schimb, există mai multe funcții: Compare(), CtrlSequence(), RepeatSequence(), SpaceSequence(). mulțumesc nsmcan pentru grija ta: corectat-o ​​în cod și aici. Cu o anumită probabilitate, puteți prinde erori atunci când înlocuiți.
    În acest moment, nu știu „cum” și aș primi orice sugestie.
  • (Oh Doamne) utilizarea competitivă a canalelor (keyboardEvents, miceEvents).

Concluzie

Codul este cel mai simplu procedural. Și prost ca mine. Așadar, mă flatez cu speranța că aproape orice tehnician va putea duce la bun sfârșit ceea ce își dorește. Și datorită acestui lucru, acest produs nu va pieri fără sprijin, la fel ca majoritatea doar pentru distracție.

Noroc!

Sursa: www.habr.com

Adauga un comentariu