Նոր аналог Punto Switcher համար linux: xswitcher

xneur-ի աջակցման դադարեցումը ինձ որոշակի տառապանքներ պատճառեց վերջին կես տարվա ընթացքում (OpenSUSE 15.1-ի հայտնվելու հետ միասին իմ ডেস্কային համակարգերում. xneur-ն անջատելիս պատուհանները կորցնում են կենտրոնացումը և զվարճալի երկաթուղային կերպով շողում են ստեղնաշարի մուտքի արագությամբ).

«Ա, բլին, կրկին այն սխալ ընտրությունով սկսեցի գրել» — իմ աշխատանքում բնութագրում է անհարմարությունների չափազանց բարձր հաճախությունը։ Եվ շատ դրական չի տրվում:

Նոր аналог Punto Switcher համար linux: xswitcher
Միևնույն ժամանակ, ես (ինչպես ինժեներ-կառուցապատող) կարող եմ բավական համարձակ ձևակերպել, թե ինչ եմ ուզում։ Իսկ ես ուզում էի (առաջին հերթին Punto Switcher-ից, այնուհետ՝ շնորհիվ Windows Vista-ի, վերջնականապես անցնելով Linux-ին, xneur-ի շնորհիվ) միայն մեկ բան։ Պարզ ուսգետել, որ էկրանում բարի տեղեկատվություն չէ ճիշտ ընտրությամբ (այսպիսի բաներ սովորաբար պատահում են նոր բառի վերջում), կտրուկ դիպչել «Pause/Break»-ին։ Եվ ստանալ այն, ինչ նախապես տպում էի:

Ներկայումս արտադրանքի ֆունկցիոմալությունն ու բարդությունը ինձ համար օպտիմալ հարաբերակցություն ունեն։ Ժամանակն է կիսվել:

TL.DR

Հաջորդը կլինեն տարբեր տեխնիկական մանրամասներ, այնպես որ תחילה՝ «տարածքի» հղումը անհամբերների համար։

Ներկայումս հետևյալ պահվածքն ամրագրված է Hardcoded կերպով։

  • «Pause/Break»: վերջում լցնում է (Backspace) վերջին բառը, փոխում է ակտիվ պատուհանի ընտրությունը (0 և 1 միջև) և նորից տպում։
  • «Քա Գրոհային Ctrl առանց ոչինչի»: փոխում է ակտիվ պատուհանի ընտրությունը (0 և 1 միջև)։
  • «Քա Գրոհային Shift առանց ոչինչի»: ակտիվ պատուհանում ակտիվացնում է 0 ընտրությունը։
  • «Ազատ Shift առանց ոչինչի»: ակտիվ պատուհանում ակտիվացնում է 1 ընտրությունը։

Այս պահից սկսած ես մտադիր եմ հարմարեցնել պահվածքը։ Չկա հետադարձ կապ — չ цікаիր (նաև ինձ բավարարել է)։ Կարծում եմ, որ Habr-ում կլինեն բավարար տոկոս մարդատարներ, որոնք ունեն նման խնդիրներ։

N.B. Քանի որ ընթացիկ տարբերակում кейլոգերը միանում է " /dev/input/ ", xswitcher-ը պետք է կազմակերպվի արմատակով կարգավիճակով։

chown root:root xswitcher
chmod +xs xswitcher

Նկարագրեք ուշադրությունիվ: suid-ի ֆայլի սեփականատերը պետք է լինի root, քանի որ ով սեփականատեր է — այդ իսկ պատճառով suid-ին վերածում է գործարկվելիս։

Պարanoidները (ես բացառություն չեմ) կարող են կրկնօրինակել GIT և հավաքել տեղում։ Լրիվ նման․

go get "github.com/micmonay/keybd_event"
go get "github.com/gvalkov/golang-evdev"

### X11 գլխարկներ OpenSUSE-ում/դեբացվել է
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

Авտոճառում ավելացնել քաղաքականություններիīgu համաչափություն (DE-ի կախված)։

Վավեր է, «կաշին չի խնդրում» (≈30 վայրկյան CPU-ի օրը, ≈12 ՄԲ RSS-ում)

Details

Այժմ — մանրամասները։

Ամբողջ ռեպոզիտարը սկզբում բացառապես վերաբերում էր իմ շունչ գծային նախագծին, իսկ մեկ ուրիշը բացել—լավ է, այսպիսով, ամեն ինչ պետք է գցվի մի տեղ (հնարավորով եւ պարզ ուսումնասիրված զարմանք ։

xswitcher-ն գրված է golang լեզվով, քիչ C ներդրումներով։ Համարվում է, որ այս մոտեցումը տալիս է նվազագույն աշխատանքի բեռ (մինչ այժմ այդպես է)։ Ա պահելով հնարավորությունը բաց թողնելու գումարը cgo-ի միջոցով։

Տեքստում մասնակից են մեկնաբանություններ, որտեղից որտեղ վերաբերվում է և ինչու։ Քանի որ xneur-ի կոդը ինձ «չի ոգեշնչել», որպես ստանդարտ բեցին loloswitcher.

«/dev/input/» օգտագործելը ունի իր առավելությունները (սարքին տեսանելի է, այդ թվում՝ կրկնակի բանալին), ինչպես նաև թերությունները։ Թերությունները հետևյալն են՝

  • Կրկնակի բանալի (չափանիշ «2» կոդով իրադարձություններ) չի համընկնում «x» կրկնության հետ։
  • Չի երևում X11 ինտերֆեյսների միջոցով մուտաբառը (օրինակ՝ VNC-ն աշխատում է այդպես):
  • Պետք է ակնթարթային մուտք։

Մյուս կողմից, կարելի է գրանցվել X իրադարձությունների նկատմամբ՝ օգտագործելով «XSelectExtensionEvent()»։ Շատ բան կարելի է տեսնել xinput կոդում։Go-ի համար նման բան չգտա, իսկ նախնական իրականացումը տվել է 100 տող C-կոդ։ Շատ շուտ առայժմ դադարեցրել եմ։

«Վերադարձային» ելքը դեռևս իրականացված է վիրտուալ բանալիների միջոցով։ Շնորհակալություն keybd_event հեղինակին, սակայն այնտեղ չափազանց բարձր մակարդակի աբստրակցիա կա, որը պետք է վերանորոգվի։ Օրինակ, իմ աջ Win բանալին 3-րդ շարք է ընտրում։ Վերադարձի դեպքում միայն ձախ Win-ն է թարգմանվում։

Հայտնի սխալներ

  • Մենք ոչինչ չգիտենք «կոմպոզիտային» մուտքի մասին (օրինակ. ½)։ Վերջերս դա անհրաժեշտ չէ։
  • Ճշմարիտ Win-ը շփոթված վերարտադրվում է։ Իմ դեպքում աղավաղում է շեշտադրումները։
  • Մուտքի մասին հստակ բացատրություն չկա։ Վրա կան մի քանի գործառույթներ՝ Compare(), CtrlSequence(), RepeatSequence(), SpaceSequence(): Շնորհակալություն nsmcan տեղադրության համար. սրբել եմ կոդում և այստեղ։ Certain probability may occur bugs when replacing.
    Այս վայրում ես չգիտեմ «ինչպես պետք է» և ուրախ կլինեմ ցանկացած առաջարկով։
  • (Օ, սարսափ) ամրցակցային օգտագործում ալիքների (keyboardEvents, miceEvents)։

Ավարտ

Կոդը՝ պարզ процедурական։ Եվ այնքան տխուր է, որքան ես։ Այսպիսով, ինձ հանգստացնում եմ, որ ցանկալի ծնողը գրելու կարող է գրեթե որևէ տեխնիկ։ Եվ այս արտադրանքը շնորհիվ этого չի ջնջվի ու աջակցություն չստանա, նման մեծ մասամբ just-for-fun։

Բարև ձեզ!

Ընտանիք: habr.com

Գնել հուսալի հյուրընկալում DDoS պաշտպանությամբ, VPS VDS սերվերներով 🔥 Գնել հուսալի հյուրընկալում DDoS պաշտպանությամբ, VPS VDS սերվերներով | ProHoster