xneur-ի աջակցման դադարեցումը ինձ որոշակի տառապանքներ պատճառեց վերջին կես տարվա ընթացքում (OpenSUSE 15.1-ի հայտնվելու հետ միասին իմ ডেস্কային համակարգերում. xneur-ն անջատելիս պատուհանները կորցնում են կենտրոնացումը և զվարճալի երկաթուղային կերպով շողում են ստեղնաշարի մուտքի արագությամբ).
«Ա, բլին, կրկին այն սխալ ընտրությունով սկսեցի գրել» — իմ աշխատանքում բնութագրում է անհարմարությունների չափազանց բարձր հաճախությունը։ Եվ շատ դրական չի տրվում:

Միևնույն ժամանակ, ես (ինչպես ինժեներ-կառուցապատող) կարող եմ բավական համարձակ ձևակերպել, թե ինչ եմ ուզում։ Իսկ ես ուզում էի (առաջին հերթին 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ները (ես բացառություն չեմ) կարող են կրկնօրինակել և հավաքել տեղում։ Լրիվ նման․
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-ի կոդը ինձ «չի ոգեշնչել», որպես ստանդարտ բեցին .
«/dev/input/» օգտագործելը ունի իր առավելությունները (սարքին տեսանելի է, այդ թվում՝ կրկնակի բանալին), ինչպես նաև թերությունները։ Թերությունները հետևյալն են՝
- Կրկնակի բանալի (չափանիշ «2» կոդով իրադարձություններ) չի համընկնում «x» կրկնության հետ։
- Չի երևում X11 ինտերֆեյսների միջոցով մուտաբառը (օրինակ՝ VNC-ն աշխատում է այդպես):
- Պետք է ակնթարթային մուտք։
Մյուս կողմից, կարելի է գրանցվել X իրադարձությունների նկատմամբ՝ օգտագործելով «XSelectExtensionEvent()»։ Շատ բան կարելի է տեսնել Go-ի համար նման բան չգտա, իսկ նախնական իրականացումը տվել է 100 տող C-կոդ։ Շատ շուտ առայժմ դադարեցրել եմ։
«Վերադարձային» ելքը դեռևս իրականացված է վիրտուալ բանալիների միջոցով։ Շնորհակալություն keybd_event հեղինակին, սակայն այնտեղ չափազանց բարձր մակարդակի աբստրակցիա կա, որը պետք է վերանորոգվի։ Օրինակ, իմ աջ Win բանալին 3-րդ շարք է ընտրում։ Վերադարձի դեպքում միայն ձախ Win-ն է թարգմանվում։
Հայտնի սխալներ
- Մենք ոչինչ չգիտենք «կոմպոզիտային» մուտքի մասին (օրինակ. ½)։ Վերջերս դա անհրաժեշտ չէ։
- Ճշմարիտ Win-ը շփոթված վերարտադրվում է։ Իմ դեպքում աղավաղում է շեշտադրումները։
- Մուտքի մասին հստակ բացատրություն չկա։ Վրա կան մի քանի գործառույթներ՝ Compare(), CtrlSequence(), RepeatSequence(), SpaceSequence(): Շնորհակալություն տեղադրության համար. սրբել եմ կոդում և այստեղ։ Certain probability may occur bugs when replacing.
Այս վայրում ես չգիտեմ «ինչպես պետք է» և ուրախ կլինեմ ցանկացած առաջարկով։ - (Օ, սարսափ) ամրցակցային օգտագործում ալիքների (keyboardEvents, miceEvents)։
Ավարտ
Կոդը՝ պարզ процедурական։ Եվ այնքան տխուր է, որքան ես։ Այսպիսով, ինձ հանգստացնում եմ, որ ցանկալի ծնողը գրելու կարող է գրեթե որևէ տեխնիկ։ Եվ այս արտադրանքը շնորհիվ этого չի ջնջվի ու աջակցություն չստանա, նման մեծ մասամբ just-for-fun։
Բարև ձեզ!
Ընտանիք: habr.com
