Xswitcher dhizaini yekugadziridza yeLinux: nhanho yechipiri

kubva kudhindwa kwekare (xswitcher pachikamu che "chiratidzo chepfungwa") yakagamuchira mhinduro zhinji inovaka (izvo zvakanaka), ndakaramba ndichipedza nguva yangu yekusununguka ndichigadzira purojekiti. Ikozvino ndoda kushandisa zvishoma zvako ... Nhanho yechipiri haizove yakajairwa: chirevo / nhaurirano yekumisikidza dhizaini.

Xswitcher dhizaini yekugadziridza yeLinux: nhanho yechipiri

Neimwe nzira zvinozoitika kuti zvakajairwa programmers vanozviona zvichifinha zvisingaite kumisa zvese izvi zvinodzora.

Kuti ndisave asina hwaro, mukati mune muenzaniso wezvandiri kubata nazvo.
Pakazara zvakagadzirirwa zvakanaka (uye zvakashandiswa zvakanaka) Apache Kafka & ZooKeeper.
- Configuration? Asi zvinofinha! Dumb xml (nekuti "kunze kwebhokisi").
- Ah, iwe unoda zvakare ACL? Asi zvinofinha! Tap-blooper... Chinhu chakadaro.

Asi mubasa rangu zvinonyatsopesana. Rudyi (Maiwe, kanenge kasika kekutanga) iyo yakagadzirwa modhi inokubvumira kuti uenderere mberi zviri nyore uye zvakasununguka (Zvinenge) unganidza dhayagiramu.

Ini nguva pfupi yadarika ndakawana chinyorwa paHabré nezve kushanda nesimba kwemasaenzi edata ...
Zvinoitika kuti nguva ino inozadzikiswa zvizere kwavari. Uye mukuita kwangu, sezvavanotaura, "light version". Multi-vhoriyamu modhi, vane ruzivo vagadziri vane OOP payakagadzirira, nezvimwe. - izvi zvese zvinozoonekwa gare gare kana / kana zvikasimuka. Asi mugadziri anofanirwa kutanga pane imwe nzvimbo pano uye ikozvino.

Svika papfungwa. Ndakatora TOML seyakavakirwa kubva kumugari uyu.

Nokuti iye (TOML) kune rumwe rutivi, inogona kugadziriswa nemunhu. Nekune rimwe divi, inoturikirwa 1:1 mune chero yakajairika syntaxes: XML, JSON, YAML.
Uyezve, kushandiswa kwandakashandisa kubva ku "github.com/BurntSushi/toml", kunyange isiri iyo yakanyanya fashoni (ichiri 1.4 syntax), inopindirana neyakafanana ("yakavakwa-mukati") JSON.

Ndokunge, kana uchida, unogona kungoti "enda nemusango neTOML yako iyoyo, ndinoda XXX" uye "chigamba" kodhi nemutsara mumwe chete.

Saka, kana iwe uchida kunyora mamwe windows kugadzirisa xswitcher (Handina chokwadi) Hapana matambudziko anotarisirwa "neyi dhizaini gadziriso yako."

Kune vamwe vese, iyo syntax yakavakirwa pa "kiyi = kukosha" (uye chaizvo dzimwe sarudzo dzakaoma kunzwisisa, se = [zvimwe, izvo, zvakarongwa]) Ndofungidzira
intuitively yakanakira.
Chinofadza ndechekuti "kupisa" panguva imwe chete (kutenderera 2013). Chete, kusiyana neni, munyori weTOML akapinda pamwero wakakodzera.

Naizvozvo, zvino zviri nyore kwandiri kuti ndigadzirise kuita kwayo kuti ienderane neni, uye kwete zvinopesana.

Kazhinji, tinotora TOML (yakafanana neiyo yekare Windows INI). Uye isu tine gadziriso umo isu tinotsanangura maitiro ekubatanidza nhevedzano yehukwe zvichienderana neseti yeazvino scan code kubva kukhibhodi. Pazasi, chidimbu nechidimbu, ndizvo zvakaitika kusvika zvino. Uye tsananguro yekuti sei ndakasarudza nenzira iyi.

0. Basic abstractions

  • Scan kodhi mazita. Chimwe chinhu chinoda kuitwa pamusoro peizvi, sezvo kungoti makodhi edhijitari haagone kuverengwa nevanhu (ndini chete loloswitcher).
    Ndakazunza "ecodes.go" kubva ku "golang-evdev" (Ndaive neusimbe hwekutarisa kwainobva, kunyangwe munyori airatidza zvetsika). Ndakagadzirisa zvishoma (parizvino) chimwe chinhu chaityisa. Sekuti “LEFTBRACE” → “L_BRACE”.
  • Uyezve, akaunza pfungwa ye "state keys". Sezvo girama yenguva dzose yakashandiswa haibvumiri ndima refu. (Asi zvinokutendera kuti utarise nepamusoro-soro. Kana ukashandisa “zvakananga” kurekodha chete.)
  • Pachave ne "deduplicator" yakavakirwa-mukati yezvinodzvanywa. Saka, iyo nyika "kudzokorora" = 2 ichanyorwa один nguva.

1. Matemplate chikamu

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

Izwi remutauro wevanhu rine phonetic notation rinosanganisirei? (ingave nyaya yemagraphem aka "hieroglyphs")? Imwe mhando ye "shiti" inotyisa. Naizvozvo, ini ndinokurumidza kusuma pfungwa ye "template".

2. Zvekuita kana chimwe chinhu chadzvanywa (imwe scan code yasvika)

[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"]

Kune 768 makodhi pamwe chete. (Asi "kana zvikaitika" ndakaisa kubata "zvinoshamisa" mune xswitcher kodhi).
Mukati ndakatsanangura kuzadza hurongwa nezvinongedzo kumabasa "zvekuita". Mu golang izvi (kamwe kamwe) Zvakava nyore uye zvakajeka.

  • Ndinoronga kuderedza "Drop" kusvika zvishoma munzvimbo ino. Mukuda kwekuwedzera kuchinjika kugadzirisa (ini ndicharatidza pazasi).

3. Tafura nemakirasi ehwindo

# 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"

Mitsara yetafura iri mumabhuraketi akapetwa kaviri ane zita rayo. Zvaisave nyore kubva pachiremwaremwa. Zvichienderana nehwindo rinoshanda, unogona kusarudza zvinotevera:

  • Yako wega seti ye "hot keys" "Actions = ...". Kana zvisina/isina, ita chinhu.
  • Chinja "MouseClickDrops" - zvekuita kana kudzvanya mbeva kwaonekwa. Sezvo panguva iyo xswitcher yakabatidzwa hapana ruzivo nezve "pavanodzvanya," isu tinogadzirisa buffer nekukasira. Asi mumateminari (semuenzaniso) haufanirwe kuita izvi (kazhinji).

4. Imwe (kana yakawanda) kutevedzana kwekudzvanya kunokonzeresa imwe kana imwe hoko

# 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)" ]

Hoko dzakakamurwa kuva mhando mbiri. Yakavakwa-mukati, ine "anotaura" mazita (NewWord, NewSentence, Compose) uye inorongwa.

Mazita anorongwa anotanga na “Chiito.” Nokuti TOML v1.4, mazita ane madotsi anofanira kunge ari mukotesheni.

Chikamu chimwe nechimwe chinofanira kutsanangurwa pasi apa nezita rimwechete.

Kuti urege kuputika pfungwa dzevanhu ne "kushama" nguva dzose (kubva pane zvakaitika, avo nyorapamwe mumwechete pagumi nyanzvi), ndinobva ndashandisa imwe syntax.

  • "ZVA:" (kana "ON:") pamberi pe regexp (nguva dzose kutaura) inoda kuti mabhatani anotevera aburitswe (kana kudzvanywa).
    Tevere ini ndichaita "zvisina kunaka" kutaura nguva dzose. Nekutarisa kwakasiyana kwezvidimbu pakati pepombi "|". Kuti uderedze huwandu hwemarekodhi senge "[LR]_SHIFT" (apo izvi zviri pachena kuti hazvidiwi).
  • "SEQ:" Kana iyo yapfuura mamiriro akasangana (kana asipo), saka isu tinotarisa tichipesana ne "zvakajairika" kutaura nguva dzose. Kuti uwane ruzivo, ndinobva ndatumira ku^W iyo "regexp" raibhurari. Nekuti ini handisati ndanetseka kuwana dhigirii rekuenderana neyangu yandinoda pcre ("perl inowirirana").
  • Chirevo chakanyorwa muchimiro "BUTTON_1: CODE1, BUTTON_2: CODE2" nezvimwewo, mukurongeka uko macode e scan anogamuchirwa.
  • Cheki inogara ichi "snugged" kusvika kumagumo ekutevedzana, saka hapana chikonzero chekuwedzera "$" kumuswe.
  • Cheki dzese mumutsara mumwe dzinoitwa imwe mushure meimwe uye anosanganiswa ne "Ini". Asi sezvo kukosha kwacho kuchitsanangurwa sehurongwa, unogona kunyora imwe cheki mushure mecomma. Kana izvi zvichidikanwa nokuda kwechimwe chikonzero.
  • ukoshi "SeqLength = 8" inoganhura saizi yebhafa panoitwa macheki ese. Nokuti Ini (kusvika ikozvino) handina kumbosangana nekusingaperi zviwanikwa muhupenyu hwangu.

5. Kuisa zvikorekedzo zvinotsanangurwa muchikamu chekare

# 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.

Chinhu chikuru apa ndechekuti "Action = [Array]". Zvakafanana nechikamu chekare, pane zvishoma zvakagadzirirwa zviito zvakavakwa. Uye mukana wekuita docking hauna kuganhurirwa mumusimboti (nyora "Action.XXX" uye usanyanyoita nungo yekunyora chimwe chikamu pazviri).
Kunyanya, kudhirowa kwezwi mune yakagadziriswa marongero yakakamurwa kuita zvikamu zviviri: "chinja marongerwo sezvakatsanangurwa ipapo" и “retype” (“RetypeWord”).

Maparamita asara anonyorerwa ku "dictionary" ("mepu" mugolang) nokuda kwechiito chakapiwa, runyoro rwavo runobva pane zvakanyorwa mu "Chiito".

Zviitiko zvakawanda zvakasiyana zvinogona kutsanangurwa mumurwi mumwe (zvikamu). Kana kuti iwe unogona kuchibvisa. Sezvandaratidza pamusoro.

Ini ndakabva ndaseta iyo "Exec" chiito chekuita iyo yekunze script. Nesarudzo yekusundira yakarekodhwa buffer mu stdin.

  • "Mira = 1" - mirira kuti maitiro ekumhanya apedze.
  • Pamwe, "kumwe murwi" iwe uchada kuisa vamwe vanhu munzvimbo. ruzivo rwakadai sezita rekirasi yehwindo kwayakatambirwa.
    “Unoda kubatanidza mubatsiri wako here? Apa ndipo paunofanira kuenda."

Phew (exhaled). Zvinoita sekuti hapana chandanga ndakanganwa.

Maiwe! Ehe, handina kukanganwa...
Ndekupi gadziriso yekumisikidza? Mune hard code? Saizvozvo:

[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.

Ndakakanganwa/ndakakanganisa papi? (hapana nzira pasina izvi), ndinovimba chaizvo kuti vaverengi vanonyatsoteerera havazonyanyova nehusimbe hwekukwenya mhino dzavo.

Good luck!

Source: www.habr.com

Voeg