Nowy odpowiednik Punto Switcher dla Linuksa: xswitcher

Zakończenie wsparcia dla xneur sprawiło mi pewien ból w ciągu ostatnich sześciu miesięcy. (od czasu pojawienia się OpenSUSE 15.1 na moich komputerach stacjonarnych: z włączoną funkcją xneur, okna tracą ostrość i zabawnie migoczą w czasie wprowadzania danych z klawiatury).

„Ach, cholera, znowu zacząłem pisać w złym układzie” – w mojej pracy zdarza się to nieprzyzwoicie często. I nie dodaje pozytywu.

Nowy odpowiednik Punto Switcher dla Linuksa: xswitcher
Jednocześnie ja (jako inżynier projektujący) mogę dość jasno wyrazić, czego chcę. A chciałem (najpierw z Punto Switchera, a potem dzięki Windows Vista, w końcu przesiadając się na Linuksa, z xneur) dokładnie jeden. Zdając sobie sprawę, że ekran śmieci ma niewłaściwy układ (zwykle dzieje się to pod koniec wpisywania nowego słowa), naciśnij „Pauza / Przerwa”. I zdobądź to, co wpisałeś.

Na chwilę obecną produkt posiada optymalny (z mojego punktu widzenia) stosunek funkcjonalność/złożoność. Czas się podzielić.

TL.DR

Wszelkie szczegóły techniczne zostaną omówione dalej, więc najpierw - link „dotykać” dla niecierpliwych.

Następujące zachowanie jest obecnie zakodowane na stałe:

  • „Pauza/Przerwa”: podkłada (Backspace) ostatnie słowo, przełącza układ w aktywnym oknie (od 0 do 1) i ponownie pisze.
  • „Lewy Ctrl bez niczego”: przełącza układ aktywnego okna (od 0 do 1).
  • „Lewy Shift bez niczego”: włącza układ nr 0 w aktywnym oknie.
  • „Prawy Shift bez niczego”: włącza układ nr 1 w aktywnym oknie.

Od teraz planuję dostosować zachowanie. Bez sprzężenia zwrotnego - to nie jest interesujące (mi to i tak odpowiada). Uważam, że na Habré jest wystarczający odsetek odbiorców z podobnymi problemami.

NB Ponieważ w aktualnej wersji keylogger jest podłączony do "/dev/input/", xswitcher musi być uruchomiony jako root:

chown root:root xswitcher
chmod +xs xswitcher

Proszę zwrócić uwagę: właścicielem pliku z suid musi być root, ponieważ kto jest właścicielem - w tym suid i zwróci się przy uruchomieniu.

Paranoicy (nie jestem wyjątkiem) mogą klonować GIT i odebrać na miejscu. Tak:

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

Autorun dodać do smaku (w zależności od DE).

Działa, „nie prosi o owsiankę” (≈30 sekund procesora dziennie, ≈12 MB w RSS).

szczegóły

Teraz - szczegóły.

Całe repozytorium było pierwotnie poświęcone mojemu ulubionemu projektowi i jestem zbyt leniwy, aby rozpocząć kolejny. Wszystko jest więc poukładane (tylko w folderach) i pokryte AGPL („patentem na odwrót”).

Kod xswitcher jest napisany w golangu, z minimalnymi dołączeniami C. To podejście powinno dawać najmniej wysiłku (jak dotąd). Zachowanie możliwości podłączenia brakujących poprzez cgo.

W tekście podano komentarze, skąd coś zapożyczono i dlaczego. Ponieważ Kod xneur „nie zainspirował” mnie, wziął go za punkt wyjścia loloswitcher.

Korzystanie z „/dev/input/” ma zarówno zalety (wszystko jest widoczne, łącznie z wciśniętym klawiszem z funkcją automatycznego powtarzania), jak i wady. Wady to:

  • Automatyczne powtarzanie (zdarzenia z kodem „2”) nie koreluje z ponowną próbą z xx.
  • Nie widać danych wejściowych przez interfejsy X11 (na przykład tak działa VNC).
  • Potrzebujesz roota.

Z drugiej strony możesz subskrybować zdarzenia X za pomocą „XSelectExtensionEvent()”. Możesz podglądać kod wejściowy. Na początek nie znalazłem niczego takiego, a wersja robocza implementacji zapewniała sto linii kodu C na bieżąco. Na razie odłóż to na bok.

Zawarcie „powrotu” następuje poprzez przykręcenie wirtualnej klawiatury. Dziękuję autorowi keybd_event, ale abstrakcja jest na zbyt wysokim poziomie i trzeba będzie ją ponownie przerobić. Na przykład prawy klawisz Win wybiera dla mnie trzeci rząd. I tylko lewy Win jest tłumaczony z powrotem.

Znane błędy

  • Nie wiemy nic o wejściu „kompozytowym” (przykład: ½). Nie jest to teraz potrzebne.
  • Niepoprawnie odtwarzaj właściwą Win. W moim przypadku łamie rozmieszczenie akcentów.
  • Nie ma zrozumiałej analizy danych wejściowych. Zamiast tego dostępnych jest kilka funkcji: Compare(), CtrlSequence(), RepeatSequence(), SpaceSequence(). Dzięki nsmcan dla uwagi: poprawione w kodzie i tutaj. Z pewnym prawdopodobieństwem możesz złapać błędy podczas wymiany.
    W tym miejscu nie wiem "jak" i chętnie przyjmę wszelkie sugestie.
  • (O Boże) jednoczesne korzystanie z kanałów (keyboardEvents, miceEvents).

wniosek

Kod jest najprostszą procedurą. I głupi jak ja. Pocieszam się więc nadzieją, że niemal każdemu technikowi uda się dokończyć to, czego chce. Z tego powodu ten produkt nie zginie bez wsparcia, jak większość produktów po prostu dla zabawy.

Powodzenia!

Źródło: www.habr.com

Dodaj komentarz