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.
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.