Bagong analogue ng Punto Switcher para sa linux: xswitcher

Ang pagtatapos ng suporta para sa xneur ay nagdulot sa akin ng ilang sakit sa nakalipas na anim na buwan. (mula nang dumating ang OpenSUSE 15.1 sa aking mga desktop: na may naka-enable na xneur, nawawalan ng focus ang mga bintana at nakakatuwang pagkutitap sa oras na may keyboard input).

"Ah, sumpain ito, muli akong nagsimulang mag-type sa maling layout" - sa aking trabaho madalas itong nangyayari. At hindi nagdaragdag ng positibo.

Bagong analogue ng Punto Switcher para sa linux: xswitcher
Kasabay nito, ako (bilang isang inhinyero ng disenyo) ay nasasabi kung ano ang gusto ko nang malinaw. At gusto ko (mula sa Punto Switcher, at pagkatapos, salamat sa Windows Vista, sa wakas ay lumipat sa Linux, mula sa xneur) nang eksakto sa isa. Napagtatanto na ang screen ng basura ay nasa maling layout (karaniwang nangyayari ito sa dulo ng pag-type ng bagong salita), stomp sa "Pause / Break". At kunin ang na-type mo.

Sa ngayon, ang produkto ay may pinakamainam (mula sa aking pananaw) na ratio ng pag-andar / pagiging kumplikado. Oras na para magbahagi.

TL.DR

Susundan ang lahat ng uri ng teknikal na detalye, kaya una - link na "to touch" para sa mga naiinip.

Kasalukuyang naka-hardcode ang sumusunod na gawi:

  • "I-pause/Break": pads (Backspace) ang huling salita, inililipat ang layout sa aktibong window (sa pagitan ng 0 at 1) at muling nag-type.
  • "Left Ctrl with nothing": inililipat ang layout sa aktibong window (sa pagitan ng 0 at 1).
  • "Left Shift without Nothing": ino-on ang layout #0 sa aktibong window.
  • β€œRight Shift without Nothing”: ino-on ang layout #1 sa aktibong window.

Mula ngayon, plano kong i-customize ang pag-uugali. Kung walang feedback, hindi ito kawili-wili (nababagay pa rin ito sa akin). Naniniwala ako na sa HabrΓ© mayroong sapat na porsyento ng madla na may mga katulad na problema.

NB kasi sa kasalukuyang bersyon, ang keylogger ay naka-attach sa "/dev/input/", xswitcher ay dapat na tumakbo bilang root:

chown root:root xswitcher
chmod +xs xswitcher

Mangyaring tandaan: dapat root ang may-ari ng file na may suid, kasi sino ang may-ari - sa suid na iyon at liliko sa startup.

Ang mga paranoid (hindi ako exception) ay maaaring mag-clone mula sa GIT at mangolekta sa site. Tulad niyan:

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

Magdagdag ng autorun sa panlasa (depende sa DE).

Gumagana, "hindi humihingi ng lugaw" (β‰ˆ30 CPU segundo bawat araw, β‰ˆ12 MB sa RSS).

Mga detalye

Ngayon - ang mga detalye.

Ang buong repository ay orihinal na nakatuon sa aking pet project, at tinatamad akong magsimula ng isa pa. Kaya, ang lahat ay nakasalansan (sa mga folder lamang) at natatakpan ng AGPL ("patent in reverse").

Ang xswitcher code ay nakasulat sa golang, na may kaunting C inclusions. Ang diskarte na ito ay dapat na magbigay ng hindi bababa sa pagsisikap (sa ngayon). Pagpapanatili ng kakayahang ikonekta ang nawawala sa pamamagitan ng cgo.

Ang mga komento ay inilatag sa teksto, mula sa kung saan sila humiram ng isang bagay at bakit. kasi xneur code "ay hindi nagbigay inspirasyon" sa akin, kinuha ito bilang isang panimulang punto loloswitcher.

Ang paggamit ng "/dev/input/" ay may parehong mga pakinabang nito (lahat ay nakikita, kasama ang pinindot na key na may auto-repeat) at mga disadvantages. Ang cons ay:

  • Ang auto-repeat (mga kaganapang may code na "2") ay hindi nauugnay sa muling pagsubok sa xx.
  • Hindi makita ang input sa pamamagitan ng mga interface ng X11 (halimbawa, ganito gumagana ang VNC).
  • Kailangan ng ugat.

Sa kabilang banda, maaari kang mag-subscribe sa mga kaganapan sa X sa pamamagitan ng "XSelectExtensionEvent()". Maaari kang sumilip sa xinput code. For go, wala akong nakitang ganyan, at ang draft na pagpapatupad ay nagbigay ng isang daang linya ng C-code on the go. Sa ngayon, isantabi muna.

Ang konklusyon na "pabalik" ay ginawa sa pamamagitan ng pag-screwing sa virtual na keyboard. Salamat sa may-akda ng keybd_event, ngunit mayroong masyadong mataas na antas ng abstraction at kailangan pang gawing muli. Halimbawa, pinipili ng tamang Win-key ang 3rd row para sa akin. At ang kaliwang Panalo lamang ang isinalin pabalik.

Mga Kilalang Bug

  • Wala kaming alam tungkol sa "composite" na input (halimbawa: Β½). Hindi ito kailangan sa ngayon.
  • Maling kopyahin ang tamang Panalo. Sa aking kaso, sinisira nito ang paglalagay ng mga accent.
  • Walang naiintindihan na pag-parse ng input. Sa halip, mayroong ilang mga function: Compare(), CtrlSequence(), RepeatSequence(), SpaceSequence(). salamat nsmcan para sa pagkaasikaso: naitama sa code at dito. Sa isang tiyak na posibilidad, maaari kang makakuha ng mga bug kapag pinapalitan.
    Sa lugar na ito, hindi ko alam "kung paano" at matutuwa ako sa anumang mga mungkahi.
  • (Diyos ko) sabay-sabay na paggamit ng mga channel (keyboardEvents, miceEvents).

Konklusyon

Ang code ay ang pinakasimpleng pamamaraan. At tanga tulad ko. Kaya, inaaliw ko ang sarili ko sa pag-asang halos kahit sinong techie ay makakatapos ng gusto niya. At dahil dito, ang produktong ito ay hindi mamamatay nang walang suporta, tulad ng karamihan para lamang sa kasiyahan.

Good luck!

Pinagmulan: www.habr.com

Magdagdag ng komento