Novu analogu di Punto Switcher per Linux: xswitcher

A fine di u supportu xneur m'hà causatu qualchì soffrenza in l'ultimi sei mesi. (Cù l'avventu di OpenSUSE 15.1 nantu à i mo desktop: cù xneur attivatu, Windows perde u focu è sfarfalla divertente in u tempu cù l'input di tastiera).

"Oh, dannazione, aghju cuminciatu à scrive in u layout sbagliatu di novu" - in u mo travagliu questu succede indecentemente spessu. È ùn aghjunghje nunda di pusitivu.

Novu analogu di Punto Switcher per Linux: xswitcher
À u listessu tempu, eiu (cum'è un ingegnere di designu) ponu abbastanza chjaramente formulà ciò chì vogliu. Ma vulia (prima da Punto Switcher, è dopu, grazia à Windows Vista, infine passà à Linux, da xneur) esattamente una cosa. Dopu avè capitu chì i rifiuti nantu à u screnu sò in u layout sbagliatu (questu succede di solitu à a fine di scrive una nova parolla), stomp on "Pause / Break". È uttene ciò chì avete stampatu.

À u mumentu, u pruduttu hà u rapportu ottimali (da u mo puntu di vista) funziunalità / cumplessità. Hè u tempu di sparte.

TL.DR

Ci sarà ogni tipu di dettagli tecnichi dopu, cusì prima - ligame "toccu" per l'impatiente.

Attualmente, u seguente cumpurtamentu hè codificatu:

  • "Pausa / Break": retrocede l'ultima parola, cambia u layout in a finestra attiva (trà 0 è 1) è marca di novu.
  • "Left Ctrl senza nunda": cambia u layout in a finestra attiva (trà 0 è 1).
  • "Left Shift senza nunda": attiva u layout N ° 0 in a finestra attiva.
  • "Shift Right senza nunda": attiva u layout N ° 1 in a finestra attiva.

Da avà aghju pensatu à persunalizà u cumpurtamentu. Senza feedback, ùn hè micca interessante (sò bè ​​in ogni modu). Credu chì nantu à Habré ci sarà un percentinu abbastanza di l'audienza cù prublemi simili.

NB Perchè in a versione attuale, u keylogger hè attaccatu à "/dev/input/", xswitcher deve esse lanciatu cù diritti di root:

chown root:root xswitcher
chmod +xs xswitcher

Da nutà: U pruprietariu di u schedariu cù suid deve esse root, perchè quellu chì hè u pruprietariu serà trasfurmatu in suid à l'iniziu.

Paranoidi (ùn sò micca eccezzioni) ponu clone da GIT è assemblà in situ. Cusì:

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

Aghjunghjite l'autostart à u gustu (secondu DE).

Funziona, "ùn dumanda micca porridge" (≈30 seconde CPU per ghjornu, ≈12 MB in RSS).

Vede u detalls

Avà - i dettagli.

U repositoriu sanu era urigginariamente dedicatu à u mo prughjettu di l'animali, è sò troppu pigro per inizià un altru. Allora, tuttu hè ammucciatu (solu in cartulare) è coperto da AGPL ("brevetu inversu").

U codice xswitcher hè scrittu in golang, cù l'inclusioni minimu di C. Hè presumitu chì questu approcciu hà da risultatu in u minimu sforzu (finu à avà hà). Mentre mantene a capacità di cunnette ciò chì manca cù cgo.

U testu cuntene cumenti nantu à induve hè statu pigliatu in prestu è perchè. Perchè u codice xneur "ùn m'hà micca inspiratu", aghju pigliatu cum'è un puntu di partenza loloswitcher.

Utilizà "/dev/input/" hà i so vantaghji (tuttu hè visibile, cumprese a chjave di ripetizione automatica pressata) è i svantaghji. I svantaghji sò:

  • Auto-ripetizione (eventi cù u codice "2") ùn hè micca correlate cù a ripetizione cù x.
  • L'input attraversu l'interfaccia X11 ùn hè micca visibile (questu hè cumu funziona VNC, per esempiu).
  • Bisognu root.

Per d 'altra banda, hè pussibule subscribe à X eventi via "XSelectExtensionEvent()". Pudete sguardu codice xinput. Ùn aghju micca truvatu nunda cusì per andà, è l'implementazione ruvida hà pigliatu immediatamente un centu di linee di codice C. Mettite da parte per avà.

L'output "inversu" hè attualmente fattu per avvità u teclatu virtuale. Grazie à l'autore di keybd_event, ma l'astrazione ci hè troppu altu è duverà esse rifatta più. Per esempiu, aghju utilizatu a chjave Win dritta per selezziunà a 3a fila. È solu u Win manca hè trasmessu daretu.

Bugs cunnisciuti

  • Ùn sapemu nunda di input "compositu" (esempiu: ½). Ùn hè micca necessariu avà.
  • Avemu ghjucatu à u dirittu Win incorrectly. In u mo casu, rompe l'enfasi.
  • Ùn ci hè micca un analisi di input chjaru. Invece, ci sò parechje funzioni: Compare (), CtrlSequence (), RepeatSequence (), SpaceSequence (). Спасибо nsmcan per a vostra cura: currettu in u codice è quì. Cù una certa probabilità, pudete catturà bugs quandu rimpiazzà.
    À questu puntu ùn sò micca sapè "cumu" è accolta ogni suggerimentu.
  • (Oh Diu) usu cumpetitivu di i canali (keyboardEvents, miceEvents).

cunchiusioni

U codice hè u prucessu più simplice. È stupidu cum'è mè. Allora, mi flatteru cù a speranza chì quasi ogni tecnicu serà capace di compie ciò ch'ellu vole. È grazia à questu, stu pruduttu ùn perisce micca senza supportu, cum'è a maiò parte di u divertimentu.

Bona furtuna!

Source: www.habr.com

Add a comment