Punto Switcher-ի նոր անալոգը Linux-ի համար՝ xswitcher
Xneur-ի աջակցության ավարտը ինձ որոշակի տառապանք պատճառեց վերջին վեց ամսվա ընթացքում: (Իմ աշխատասեղանների վրա OpenSUSE 15.1-ի հայտնվելով. xneur-ը միացված է, պատուհանները կորցնում են ուշադրությունը և ժամանակի ընթացքում զվարճալի թարթում են ստեղնաշարի մուտքագրմամբ).
«Օ՜, անիծյալ, ես նորից սկսեցի սխալ դասավորությամբ մուտքագրել» - իմ աշխատանքում դա անպարկեշտ հաճախ է պատահում: Եվ դա ոչ մի դրական բան չի ավելացնում:
Միևնույն ժամանակ, ես (որպես նախագծող ինժեներ) կարող եմ բավականին հստակ ձևակերպել այն, ինչ ուզում եմ։ Բայց ես ուզում էի (նախ Punto Switcher-ից, իսկ հետո Windows Vista-ի շնորհիվ վերջապես անցնեմ Linux-ի, xneur-ից) ճիշտ մի բան. Հասկանալով, որ էկրանի աղբը սխալ դասավորության մեջ է (դա սովորաբար տեղի է ունենում նոր բառ մուտքագրելու վերջում), սեղմեք «Դադար/Դադար»: Եվ ստացեք այն, ինչ տպել եք:
Այս պահին ապրանքն ունի օպտիմալ (իմ տեսանկյունից) ֆունկցիոնալություն/բարդություն հարաբերակցությունը։ Ժամանակն է կիսվել:
TL.DR
Ավելի ուշ կլինեն բոլոր տեսակի տեխնիկական մանրամասները, այնպես որ նախ. հղում «դիպչել» անհամբերների համար.
Ներկայումս հետևյալ վարքագիծը կոշտ կոդավորված է.
«Դադար/Կանգ».
«Ձախ Ctrl առանց որևէ բանի»: փոխում է դասավորությունը ակտիվ պատուհանում (0-ի և 1-ի միջև):
«Ձախ հերթափոխ առանց որևէ բանի». ակտիվ պատուհանում միացնում է թիվ 0 դասավորությունը:
«Right Shift առանց որևէ բանի». ակտիվ պատուհանում միացնում է թիվ 1 դասավորությունը:
Այսուհետ ես նախատեսում եմ հարմարեցնել վարքագիծը: Առանց հետադարձ կապի, դա հետաքրքիր չէ (միևնույն է, ես լավ եմ դրա հետ): Կարծում եմ, որ Habré-ում նման խնդիրներ ունեցող հանդիսատեսի բավարար տոկոսը կլինի:
NB Որովհետեւ ընթացիկ տարբերակում keylogger-ը կցված է «/dev/input/»-ին, xswitcher-ը պետք է գործարկվի արմատային իրավունքներով.
chown root:root xswitcher
chmod +xs xswitcher
Խնդրում ենք նկատի ունենալ: suid-ով ֆայլի սեփականատերը պետք է լինի root, քանի որ ով էլ որ լինի սեփականատերը, գործարկման ժամանակ կվերածվի սուիդ:
Պարանոիդները (ես բացառություն չեմ) կարող են կլոնավորվել GIT- ը և հավաքել տեղում: Դրա նման:
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
Ավելացնել autostart ըստ ճաշակի (կախված DE):
Այն աշխատում է, «չի խնդրում շիլա» (օրական ≈30 վայրկյան պրոցեսոր, ≈12 ՄԲ RSS-ում):
Մանրամասն
Այժմ - մանրամասները:
Ամբողջ պահոցն ի սկզբանե նվիրված էր իմ կենդանիների նախագծին, և ես շատ ծույլ եմ սկսել մեկ ուրիշը: Այսպիսով, ամեն ինչ կուտակված է (միայն թղթապանակներում) և ծածկված է AGPL-ով («հակադարձ արտոնագիր»):
Xswitcher կոդը գրված է գոլանգով, C-ի նվազագույն ընդգրկումներով: Ենթադրվում է, որ այս մոտեցումը կհանգեցնի նվազագույն ջանքերի (առայժմ դա արել է): Միաժամանակ պահպանելով cgo-ի միջոցով միացնելու այն, ինչ բացակայում է:
Տեքստը պարունակում է մեկնաբանություններ, թե որտեղից է այն փոխառվել և ինչու: Որովհետեւ xneur կոդը «ինձ չի ոգեշնչել», ես այն վերցրեցի որպես ելակետ loloswitcher.
«/dev/input/»-ի օգտագործումն ունի և՛ իր առավելությունները (ամեն ինչ տեսանելի է, ներառյալ սեղմված ավտոմատ կրկնվող ստեղնը), և՛ թերությունները: Թերությունները հետևյալն են.
Ավտոմատ կրկնությունը («2» կոդով իրադարձությունները) չի փոխկապակցվում x-ով կրկնելու հետ:
X11 միջերեսների միջոցով մուտքագրումը տեսանելի չէ (օրինակ, VNC-ն այսպես է աշխատում):
Անհրաժեշտ է արմատ:
Մյուս կողմից, հնարավոր է բաժանորդագրվել X իրադարձություններին «XSelectExtensionEvent()»-ի միջոցով։ Դուք կարող եք հայացք նետել xinput կոդը. Ես նման բան չգտա, և կոպիտ իրականացումը անմիջապես վերցրեց հարյուր տող C կոդ: Առայժմ մի կողմ դրեք:
«Հակադարձ» ելքը ներկայումս կատարվում է վիրտուալ ստեղնաշարը պտուտակելու միջոցով: Շնորհակալություն keybd_event-ի հեղինակին, բայց այնտեղ աբստրակցիան չափազանց բարձր մակարդակի է և պետք է վերամշակվի: Օրինակ, ես օգտագործում եմ աջ Win ստեղնը 3-րդ շարքը ընտրելու համար: Եվ միայն ձախ Win-ն է փոխանցվում հետ:
Հայտնի սխալներ
Մենք ոչինչ չգիտենք «կոմպոզիտային» մուտքագրման մասին (օրինակ՝ ½): Դա այս պահին պետք չէ:
Մենք սխալ ենք խաղում ճիշտ Win: Իմ դեպքում դա խախտում է շեշտադրումները։
Չկա հստակ մուտքային վերլուծություն: Փոխարենը կան մի քանի ֆունկցիաներ՝ Compare(), CtrlSequence(), RepeatSequence(), SpaceSequence(): Շնորհակալություն nsmcan ձեր խնամքի համար՝ ուղղել է կոդը և այստեղ: Որոշակի հավանականությամբ փոխարինելիս կարող եք սխալներ բռնել։ Այս պահին ես չգիտեմ «ինչպես» և կողջունեմ ցանկացած առաջարկ:
(Օ Աստված) ալիքների մրցակցային օգտագործում (keyboardEvents, miceEvents):
Ամփոփում
Օրենսգիրքը ամենապարզ ընթացակարգն է: Եվ ինձ նման հիմար: Այնպես որ, ես ինձ շոյում եմ այն հույսով, որ գրեթե ցանկացած տեխնիկ կկարողանա ավարտին հասցնել այն, ինչ ուզում է։ Եվ դրա շնորհիվ այս ապրանքը չի կորչի առանց աջակցության, ինչպես պարզապես զվարճանքի համար: