Jauns Punto Switcher analogs priekÅ” Linux: xswitcher

Xneur atbalsta beigas pēdējo seÅ”u mēneÅ”u laikā man ir radÄ«juÅ”as dažas cieÅ”anas. (ar OpenSUSE 15.1 parādÄ«Å”anos manos galddatoros: ja ir iespējots xneur, logi zaudē fokusu un ar tastatÅ«ras ievadi laikā mirgo smieklÄ«gi).

ā€œAk, sasodÄ«ts, es atkal sāku rakstÄ«t nepareizu izkārtojumuā€ - tas manā darbā notiek nepieklājÄ«gi bieži. Un tas neko pozitÄ«vu nedod.

Jauns Punto Switcher analogs priekÅ” Linux: xswitcher
Tajā paŔā laikā es (kā projektÄ“Å”anas inženieris) varu diezgan skaidri formulēt, ko vēlos. Bet es gribēju (vispirms no Punto Switcher, un pēc tam, pateicoties Windows Vista, beidzot pāriet uz Linux, no xneur) tieÅ”i vienu lietu. Apzinoties, ka atkritumi uz ekrāna ir nepareizā izkārtojumā (tas parasti notiek jauna vārda ievadÄ«Å”anas beigās), nospiediet ā€œPauze/pārtraukumsā€. Un iegÅ«stiet to, ko izdrukājāt.

Šobrīd produktam ir optimāla (no mana viedokļa) funkcionalitātes/sarežģītības attiecība. Ir pienācis laiks dalīties.

TL.DR

Vēlāk būs visādas tehniskas detaļas, tāpēc vispirms - saite "pieskarties" nepacietīgajiem.

PaÅ”laik Ŕāda darbÄ«ba ir iekodēta:

  • ā€œPauze/pārtraukumsā€: atkāpjas pie pēdējā vārda, pārslēdz izkārtojumu aktÄ«vajā logā (no 0 lÄ«dz 1) un zvana vēlreiz.
  • ā€œPa kreisi Ctrl bez nekāā€: pārslēdz izkārtojumu aktÄ«vajā logā (no 0 lÄ«dz 1).
  • ā€œPa kreisi Shift bez nekāā€: ieslēdz izkārtojumu Nr. 0 aktÄ«vajā logā.
  • ā€œRight Shift bez nekāā€: ieslēdz izkārtojumu Nr. 1 aktÄ«vajā logā.

No Ŕī brīža es plānoju pielāgot uzvedÄ«bu. Bez atsauksmēm tas nav interesanti (man tik un tā ir labi). Es uzskatu, ka HabrĆ© bÅ«s pietiekams procents auditorijas ar lÄ«dzÄ«gām problēmām.

NB Jo paÅ”reizējā versijā keylogger ir pievienots "/dev/input/", xswitcher ir jāpalaiž ar root tiesÄ«bām:

chown root:root xswitcher
chmod +xs xswitcher

LÅ«dzu, ņemiet vērā: Faila Ä«paÅ”niekam ar suid jābÅ«t root, jo kurÅ” ir Ä«paÅ”nieks, startÄ“Å”anas laikā tiks pārvērsts par suid.

Paranoids (es neesmu izņēmums) var klonēt no Git un salikt uz vietas. Tāds:

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

Pievienojiet automātisko palaiÅ”anu pēc garÅ”as (atkarÄ«bā no DE).

Tas darbojas, ā€œputru neprasaā€ (ā‰ˆ30 sekundes CPU dienā, ā‰ˆ12 MB RSS).

Detaļas

Tagad - detaļas.

Visa krātuve sākotnēji bija veltÄ«ta manam mājdzÄ«vnieku projektam, un es esmu pārāk slinks, lai sāktu citu. Tātad, viss ir sakrauts (tikai mapēs) un pārklāts ar AGPL (ā€œapgrieztais patentsā€).

Xswitcher kods ir rakstÄ«ts golangā, ar minimālu C iekļauÅ”anu. Tiek pieņemts, ka Ŕī pieeja radÄ«s vismazāko piepÅ«li (lÄ«dz Å”im). Saglabājot iespēju savienot trÅ«kstoÅ”o, izmantojot cgo.

Tekstā ir komentāri par to, no kurienes un kāpēc tas aizgūts. Jo xneur kods "neiedvesmoja mani", es to ņēmu kā sākumpunktu loloswitcher.

Lietojot "/dev/input/", ir gan savas priekÅ”rocÄ«bas (viss ir redzams, ieskaitot nospiesto automātiskās atkārtoÅ”anas taustiņu), gan trÅ«kumi. TrÅ«kumi ir:

  • Automātiskā atkārtoÅ”ana (notikumi ar kodu ā€œ2ā€) nekorelē ar atkārtoÅ”anos ar x.
  • Ievade caur X11 saskarnēm nav redzama (tā, piemēram, darbojas VNC).
  • Vajag sakni.

No otras puses, ir iespējams abonēt X notikumus, izmantojot "XSelectExtensionEvent()". Vari palÅ«rēt xinput kodu. Es neko tamlÄ«dzÄ«gu neatradu, un aptuvenā ievieÅ”ana uzreiz aizņēma simts C koda rindiņas. Pagaidām noliec malā.

ā€œApgrieztāā€ izvade paÅ”laik tiek veikta, pieskrÅ«vējot virtuālo tastatÅ«ru. Paldies keybd_event autoram, bet abstrakcija tur ir pārāk augsta lÄ«meņa un bÅ«s jāpārtaisa tālāk. Piemēram, es izmantoju labo taustiņu Win, lai atlasÄ«tu 3. rindu. Un tikai kreisais Win tiek nosÅ«tÄ«ts atpakaļ.

Zināmās kļūdas

  • Mēs neko nezinām par ā€œsaliktoā€ ievadi (piemērs: Ā½). Å obrÄ«d tas nav vajadzÄ«gs.
  • Mēs nepareizi spēlējam pareizo Win. Manā gadÄ«jumā tas izjauc uzsvaru.
  • Nav skaidras ievades parsÄ“Å”anas. Tā vietā ir vairākas funkcijas: Compare(), CtrlSequence(), RepeatSequence(), SpaceSequence(). Paldies nsmcan jÅ«su aprÅ«pei: izlaboja to kodā un Å”eit. Ar noteiktu varbÅ«tÄ«bu, nomainot, jÅ«s varat noÄ·ert kļūdas.
    Šobrīd es nezinu, kā rīkoties, un priecāŔos par jebkādiem ieteikumiem.
  • (Ak Dievs) konkurētspējÄ«ga kanālu izmantoÅ”ana (keyboardEvents, miceEvents).

Secinājums

Kods ir vienkārŔākais procedÅ«ras veids. Un stulba kā es. Tāpēc es glaimoju sev ar cerÄ«bu, ka gandrÄ«z jebkurÅ” tehniÄ·is varēs pabeigt to, ko vēlas. Pateicoties tam, Å”is produkts nepazudÄ«s bez atbalsta, tāpat kā vairums, kas paredzēts tikai izklaidei.

Good luck!

Avots: www.habr.com

Pievieno komentāru