Linux üçün Punto Switcher-in yeni analoqu: xswitcher

Xneur dəstəyinin sona çatması son altı ayda mənə bir qədər əziyyət verdi. (Masaüstü kompüterlərimdə OpenSUSE 15.1-in meydana çıxması ilə: xneur aktivləşdirildikdə, pəncərələr diqqəti itirir və klaviatura girişi ilə zamanla gülməli şəkildə titrəyir).

"Oh, lənətə gəldim, yenə səhv tərtibatda yazmağa başladım" - işimdə bu, çox vaxt nalayiq şəkildə olur. Və müsbət bir şey əlavə etmir.

Linux üçün Punto Switcher-in yeni analoqu: xswitcher
Eyni zamanda, mən (konstruktor mühəndisi kimi) istədiyimi tam aydın şəkildə ifadə edə bilirəm. Amma mən (əvvəlcə Punto Switcher-dən, sonra isə Windows Vista sayəsində, nəhayət Linux-a, xneur-dan) tam olaraq bir şey istədim. Ekrandakı zibilin səhv tərtibatda olduğunu başa düşdükdən sonra (bu, adətən, yeni söz yazmağın sonunda olur), “Pause/Break” düyməsini sıxın. Və çap etdiyinizi alın.

Hazırda məhsul optimal (mənim fikrimcə) funksionallıq/mürəkkəblik nisbətinə malikdir. Paylaşmağın vaxtıdır.

TL.DR

Daha sonra hər cür texniki detallar olacaq, ona görə də əvvəlcə - "toxunmaq" linki səbirsizlər üçün.

Hazırda aşağıdakı davranış sərt kodlaşdırılıb:

  • “Pause/Break”: sonuncu sözü geriyə silir, aktiv pəncərədə düzümü dəyişdirir (0 ilə 1 arasında) və yenidən yığır.
  • "Heç bir şey olmadan Ctrl-dən sol": aktiv pəncərədə düzümü dəyişdirir (0 ilə 1 arasında).
  • “Heç bir şey olmadan Sola Shift”: aktiv pəncərədə № 0 tərtibatı yandırır.
  • “Heç bir şey olmadan sağa sürüşdürmə”: aktiv pəncərədə №1 tərtibatı işə salır.

Bundan sonra davranışı fərdiləşdirməyi planlaşdırıram. Rəy olmadan, maraqlı deyil (hər halda razıyam). İnanıram ki, Habré-də oxşar problemləri olan tamaşaçıların kifayət qədər faizi olacaq.

NB Çünki cari versiyada keylogger "/dev/input/"a əlavə olunub, xswitcher kök hüquqları ilə işə salınmalıdır:

chown root:root xswitcher
chmod +xs xswitcher

Qeyd: Suid ilə faylın sahibi kök olmalıdır, çünki sahibi kim olursa olsun, işə başlayanda məhkəməyə çevriləcək.

Paranoidlər (mən istisna deyiləm) klonlaya bilərlər GİT və yerində toplayın. Bunun kimi:

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

Zövqə görə avtomatik işə salma əlavə edin (DE-dən asılı olaraq).

İşləyir, “sıyıq tələb etmir” (gündə ≈30 saniyə CPU, RSS-də ≈12 MB).

Ətraflı

İndi - təfərrüatlar.

Bütün anbar əvvəlcə mənim ev heyvanı layihəmə həsr olunmuşdu və mən başqasına başlamaq üçün çox tənbələm. Beləliklə, hər şey yığılır (yalnız qovluqlarda) və AGPL (“əks patent”) ilə əhatə olunur.

Xswitcher kodu qolanq dilində yazılmışdır, minimum C əlavələri ilə. Bu yanaşmanın ən az səylə nəticələnəcəyi güman edilir (indiyə qədər var). cgo istifadə edərək çatışmayanları birləşdirmək qabiliyyətini qoruyarkən.

Mətndə onun haradan və nə üçün alındığına dair şərhlər var. Çünki xneur kodu "mənə ilham vermədi", mən bunu başlanğıc nöqtəsi kimi qəbul etdim loloswitcher.

"/dev/input/" istifadəsinin həm üstünlükləri var (hər şey görünür, o cümlədən avtomatik təkrarlama düyməsini sıxmaq) və mənfi cəhətləri. Mənfi cəhətləri bunlardır:

  • Avtomatik təkrar (“2” kodu olan hadisələr) x ilə təkrarlama ilə uyğun gəlmir.
  • X11 interfeysləri vasitəsilə daxiletmə görünmür (məsələn, VNC belə işləyir).
  • Kök lazımdır.

Digər tərəfdən, "XSelectExtensionEvent()" vasitəsilə X hadisələrə abunə olmaq mümkündür. Baxa bilərsiniz xinput kodu. Getmək üçün belə bir şey tapmadım və kobud tətbiq dərhal yüz sətir C kodunu götürdü. Hələlik bir kənara qoyun.

“Tərs” çıxış hazırda virtual klaviaturanı vidalamaqla həyata keçirilir. keybd_event müəllifinə təşəkkür edirik, lakin oradakı abstraksiya çox yüksək səviyyədədir və onu daha da təkrarlamaq lazım gələcək. Məsələn, 3-cü sıranı seçmək üçün sağ Win düyməsini istifadə edirəm. Və yalnız sol Win geri ötürülür.

Bilinən Bugs

  • Biz “kompozit” daxiletmə haqqında heç nə bilmirik (məsələn: ½). Hal-hazırda lazım deyil.
  • Biz düzgün Qələbəni səhv oynayırıq. Mənim vəziyyətimdə vurğunu pozur.
  • Aydın giriş təhlili yoxdur. Bunun əvəzinə bir neçə funksiya var: Compare(), CtrlSequence(), RepeatSequence(), SpaceSequence(). Təşəkkür nsmcan qayğınıza görə: kodda və burada düzəldilib. Müəyyən bir ehtimalla, dəyişdirərkən səhvləri tuta bilərsiniz.
    Bu nöqtədə mən "necə" bilmirəm və hər hansı bir təklifi alqışlayıram.
  • (Aman Allah) kanalların rəqabətli istifadəsi (keyboardEvents, miceEvents).

Nəticə

Kod ən sadə prosedurdur. Və mənim kimi axmaq. Beləliklə, demək olar ki, hər bir texnikin istədiyini tamamlaya biləcəyi ümidi ilə yaltaqlanıram. Və bunun sayəsində, bu məhsul bir çox əyləncə üçün olduğu kimi, dəstək olmadan məhv olmayacaq.

Uğurlar!

Mənbə: www.habr.com

Добавить комментарий