Isilungisi se-Xswitcher se-Linux: inyathelo lesibini

ukususela upapasho lwangaphambili (i-xswitcher kwinqanaba "lobungqina bengcamango") ifumene ingxelo eninzi eyakhayo (enhle), Ndaqhubeka ndichitha ixesha lam lokuphumla ekuphuhliseni iprojekthi. Ngoku ndifuna ukuchitha intwana yakho... Inyathelo lesibini alizukuba lisiqhelo: isindululo/ingxoxo yoyilo loqwalaselo.

Isilungisi se-Xswitcher se-Linux: inyathelo lesibini

Ngandlel’ ithile kuye kwavela ukuba abadwelisi benkqubo abaqhelekileyo bakufumanisa kuyadika ngokumangalisayo ukuseta zonke ezi zilawuli.

Ukuze ndingabi nasiseko, ngaphakathi ngumzekelo wento endijongene nayo.
Iyonke icingelwe kakuhle (kwaye iphunyezwe kakuhle) Apache Kafka & ZooKeeper.
- Uqwalaselo? Kodwa iyadika! I-xml yesimumu (kuba "ingaphandle kwebhokisi").
- Oh, ngaba nawe ufuna i ACL? Kodwa iyadika! Tap-blooper... Into efana naleyo.

Kodwa emsebenzini wam kuchasene ngqo. Kunene (yeha, phantse zange okokuqala) imodeli eyakhiwe ikuvumela ukuba uqhubeke ngakumbi ngokulula kwaye ngokwemvelo (Phantse) hlanganisa umzobo.

Kutshanje ndifumene inqaku malunga noHabré malunga nokusebenza nzima kwezazinzulu zedatha ...
Kuvela ukuba lo mzuzu ufezekiswa ngokupheleleyo kubo. Kwaye ekusebenzeni kwam, njengoko besithi, "inguqulo yokukhanya". Iimodeli ezinomthamo omninzi, abadwelisi benkqubo abanamava kunye ne-OOP belungile, njl. — konke oku kuya kuvela ethubeni xa/ukuba isuka. Kodwa umyili kufuneka aqale kwindawo ethile apha kwaye ngoku.

Yiya kwinqanaba. Ndithathe i-TOML njengesiseko se-syntactic kulo mmi.

Ngokuba yena (TOML) kwelinye icala, iyakwazi ukuhlelwa ngumntu. Kwelinye icala, iguqulelwe 1:1 kuyo nayiphi na i-syntaxes eqhelekileyo: XML, JSON, YAML.
Ngaphezu koko, ukuphunyezwa endikusebenzisileyo kwi-"github.com/BurntSushi/toml", nangona kungeyona imfashini (i-syntax ye-1.4), iyahambelana ngokufanayo ("i-built-in") i-JSON.

Oko kukuthi, ukuba uyanqwenela, unokuthi "hamba ehlathini ngale TOML yakho, ndifuna i-XXX" kwaye "yifake" ikhowudi ngomgca omnye.

Ngoko ke, ukuba ufuna ukubhala ezinye iiwindow ukuqwalasela i-xswitcher (Andiqinisekanga) Akukho zingxaki zilindelweyo "ngolu lungelelwaniso lwakho olukhulu."

Kubo bonke abanye, i-syntax isekwe "kwiqhosha = ixabiso" (kunye neenketho ezimbalwa ezintsonkothileyo, njenge = [ezinye, ezo, uluhlu]) Ndiyaqikelela
Intuitively elula.
Yintoni enika umdla kukuba "itshisiwe" ngexesha elifanayo (malunga ne-2013). Kuphela, ngokungafaniyo nam, umbhali we-TOML ungene kwisikali esifanelekileyo.

Ke ngoko, ngoku kulula kum ukuba ndilungelelanise ukuphunyezwa kwayo ukuze ihambelane nam, kwaye hayi ngokuphambeneyo.

Ngokubanzi, sithatha i-TOML (efana kakhulu ne-Windows INI endala). Kwaye sinoqwalaselo apho sichaza indlela yokuncamathisela uluhlu lweehuku ngokuxhomekeke kwiseti yeekhowudi zokuskena zakutsha kwikhibhodi. Ngezantsi, isiqwenga ngesiqwenga, yinto eyenzekileyo ukuza kuthi ga ngoku. Nengcaciso yokuba kutheni ndigqibe ngolu hlobo.

0. Izithintelo ezisisiseko

  • Skena ukutyunjwa kwekhowudi. Ngokuqinisekileyo kukho into ekufuneka yenziwe malunga noku, kuba iikhowudi zedijithali azinakufundeka ngabantu (ndim ke lo. loloswitcher).
    Ndivuthulule "i-ecodes.go" kwi "golang-evdev" (ndonqena ukujonga umthombo wokuqala, nangona umbhali wayibonisa ngokwenkcubeko). Ndilungise kancinane (okwangoku) into eyoyika kakhulu. Njengo "LEFTBRACE" → "L_BRACE".
  • Ukongeza, wazisa ingcamango "yezitshixo zelizwe". Ekubeni igrama eqhelekileyo esetyenziswayo ayikuvumeli ukuba kudlule iipaseji ezinde. (Kodwa ikuvumela ukuba ujonge ngentloko encinci. Ukuba usebenzisa ushicilelo “ngqo” kuphela.)
  • Kuya kubakho i-"deduplicator" eyakhelwe-ngaphakathi yento ecinezelweyo. Ngaloo ndlela, imeko "phinda" =2 iya kubhalwa один Kanye.

1. Icandelo leetemplates

[Templates] # "@name@" to simplify expressions
 # Words can consist of these chars (regex)
 "WORD" = "([0-9A-Z`;']|[LR]_BRACE|COMMA|DOT|SLASH|KP[0-9])"

Igama lolwimi lomntu elinophawu lwefonetiki liquka ntoni? (nokuba ngumcimbi wegraphem aka "hieroglyphs")? Uhlobo oluthile "lwephepha" elibi. Ngoko ke, ngokukhawuleza ndazisa ingcamango ye "template".

2. Kufuneka wenze ntoni xa kukho into ecofayo (enye ikhowudi yokuskena ifikile)

[ActionKeys]
 # Collect key and do the test for command sequence
 # !!! Repeat codes (code=2) must be collected once per key!
 Add = ["1..0", "=", "BS", "Q..]", "L_CTRL..CAPS", "N_LOCK", "S_LOCK",
        "KP7..KPDOT", "R_CTRL", "KPSLASH", "R_ALT", "KPEQUAL..PAUSE",
        "KPCOMMA", "L_META..COMPOSE", "KPLEFTPAREN", "KPRIGHTPAREN"]

 # Drop all collected keys, including this.  This is default action.
 Drop = ["ESC", "-", "TAB", "ENTER", "KPENTER", "LINEFEED..POWER"]
 # Store extra map for these keys, when any is in "down" state.
 # State is checked via "OFF:"|"ON:" conditions in action.
 # (Also, state of these keys must persist between buffer drops.)
 # ??? How to deal with CAPS and "LOCK"-keys ???
 StateKeys = ["L_CTRL", "L_SHIFT", "L_ALT", "L_META", "CAPS", "N_LOCK", "S_LOCK",
              "R_CTRL", "R_SHIFT", "R_ALT", "R_META"]

 # Test only, but don't collect.
 # E.g., I use F12 instead of BREAK on dumb laptops whith shitty keyboards (new ThinkPads)
 Test = ["F1..F10", "ZENKAKUHANKAKU", "102ND", "F11", "F12",
          "RO..KPJPCOMMA", "SYSRQ", "SCALE", "HANGEUL..YEN",
          "STOP..SCROLLDOWN", "NEW..MAX"]

Kukho iikhowudi ezingama-768 zizonke. (Kodwa "ukuba kunokwenzeka" ndifake ukubamba "izinto ezimangalisayo" kwikhowudi ye-xswitcher).
Ngaphakathi ndichaze ukugcwalisa uluhlu kunye namakhonkco kwimisebenzi "ukwenza ntoni". Kwi golang oku (ngequbuliso) Kwaba lula kwaye kwacaca.

  • Ndiceba ukunciphisa "Ukuwisa" ubuncinci kule ndawo. Ngokuthanda inkqubo ebhetyebhetye ngakumbi (ndiya kuyibonisa ngezantsi).

3. Itheyibhile eneeklasi zefestile

# Some behaviour can depend on application currently doing the input.
[[WindowClasses]]
 # VNC, VirtualBox, qemu etc. emulates there input independently, so never intercept.
 # With the exception of some stupid VNC clients, which does high-level (layout-based) keyboard input.
 Regex = "^VirtualBox"
 Actions = "" # Do nothing while focus stays in VirtualBox

[[WindowClasses]]
 Regex = "^konsole"
 # In general, mouse clicks leads to unpredictable (at the low-level where xswitcher resides) cursor jumps.
 # So, it's good choise to drop all buffers after click.
 # But some windows, e.g. terminals, can stay out of this problem.
 MouseClickDrops = 0
 Actions = "Actions"

[[WindowClasses]] # Default behaviour: no Regex (or wildcard like ".")
 MouseClickDrops = 1
 Actions = "Actions"

Imigca yetheyibhile ibe kwizibiyeli eziphindwe kabini ezinegama layo. Akuzange kube lula kanye kanye kwi-bat. Ngokuxhomekeke kwifestile esebenzayo ngoku, ungakhetha ezi ndlela zilandelayo:

  • Eyakho isethi "yezitshixo ezishushu" "Izenzo = ...". Ukuba ayikho/ayinanto, ungenzi nto.
  • Tshintshela "I-MouseClickDrops" - into omawuyenze xa ucofa iqhosha le mouse. Ukusukela kwindawo apho i-xswitcher ilayitiwe akukho zinkcukacha malunga "nendawo bacofa kuyo," siseta ngokutsha isithinteli ngokungagqibekanga. Kodwa kwiitheminali (umzekelo) akufuneki wenze oku (ngesiqhelo).

4. Ulandelelwano olunye (okanye oluninzi) lokucofa lubangela enye okanye enye ikhonkco

# action = [ regex1, regex2, ... ]
# "CLEAN" state: all keys are released
[Actions]
# Inverse regex is hard to understand, so extract negation to external condition.
# Expresions will be checked in direct order, one-by-one. Condition succceds when ALL results are True.
 # Maximum key sequence length, extra keys will be dropped. More length - more CPU.
 SeqLength = 8
 # Drop word buffer and start collecting new one
 NewWord = [ "OFF:(CTRL|ALT|META)  SEQ:(((BACK)?SPACE|[LR]_SHIFT):[01],)*(@WORD@:1)", # "@WORD@:0" then collects the char
             "SEQ:(@WORD@:2,@WORD@:0)", # Drop repeated char at all: unlikely it needs correction
             "SEQ:((KP)?MINUS|(KP)?ENTER|ESC|TAB)" ] # Be more flexible: chars line "-" can start new word, but must not completelly invalidate buffer!
 # Drop all buffers
 NewSentence = [ "SEQ:(ENTER:0)" ]

 # Single char must be deleted by single BS, so there is need in compose sequence detector.
 Compose = [ "OFF:(CTRL|L_ALT|META|SHIFT)  SEQ:(R_ALT:1,(R_ALT:2,)?(,@WORD@:1,@WORD@:0){2},R_ALT:0)" ]

 "Action.RetypeWord" = [ "OFF:(CTRL|ALT|META|SHIFT)  SEQ:(PAUSE:0)" ]
 "Action.CyclicSwitch" = [ "OFF:(R_CTRL|ALT|META|SHIFT)  SEQ:(L_CTRL:1,L_CTRL:0)" ] # Single short LEFT CONTROL
 "Action.Respawn" = [ "OFF:(CTRL|ALT|META|SHIFT)  SEQ:(S_LOCK:2,S_LOCK:0)" ] # Long-pressed SCROLL LOCK

 "Action.Layout0" = [ "OFF:(CTRL|ALT|META|R_SHIFT)  SEQ:(L_SHIFT:1,L_SHIFT:0)" ] # Single short LEFT SHIFT
 "Action.Layout1" = [ "OFF:(CTRL|ALT|META|L_SHIFT)  SEQ:(R_SHIFT:1,R_SHIFT:0)" ] # Single short RIGHT SHIFT

 "Action.Hook1" = [ "OFF:(CTRL|R_ALT|META|SHIFT)  SEQ:(L_ALT:1,L_ALT:0)" ]

Amagwegwe ahlulwe abe ziindidi ezimbini. Eyakhelwe ngaphakathi, ngamagama "athethayo" (iNewWord, NewSentence, Compose) kunye neprogrammable.

Amagama acwangcisiweyo aqala ngokuthi "Isenzo." Ngokuba I-TOML v1.4, amagama anamachaphaza kufuneka afakwe kwiikowuti.

Icandelo ngalinye kufuneka lichazwe ngezantsi enegama elifanayo.

Ukuze ungavutheli iingqondo zabantu "ze" rhoqo (ukusuka kumava, abo ukubhalamhlawumbi ube mnye kwabalishumi iingcali), ngoko nangoko ndiphumeza isivakalisi esongezelelweyo.

  • "VALIWE:" (okanye "Vula:") phambi kwe regexp (intetho eqhelekileyo) ifuna ukuba la maqhosha alandelayo akhululwe (okanye acinezelwe).
    Okulandelayo ndiza kwenza intetho "engafanelekanga" rhoqo. Ngokujonga ngokuhlukileyo iziqwenga phakathi kwemibhobho "|". Ukuze kuncitshiswe inani leerekhodi ezifana ne "[LR]_SHIFT" (apho oku akuyomfuneko ngokucacileyo).
  • "SEQ:" Ukuba imeko yangaphambili ifezekisiwe (okanye ayikho), ngoko sijonga ngokuchasene nentetho "eqhelekileyo" eqhelekileyo. Ngeenkcukacha, ngokukhawuleza ndithumela ku-^W ithala leencwadi elithi “regexp”. Ngenxa yokuba andizange ndikhathazeke ukufumana iqondo lokuhambelana ne-pcre endiyithandayo ("i-perl iyahambelana").
  • Intetho ibhalwe ngohlobo "BUTTON_1: CODE1, BUTTON_2: CODE2" njl., ngokolandelelwano apho iikhowudi zokuskena zifunyenwe.
  • Itshekhi ihlala "ihlutshiwe" ekupheleni kokulandelelana, ngoko akukho mfuneko yokongeza "$" kumsila.
  • Zonke iitshekhi kumgca omnye zenziwa enye emva kwenye kwaye zidityaniswe ngu "Mna". Kodwa ekubeni ixabiso lichazwa njengoluhlu, ungabhala enye isheke emva kwesiphumlisi. Ukuba oku kuyimfuneko ngenxa yesizathu esithile.
  • Nentsingiselo "SeqLength = 8" inciphisa ubungakanani besikhuseli apho zonke iitshekishwa zenziwe. Ngokuba Andizange (kude kube ngoku) andizange ndidibane nezixhobo ezingapheliyo ebomini bam.

5. Ukumisela iigwegwe ezichazwe kwicandelo langaphambili

# Action is the array, so actions could be chained (m.b., infinitely... Have I to check this?).
# For each action type, extra named parameters could be collected. Invalid parameters will be ignored(?).
[Action.RetypeWord] # Switch layout, drop last word and type it again
 Action = [ "Action.CyclicSwitch", "RetypeWord" ] # Call Switch() between layouts tuned below, then RetypeWord()

[Action.CyclicSwitch] # Cyclic layout switching
 Action = [ "Switch" ] # Internal layout switcher func
 Layouts = [0, 1]

[Action.Layout0] # Direct layout selection
 Action = [ "Layout" ] # Internal layout selection func
 Layout = 0

[Action.Layout1] # Direct layout selection
 Action = [ "Layout" ] # Internal layout selection func
 Layout = 1

[Action.Respawn] # Completely respawn xswitcher. Reload config as well
 Action = [ "Respawn" ]

[Action.Hook1] # Run external commands
  Action = [ "Exec" ]
  Exec = "/path/to/exec -a -b --key_x"
  Wait = 1
  SendBuffer = "Word" # External hook can process collected buffer by it's own means.

Eyona nto iphambili apha "Isenzo = [Uluhlu]". Ngokufana necandelo langaphambili, kukho isethi eqingqiweyo yezenzo ezakhelwe ngaphakathi. Kwaye ukuba nokwenzeka kwe-docking akukhawulelwanga ngokomgaqo (bhala "Action.XXX" kwaye ungonqeni ukuyibhalela elinye icandelo).
Ngokukodwa, ukuchwetheza kwakhona kwegama kuyilo olulungisiweyo lwahlulwe lwaba ngamacandelo amabini: "tshintsha uyilo njengoko kuchaziwe apho" и “chwetheza kwakhona” (“RetypeWord”).

Iiparamitha ezishiyekileyo zibhalelwa “kwisichazi-magama” ("imephu" ngesiGolang) ngesenzo esinikiweyo, uluhlu lwabo luxhomekeke kwinto ebhaliweyo "Isenzo".

Iintshukumo ezininzi ezahlukeneyo zinokuchazwa kwimfumba enye (amacandelo). Okanye ungayitsala. Njengoko ndibonise ngasentla.

Ndiseta kwangoko inyathelo elithi "Exec" ukwenza iskripthi sangaphandle. Ngokhetho lokutyhala isithinteli esirekhodiweyo kwi-stdin.

  • “Yima = 1” — linda inkqubo yokuqhuba igqitywe.
  • Mhlawumbi, "kwimfumba" uya kufuna ukubeka abantu abongezelelweyo kwindawo. Ulwazi olunjengegama lodidi lwefestile apho ifunyenwe khona.
    “Ngaba uyafuna ukudibanisa umphathi wakho? Kulapho kufuneka uye khona."

Phew ( exhaled). Ingathi andilibalanga nto.

Yhu! Ewe, andizange ndilibale...
Luphi ulungiselelo lophehlelelo? Kwikhowudi enzima? Kanjalo:

[ScanDevices]
 # Must exist on start. Self-respawn in case it is younger then 30s
 Test = "/dev/input/event0"
 Respawn = 30
 # Search mask
 Search = "/dev/input/event*"
 # In my thinkPads there are such a pseudo-keyboards whith tons of unnecessary events
 Bypass = "(?i)Video|Camera" # "(?i)" obviously differs from "classic" pcre's.

Ndilibale phi/ndenze impazamo? (akukho ndlela ngaphandle koku), ndiyathemba ngokwenene ukuba abafundi abanomdla abayi kuba ngamavila kakhulu ukukhupha iimpumlo zabo.

nethamsanqa!

umthombo: www.habr.com

Yongeza izimvo