Linux рдХреЗ рд▓рд┐рдП Xswitcher рд▓реЗрдЖрдЙрдЯ рд╕реБрдзрд╛рд░рдХ: рдЪрд░рдг рджреЛ

рдЬреИрд╕рд╛ рдкрд┐рдЫрд▓рд╛ рдкреНрд░рдХрд╛рд╢рди ("рдЕрд╡рдзрд╛рд░рдгрд╛ рдХрд╛ рдкреНрд░рдорд╛рдг" рдЪрд░рдг рдореЗрдВ xswitcher) рдХреЛ рдХрд╛рдлреА рд░рдЪрдирд╛рддреНрдордХ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдорд┐рд▓реА (рдЬреЛ рдЕрдЪреНрдЫрд╛ рд╣реИ), рдореИрдВрдиреЗ рдЕрдкрдирд╛ рдЦрд╛рд▓реА рд╕рдордп рдкреНрд░реЛрдЬреЗрдХреНрдЯ рд╡рд┐рдХрд╕рд┐рдд рдХрд░рдиреЗ рдореЗрдВ рд╡реНрдпрддреАрдд рдХрд░рдирд╛ рдЬрд╛рд░реА рд░рдЦрд╛ред рдЕрдм рдореИрдВ рдЖрдкрдХрд╛ рдХреБрдЫ рд╣рд┐рд╕реНрд╕рд╛ рдЦрд░реНрдЪ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ... рджреВрд╕рд░рд╛ рдЪрд░рдг рдмрд┐рд▓реНрдХреБрд▓ рд╕рд╛рдорд╛рдиреНрдп рдирд╣реАрдВ рд╣реЛрдЧрд╛: рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдбрд┐рдЬрд╝рд╛рдЗрди рдХрд╛ рдкреНрд░рд╕реНрддрд╛рд╡/рдЪрд░реНрдЪрд╛ред

Linux рдХреЗ рд▓рд┐рдП Xswitcher рд▓реЗрдЖрдЙрдЯ рд╕реБрдзрд╛рд░рдХ: рдЪрд░рдг рджреЛ

рдХрд┐рд╕реА рддрд░рд╣ рдпрд╣ рдкрддрд╛ рдЪрд▓рддрд╛ рд╣реИ рдХрд┐ рд╕рд╛рдорд╛рдиреНрдп рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рдХреЛ рдЗрди рд╕рднреА рдирд┐рдпрдВрддреНрд░рдгреЛрдВ рдХреЛ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдирд╛ рдЕрд╡рд┐рд╢реНрд╡рд╕рдиреАрдп рд░реВрдк рд╕реЗ рдЙрдмрд╛рдК рд▓рдЧрддрд╛ рд╣реИред

рдирд┐рд░рд╛рдзрд╛рд░ рди рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП, рдЕрдВрджрд░ рдПрдХ рдЙрджрд╛рд╣рд░рдг рд╣реИ рдХрд┐ рдореИрдВ рдХрд┐рд╕рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░ рд░рд╣рд╛ рд╣реВрдВред
рдХреБрд▓ рдорд┐рд▓рд╛рдХрд░ рдЙрддреНрдХреГрд╖реНрдЯ рд░реВрдк рд╕реЗ рдЕрдкрд╛рдЪреЗ рдХрд╛рдлреНрдХрд╛ рдФрд░ рдЬрд╝реВрдХреАрдкрд░ рдХреА рдХрд▓реНрдкрдирд╛ (рдФрд░ рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд) рдХреА рдЧрдИред
- рд╡рд┐рдиреНрдпрд╛рд╕? рд▓реЗрдХрд┐рди рдпрд╣ рдЙрдмрд╛рдК рд╣реИ! рдЧреВрдВрдЧрд╛ рдПрдХреНрд╕рдПрдордПрд▓ (рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ "рдмреЙрдХреНрд╕ рд╕реЗ рдмрд╛рд╣рд░" рд╣реИ)ред
- рдУрд╣, рдХреНрдпрд╛ рдЖрдк рднреА рдПрд╕реАрдПрд▓ рдЪрд╛рд╣рддреЗ рд╣реИрдВ? рд▓реЗрдХрд┐рди рдпрд╣ рдмрд╣реБрдд рдЙрдмрд╛рдК рд╣реИ! рдЯреИрдк-рдмреНрд▓реВрдкрд░... рдХреБрдЫ рдЗрд╕ рддрд░рд╣ред

рд▓реЗрдХрд┐рди рдореЗрд░реЗ рдХрд╛рдо рдореЗрдВ рдпрд╣ рдмрд┐рд▓реНрдХреБрд▓ рд╡рд┐рдкрд░реАрдд рд╣реИред рд╕рд╣реА (рдЕрдлрд╕реЛрд╕, рд▓рдЧрднрдЧ рдкрд╣рд▓реА рдмрд╛рд░ рдирд╣реАрдВ) рдирд┐рд░реНрдорд┐рдд рдореЙрдбрд▓ рдЖрдкрдХреЛ рдЖрд╕рд╛рдиреА рд╕реЗ рдФрд░ рд╕реНрд╡рд╛рднрд╛рд╡рд┐рдХ рд░реВрдк рд╕реЗ рдЖрдЧреЗ рдмрдврд╝рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ (рд▓рдЧрднрдЧ) рдПрдХ рдЖрд░реЗрдЦ рдЗрдХрдЯреНрдард╛ рдХрд░реЗрдВ.

рдореИрдВрдиреЗ рд╣рд╛рд▓ рд╣реА рдореЗрдВ рдбреЗрдЯрд╛ рд╡реИрдЬреНрдЮрд╛рдирд┐рдХреЛрдВ рдХреА рдХрдбрд╝реА рдореЗрд╣рдирдд рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╣реИрдмреНрд░реЗ рдкрд░ рдПрдХ рд▓реЗрдЦ рджреЗрдЦрд╛...
рдпрд╣ рдкрддрд╛ рдЪрд▓рд╛ рд╣реИ рдХрд┐ рдпрд╣ рдХреНрд╖рдг рдЙрдирдХреЗ рд▓рд┐рдП рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╕рд╛рдХрд╛рд░ рд╣реИред рдФрд░ рдореЗрд░реЗ рдЕрднреНрдпрд╛рд╕ рдореЗрдВ, рдЬреИрд╕рд╛ рдХрд┐ рд╡реЗ рдХрд╣рддреЗ рд╣реИрдВ, "рд╣рд▓реНрдХрд╛ рд╕рдВрд╕реНрдХрд░рдг"ред рдорд▓реНрдЯреА-рд╡реЙрд▓реНрдпреВрдо рдореЙрдбрд▓, рдУрдУрдкреА рдХреЗ рд╕рд╛рде рдЕрдиреБрднрд╡реА рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рдЖрджрд┐ред - рдпрд╣ рд╕рдм рдмрд╛рдж рдореЗрдВ рджрд┐рдЦрд╛рдИ рджреЗрдЧрд╛ рдЬрдм/рдпрджрд┐ рдпрд╣ рд╢реБрд░реВ рд╣реЛрдЧрд╛ред рд▓реЗрдХрд┐рди рдбрд┐рдЬрд╛рдЗрдирд░ рдХреЛ рдпрд╣реАрдВ рдФрд░ рдЕрднреА рд╕реЗ рд╢реБрд░реБрдЖрдд рдХрд░рдиреЗ рдХреА рдЬрд░реВрд░рдд рд╣реИред

рдЕрд╕рд▓ рдмрд╛рдд рдкрд░ рдЖрдУред рдореИрдВрдиреЗ TOML рдХреЛ рд╡рд╛рдХреНрдпрд╛рддреНрдордХ рдЖрдзрд╛рд░ рдХреЗ рд░реВрдк рдореЗрдВ рд▓рд┐рдпрд╛ рдЗрд╕ рдирд╛рдЧрд░рд┐рдХ рд╕реЗ.

рдХреНрдпреЛрдВрдХрд┐ рд╡рд╣ (рдЯреАрдУрдПрдордПрд▓) рдПрдХ рдУрд░, рдорд╛рдирд╡-рд╕рдВрдкрд╛рджрди рдпреЛрдЧреНрдпред рджреВрд╕рд░реА рдУрд░, рдЗрд╕реЗ рдХрд┐рд╕реА рднреА рдЕрдзрд┐рдХ рд╕рд╛рдорд╛рдиреНрдп рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рдореЗрдВ 1:1 рдЕрдиреБрд╡рд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ: XML, JSON, YAMLред
рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЬреЛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдореИрдВрдиреЗ "github.com/BurntSshi/toml" рд╕реЗ рдХрд┐рдпрд╛ рдерд╛, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдпрд╣ рд╕рдмрд╕реЗ рдлреИрд╢рдиреЗрдмрд▓ (рдЕрднреА рднреА 1.4 рд╕рд┐рдВрдЯреИрдХреНрд╕) рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рд╡рд╛рдХреНрдпрд╛рддреНрдордХ рд░реВрдк рд╕реЗ рдЙрд╕реА ("рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд") JSON рдХреЗ рд╕рд╛рде рд╕рдВрдЧрдд рд╣реИред

рдпрд╛рдиреА, рдпрджрд┐ рдЖрдк рдЪрд╛рд╣реЗрдВ, рддреЛ рдЖрдк рдмрд╕ рдЗрддрдирд╛ рдХрд╣ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ "рдЕрдкрдиреЗ рдЙрд╕ TOML рдХреЗ рд╕рд╛рде рдЬрдВрдЧрд▓ рд╕реЗ рдЧреБрдЬрд░реЗрдВ, рдореБрдЭреЗ XXX рдЪрд╛рд╣рд┐рдП" рдФрд░ рдХреЗрд╡рд▓ рдПрдХ рдкрдВрдХреНрддрд┐ рдХреЗ рд╕рд╛рде рдХреЛрдб рдХреЛ "рдкреИрдЪ" рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рдЗрд╕ рдкреНрд░рдХрд╛рд░, рдпрджрд┐ рдЖрдк xswitcher рдХреЛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рд╡рд┐рдВрдбреЛрдЬрд╝ рд▓рд┐рдЦрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ (рдореБрдЭреЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ) "рдЖрдкрдХреЗ рдЗрд╕ рдЦрд╝рд░рд╛рдм рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдХреЗ рд╕рд╛рде" рдХреЛрдИ рд╕рдорд╕реНрдпрд╛ рдЕрдкреЗрдХреНрд╖рд┐рдд рдирд╣реАрдВ рд╣реИред

рдЕрдиреНрдп рд╕рднреА рдХреЗ рд▓рд┐рдП, рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ "рдХреБрдВрдЬреА = рдорд╛рди" рдкрд░ рдЖрдзрд╛рд░рд┐рдд рд╣реИ (рдФрд░ рд╡рд╕реНрддреБрддрдГ рдХреБрдЫ рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рд╡рд┐рдХрд▓реНрдк, рдЬреИрд╕реЗ = [рдХреБрдЫ, рд╡рд╣, рд╕рд░рдгреА]) рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ
рд╕рд╣рдЬ рд░реВрдк рд╕реЗ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ.
рджрд┐рд▓рдЪрд╕реНрдк рдмрд╛рдд рдпрд╣ рд╣реИ рдХрд┐ "рдЬрд▓рд╛ рд╣реБрдЖ" рд▓рдЧрднрдЧ рдЙрд╕реА рд╕рдордп (2013 рдХреЗ рдЖрд╕рдкрд╛рд╕)ред рдХреЗрд╡рд▓, рдореЗрд░реЗ рд╡рд┐рдкрд░реАрдд, рдЯреАрдУрдПрдордПрд▓ рдХреЗ рд▓реЗрдЦрдХ рдиреЗ рдЙрдЪрд┐рдд рдкреИрдорд╛рдиреЗ рдкрд░ рдХрд╛рдо рдХрд┐рдпрд╛ред

рдЗрд╕рд▓рд┐рдП, рдЕрдм рдореЗрд░реЗ рд▓рд┐рдП рдЗрд╕рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛ рдЕрдкрдиреЗ рдЕрдиреБрд░реВрдк рд╕рдорд╛рдпреЛрдЬрд┐рдд рдХрд░рдирд╛ рдЖрд╕рд╛рди рд╣реЛ рдЧрдпрд╛ рд╣реИ, рди рдХрд┐ рдЗрд╕рдХреЗ рд╡рд┐рдкрд░реАрддред

рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рд╣рдо TOML (рдкреБрд░рд╛рдиреЗ рд╡рд┐рдВрдбреЛрдЬрд╝ INI рдХреЗ рд╕рдорд╛рди) рд▓реЗрддреЗ рд╣реИрдВред рдФрд░ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдХ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рд╣реИ рдЬрд┐рд╕рдореЗрдВ рд╣рдо рд╡рд░реНрдгрди рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ рдХреАрдмреЛрд░реНрдб рд╕реЗ рдирд╡реАрдирддрдо рд╕реНрдХреИрди рдХреЛрдб рдХреЗ рд╕реЗрдЯ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рд╣реБрдХ рдХреА рдПрдХ рд╢реНрд░реГрдВрдЦрд▓рд╛ рдХреИрд╕реЗ рд╕рдВрд▓рдЧреНрди рдХрд░реЗрдВред рдиреАрдЪреЗ, рдЯреБрдХрдбрд╝реЗ-рдЯреБрдХрдбрд╝реЗ рдореЗрдВ рд╡рд╣реА рд╣реИ рдЬреЛ рдЕрдм рддрдХ рд╣реБрдЖ рд╣реИред рдФрд░ рдЗрд╕ рдмрд╛рдд рдХрд╛ рд╕реНрдкрд╖реНрдЯреАрдХрд░рдг рдХрд┐ рдореИрдВрдиреЗ рдРрд╕рд╛ рдирд┐рд░реНрдгрдп рдХреНрдпреЛрдВ рд▓рд┐рдпрд╛ред

0. рдмреБрдирд┐рдпрд╛рджреА рд╕рд╛рд░

  • рд╕реНрдХреИрди рдХреЛрдб рдкрджрдирд╛рдоред рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдХреБрдЫ рдХрд░рдиреЗ рдХреА рдЬрд╝рд░реВрд░рдд рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдбрд┐рдЬрд┐рдЯрд▓ рдХреЛрдб рдмрд┐рд▓реНрдХреБрд▓ рднреА рдорд╛рдирд╡-рдкрдардиреАрдп рдирд╣реАрдВ рд╣реИрдВ (рдпрд╣ рд╕рд┐рд░реНрдл рдореИрдВ рд╣реА рдХрд╣ рд╕рдХрддрд╛ рд╣реВрдБ)ред loloswitcher).
    рдореИрдВрдиреЗ "golang-evdev" рд╕реЗ "ecodes.go" рдХреЛ рд╣рдЯрд╛ рджрд┐рдпрд╛ (рдореИрдВ рдореВрд▓ рд╕реНрд░реЛрдд рдХреЛ рджреЗрдЦрдиреЗ рдореЗрдВ рдмрд╣реБрдд рдЖрд▓рд╕реА рдерд╛, рд╣рд╛рд▓рд╛рдВрдХрд┐ рд▓реЗрдЦрдХ рдиреЗ рдЗрд╕реЗ рдХрд╛рдлреА рд╕рд╛рдВрд╕реНрдХреГрддрд┐рдХ рд░реВрдк рд╕реЗ рдЗрдВрдЧрд┐рдд рдХрд┐рдпрд╛ рдерд╛)ред рдореИрдВрдиреЗ рдХреБрдЫ (рдЕрднреА рдХреЗ рд▓рд┐рдП) рдХреБрдЫ рд╕реБрдзрд╛рд░ рдХрд┐рдпрд╛ рдЬреЛ рдХрд╛рдлреА рдбрд░рд╛рдиреЗ рд╡рд╛рд▓рд╛ рдерд╛ред рдЬреИрд╕реЗ "LEFTBRACE" тЖТ "L_BRACE"ред
  • рдЗрд╕рдХреЗ рдЕрддрд┐рд░рд┐рдХреНрдд, рдЙрдиреНрд╣реЛрдВрдиреЗ "рд░рд╛рдЬреНрдп рдХреБрдВрдЬреА" рдХреА рдЕрд╡рдзрд╛рд░рдгрд╛ рдкреЗрд╢ рдХреАред рдЪреВрдБрдХрд┐ рдкреНрд░рдпреБрдХреНрдд рдирд┐рдпрдорд┐рдд рд╡реНрдпрд╛рдХрд░рдг рд▓рдВрдмреЗ рдЕрдиреБрдЪреНрдЫреЗрджреЛрдВ рдХреА рдЕрдиреБрдорддрд┐ рдирд╣реАрдВ рджреЗрддрд╛ рд╣реИред (рд▓реЗрдХрд┐рди рдпрд╣ рдЖрдкрдХреЛ рдиреНрдпреВрдирддрдо рдУрд╡рд░рд╣реЗрдб рдХреЗ рд╕рд╛рде рдЬрд╛рдВрдЪ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рдпрджрд┐ рдЖрдк рдХреЗрд╡рд▓ "рдкреНрд░рддреНрдпрдХреНрд╖" рд░рд┐рдХреЙрд░реНрдбрд┐рдВрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред)
  • рдЬреЛ рджрдмрд╛рдпрд╛ рдЬрд╛рдПрдЧрд╛ рдЙрд╕рдХрд╛ рдПрдХ рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд "рдбрд┐рдбреБрдкреНрд▓рд┐рдХреЗрдЯрд░" рд╣реЛрдЧрд╛ред рдЗрд╕ рдкреНрд░рдХрд╛рд░, рд╕реНрдерд┐рддрд┐ "repeat"=2 рд▓рд┐рдЦреА рдЬрд╛рдПрдЧреА рдПрдХ рд╕рдордпред

1. рдЯреЗрдореНрдкреНрд▓реЗрдЯ рдЕрдиреБрднрд╛рдЧ

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

рдзреНрд╡рдиреНрдпрд╛рддреНрдордХ рд╕рдВрдХреЗрддрди рдХреЗ рд╕рд╛рде рдорд╛рдирд╡ рднрд╛рд╖рд╛ рдХрд╛ рд╢рдмреНрдж рдХрд┐рд╕рд╕реЗ рдорд┐рд▓рдХрд░ рдмрдирддрд╛ рд╣реИ? (рдпрд╛ рддреЛ рдЧреНрд░реЗрдлреЗрдореНрд╕ рдЙрд░реНрдл тАЛтАЛ"рдЪрд┐рддреНрд░рд▓рд┐рдкрд┐" рдХрд╛ рдорд╛рдорд▓рд╛)? рдХрд┐рд╕реА рдкреНрд░рдХрд╛рд░ рдХреА рднрдпрд╛рдирдХ "рдЪрд╛рджрд░"ред рдЗрд╕рд▓рд┐рдП, рдореИрдВ рддреБрд░рдВрдд "рдЯреЗрдореНрдкрд▓реЗрдЯ" рдХреА рдЕрд╡рдзрд╛рд░рдгрд╛ рдХрд╛ рдкрд░рд┐рдЪрдп рджреЗрддрд╛ рд╣реВрдВред

2. рдХрд┐рд╕реА рдЪреАрдЬрд╝ рдкрд░ рдХреНрд▓рд┐рдХ рд╣реЛрдиреЗ рдкрд░ рдХреНрдпрд╛ рдХрд░реЗрдВ (рджреВрд╕рд░рд╛ рд╕реНрдХреИрди рдХреЛрдб рдЖ рдЧрдпрд╛ рд╣реИ)

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

рдХреБрд▓ 768 рдХреЛрдб рд╣реИрдВред (рд▓реЗрдХрд┐рди "рдмрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ" рдореИрдВрдиреЗ рдПрдХреНрд╕рд╕реНрд╡рд┐рдЪрд░ рдХреЛрдб рдореЗрдВ "рдЖрд╢реНрдЪрд░реНрдп" рдХреЛ рд╢рд╛рдорд┐рд▓ рдХрд┐рдпрд╛)ред
рдЕрдВрджрд░ рдореИрдВрдиреЗ "рдХреНрдпрд╛ рдХрд░реЗрдВ" рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд▓рд┐рдВрдХ рдХреЗ рд╕рд╛рде рд╕рд░рдгреА рдХреЛ рднрд░рдиреЗ рдХрд╛ рд╡рд░реНрдгрди рдХрд┐рдпрд╛ рд╣реИред рдЧреЛрд▓рд╛рдВрдЧ рдореЗрдВ рдпрд╣ рд╣реИ (рдЕрдЪрд╛рдирдХ рд╕реЗ) рдпрд╣ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рдФрд░ рд╕реНрдкрд╖реНрдЯ рдирд┐рдХрд▓рд╛ред

  • рдореЗрд░реА рдпреЛрдЬрдирд╛ рдЗрд╕ рд╕реНрдерд╛рди рдкрд░ "рдбреНрд░реЙрдк" рдХреЛ рдиреНрдпреВрдирддрдо рдХрд░рдиреЗ рдХреА рд╣реИред рдЕрдзрд┐рдХ рд▓рдЪреАрд▓реА рдкреНрд░реЛрд╕реЗрд╕рд┐рдВрдЧ рдХреЗ рдкрдХреНрд╖ рдореЗрдВ (рдореИрдВ рдЗрд╕реЗ рдиреАрдЪреЗ рджрд┐рдЦрд╛рдКрдВрдЧрд╛)ред

3. рд╡рд┐рдВрдбреЛ рдХреНрд▓рд╛рд╕реЗрд╕ рд╡рд╛рд▓реА рдЯреЗрдмрд▓

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

рддрд╛рд▓рд┐рдХрд╛ рдХреА рдкрдВрдХреНрддрд┐рдпрд╛рдБ рдЙрд╕рдХреЗ рдирд╛рдо рдХреЗ рд╕рд╛рде рджреЛрд╣рд░реЗ рд╡рд░реНрдЧрд╛рдХрд╛рд░ рдХреЛрд╖реНрдардХреЛрдВ рдореЗрдВ рд╣реИрдВред рд╢реБрд░реБрдЖрдд рд╕реЗ рд╣реА рдпрд╣ рдЗрд╕рд╕реЗ рдЖрд╕рд╛рди рдирд╣реАрдВ рд╣реЛ рд╕рдХрддрд╛ рдерд╛ред рд╡рд░реНрддрдорд╛рди рдореЗрдВ рд╕рдХреНрд░рд┐рдп рд╡рд┐рдВрдбреЛ рдХреЗ рдЖрдзрд╛рд░ рдкрд░, рдЖрдк рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╡рд┐рдХрд▓реНрдкреЛрдВ рдХрд╛ рдЪрдпрди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:

  • "рд╣реЙрдЯ рдХреБрдВрдЬрд┐рдпрд╛рдБ" рдХрд╛ рдЖрдкрдХрд╛ рдЕрдкрдирд╛ рд╕реЗрдЯ "рдХреНрд░рд┐рдпрд╛рдПрдБ = ..."ред рдпрджрд┐ рдирд╣реАрдВ/рдЦрд╛рд▓реА рд╣реИ, рддреЛ рдХреБрдЫ рди рдХрд░реЗрдВред
  • "рдорд╛рдЙрд╕рдХреНрд▓рд┐рдХрдбреНрд░реЙрдкреНрд╕" рд╕реНрд╡рд┐рдЪ рдХрд░реЗрдВ - рдорд╛рдЙрд╕ рдХреНрд▓рд┐рдХ рдХрд╛ рдкрддрд╛ рдЪрд▓рдиреЗ рдкрд░ рдХреНрдпрд╛ рдХрд░реЗрдВред рдЪреВрдВрдХрд┐ рдЙрд╕ рдмрд┐рдВрджреБ рдкрд░ рдЬрд╣рд╛рдВ xswitcher рдЪрд╛рд▓реВ рд╣реИ, рд╡рд╣рд╛рдВ "рд╡реЗ рдХрд╣рд╛рдВ рдХреНрд▓рд┐рдХ рдХрд░рддреЗ рд╣реИрдВ" рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреЛрдИ рд╡рд┐рд╡рд░рдг рдирд╣реАрдВ рд╣реИ, рд╣рдо рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ рдмрдлрд░ рдХреЛ рд░реАрд╕реЗрдЯ рдХрд░рддреЗ рд╣реИрдВред рд▓реЗрдХрд┐рди рдЯрд░реНрдорд┐рдирд▓реЛрдВ рдореЗрдВ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП) рдЖрдкрдХреЛ рдРрд╕рд╛ рдХрд░рдиреЗ рдХреА рдЬрд╝рд░реВрд░рдд рдирд╣реАрдВ рд╣реИ (рдЖрдо рддреМрд░ рдкрд░).

4. рдХреНрд▓рд┐рдХреЛрдВ рдХрд╛ рдПрдХ (рдпрд╛ рдХрдИ) рдХреНрд░рдо рдПрдХ рдпрд╛ рджреВрд╕рд░реЗ рд╣реБрдХ рдХреЛ рдЯреНрд░рд┐рдЧрд░ рдХрд░рддрд╛ рд╣реИ

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

рд╣реБрдХ рдХреЛ рджреЛ рдкреНрд░рдХрд╛рд░реЛрдВ рдореЗрдВ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдмрд┐рд▓реНрдЯ-рдЗрди, "рдмреЛрд▓рдиреЗ" рд╡рд╛рд▓реЗ рдирд╛рдореЛрдВ (рдиреНрдпреВрд╡рд░реНрдб, рдиреНрдпреВрд╕реЗрдВрдЯреЗрдВрд╕, рдХрдВрдкреЛрдЬрд╝) рдХреЗ рд╕рд╛рде рдФрд░ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХрд░рдиреЗ рдпреЛрдЧреНрдпред

рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХрд░рдиреЗ рдпреЛрдЧреНрдп рдирд╛рдо "рдПрдХреНрд╢рди" рд╕реЗ рд╢реБрд░реВ рд╣реЛрддреЗ рд╣реИрдВред рдХреНрдпреЛрдВрдХрд┐ TOML v1.4, рдмрд┐рдВрджреБрдУрдВ рд╡рд╛рд▓реЗ рдирд╛рдо рдЙрджреНрдзрд░рдг рдЪрд┐рд╣реНрдиреЛрдВ рдореЗрдВ рд╣реЛрдиреЗ рдЪрд╛рд╣рд┐рдПред

рдкреНрд░рддреНрдпреЗрдХ рдЕрдиреБрднрд╛рдЧ рдХрд╛ рд╡рд░реНрдгрди рдиреАрдЪреЗ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдЗрд╕реА рдирд╛рдо рд╕реЗ.

рд▓реЛрдЧреЛрдВ рдХреЗ рджрд┐рдорд╛рдЧ рдХреЛ "рдирдЧреНрди" рдирд┐рдпрдорд┐рдд (рдЕрдиреБрднрд╡ рд╕реЗ, рдЙрдирдХреЗ) рд╕реЗ рди рдЙрдбрд╝рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд▓рд┐рдЦрдирд╛рд╢рд╛рдпрдж рджрд╕ рдореЗрдВ рд╕реЗ рдПрдХ рдкреЗрд╢реЗрд╡рд░реЛрдВ), рдореИрдВ рддреБрд░рдВрдд рдЕрддрд┐рд░рд┐рдХреНрдд рд╕рд┐рдВрдЯреИрдХреНрд╕ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реВрдВред

  • "рдмрдВрдж:" (рдпрд╛ "рдЪрд╛рд▓реВ:") regexp (рдирд┐рдпрдорд┐рдд рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐) рд╕реЗ рдкрд╣рд▓реЗ рдЖрд╡рд╢реНрдпрдХ рд╣реИ рдХрд┐ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдмрдЯрди рдЬрд╛рд░реА рдХрд┐рдП рдЬрд╛рдПрдВ (рдпрд╛ рджрдмрд╛рдП рдЬрд╛рдПрдВ)ред
    рдЖрдЧреЗ рдореИрдВ рдПрдХ "рдЕрдиреБрдЪрд┐рдд" рдирд┐рдпрдорд┐рдд рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХрд░рдиреЗ рдЬрд╛ рд░рд╣рд╛ рд╣реВрдБред рдкрд╛рдЗрдкреЛрдВ рдХреЗ рдмреАрдЪ рдЯреБрдХрдбрд╝реЛрдВ рдХреА рдЕрд▓рдЧ-рдЕрд▓рдЧ рдЬрд╛рдБрдЪ рдХреЗ рд╕рд╛рде "|"ред "[LR]_SHIFT" (рдЬрд╣рд╛рдВ рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдЖрд╡рд╢реНрдпрдХ рдирд╣реАрдВ рд╣реИ) рдЬреИрд╕реЗ рд░рд┐рдХреЙрд░реНрдб рдХреА рд╕рдВрдЦреНрдпрд╛ рдХреЛ рдХрдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдПред
  • "рдПрд╕рдИрдХреНрдпреВ:" рдпрджрд┐ рдкрд┐рдЫрд▓реА рд╢рд░реНрдд рдкреВрд░реА рд╣реЛрддреА рд╣реИ (рдпрд╛ рдЕрдиреБрдкрд╕реНрдерд┐рдд рд╣реИ), рддреЛ рд╣рдо "рд╕рд╛рдорд╛рдиреНрдп" рдирд┐рдпрдорд┐рдд рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХреЗ рд╡рд┐рд░реБрджреНрдз рдЬрд╛рдБрдЪ рдХрд░рддреЗ рд╣реИрдВред рд╡рд┐рд╡рд░рдг рдХреЗ рд▓рд┐рдП, рдореИрдВ рддреБрд░рдВрдд ^W рдХреЛ "regexp" рд▓рд╛рдЗрдмреНрд░реЗрд░реА рднреЗрдЬрддрд╛ рд╣реВрдВред рдХреНрдпреЛрдВрдХрд┐ рдореИрдВрдиреЗ рдЕрднреА рднреА рдЕрдкрдиреЗ рдкрд╕рдВрджреАрджрд╛ рдкреАрд╕реАрдЖрд░ ("рдкрд░реНрд▓ рд╕рдВрдЧрдд") рдХреЗ рд╕рд╛рде рд╕рдВрдЧрддрддрд╛ рдХреА рдбрд┐рдЧреНрд░реА рдЬрд╛рдирдиреЗ рдХреА рдЬрд╣рдордд рдирд╣реАрдВ рдЙрдард╛рдИ рд╣реИред
  • рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рд░реВрдк рдореЗрдВ рд▓рд┐рдЦреА рдЧрдИ рд╣реИ "рдмрдЯрди_1: рдХреЛрдб1, рдмрдЯрди_2: рдХреЛрдб2" рдЖрджрд┐, рдЬрд┐рд╕ рдХреНрд░рдо рдореЗрдВ рд╕реНрдХреИрди рдХреЛрдб рдкреНрд░рд╛рдкреНрдд рд╣реЛрддреЗ рд╣реИрдВред
  • рдЪреЗрдХ рдХреЛ рд╣рдореЗрд╢рд╛ рдЕрдиреБрдХреНрд░рдо рдХреЗ рдЕрдВрдд рддрдХ "рдЖрд░рд╛рдо рд╕реЗ" рд░рдЦрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЯреЗрд▓ рдореЗрдВ "$" рдЬреЛрдбрд╝рдиреЗ рдХреА рдХреЛрдИ рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред
  • рдПрдХ рдкрдВрдХреНрддрд┐ рдореЗрдВ рд╕рднреА рдЬрд╛рдБрдЪреЗрдВ рдПрдХ рдХреЗ рдмрд╛рдж рдПрдХ рдХреА рдЬрд╛рддреА рд╣реИрдВ рдФрд░ "рдореИрдВ" рд╕реЗ рд╕рдВрдпреБрдХреНрдд рд╣реИрдВред рд▓реЗрдХрд┐рди рдЪреВрдБрдХрд┐ рдорд╛рди рдХреЛ рдПрдХ рд╕рд░рдгреА рдХреЗ рд░реВрдк рдореЗрдВ рд╡рд░реНрдгрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдЖрдк рдЕрд▓реНрдкрд╡рд┐рд░рд╛рдо рдХреЗ рдмрд╛рдж рдПрдХ рд╡реИрдХрд▓реНрдкрд┐рдХ рдЬрд╛рдБрдЪ рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВред рдпрджрд┐ рдХрд┐рд╕реА рдХрд╛рд░рдгрд╡рд╢ рдЗрд╕рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛ.
  • рдореВрд▓реНрдп "рд╕реЗрдХ рд▓рдВрдмрд╛рдИ = 8" рдмрдлрд╝рд░ рдХреЗ рдЖрдХрд╛рд░ рдХреЛ рд╕реАрдорд┐рдд рдХрд░рддрд╛ рд╣реИ рдЬрд┐рд╕рдХреЗ рд╡рд┐рд░реБрджреНрдз рд╕рднреА рдЬрд╛рдБрдЪреЗрдВ рдХреА рдЬрд╛рддреА рд╣реИрдВред рдХреНрдпреЛрдВрдХрд┐ рдореИрдВрдиреЗ (рдЕрдм рддрдХ) рдЕрдкрдиреЗ рдЬреАрд╡рди рдореЗрдВ рдХрднреА рднреА рдЕрд╕реАрдорд┐рдд рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдХрд╛ рд╕рд╛рдордирд╛ рдирд╣реАрдВ рдХрд┐рдпрд╛ рд╣реИред

5. рдкрд┐рдЫрд▓реЗ рдЕрдиреБрднрд╛рдЧ рдореЗрдВ рд╡рд░реНрдгрд┐рдд рд╣реБрдХ рд╕реЗрдЯ рдХрд░рдирд╛

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

рдпрд╣рд╛рдБ рдореБрдЦреНрдп рдмрд╛рдд рдпрд╣ рд╣реИ "рдХрд╛рд░реНрд░рд╡рд╛рдИ = [рд╕рд░рдгреА]". рдкрд┐рдЫрд▓реЗ рдЕрдиреБрднрд╛рдЧ рдХреЗ рд╕рдорд╛рди, рдЗрд╕рдореЗрдВ рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рдХреНрд░рд┐рдпрд╛рдУрдВ рдХрд╛ рдПрдХ рд╕реАрдорд┐рдд рд╕реЗрдЯ рд╣реИред рдФрд░ рдбреЙрдХрд┐рдВрдЧ рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рд╕рд┐рджреНрдзрд╛рдВрдд рд░реВрдк рдореЗрдВ рд╕реАрдорд┐рдд рдирд╣реАрдВ рд╣реИ ("Action.XXX" рд▓рд┐рдЦреЗрдВ рдФрд░ рдЗрд╕рдХреЗ рд▓рд┐рдП рджреВрд╕рд░рд╛ рдЕрдиреБрднрд╛рдЧ рд▓рд┐рдЦрдиреЗ рдореЗрдВ рдЖрд▓рд╕реНрдп рди рдХрд░реЗрдВ).
рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ, рд╕рдВрд╢реЛрдзрд┐рдд рд▓реЗрдЖрдЙрдЯ рдореЗрдВ рдХрд┐рд╕реА рд╢рдмреНрдж рдХреА рдкреБрдирдГ рдЯрд╛рдЗрдкрд┐рдВрдЧ рдХреЛ рджреЛ рднрд╛рдЧреЛрдВ рдореЗрдВ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ: "рд╡рд╣рд╛рдВ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдЕрдиреБрд╕рд╛рд░ рд▓реЗрдЖрдЙрдЯ рдмрджрд▓реЗрдВ" ╨╕ "рдкреБрдирдГ рдЯрд╛рдЗрдк рдХрд░реЗрдВ" ("рдкреБрдирдГ рдЯрд╛рдЗрдк рдХрд░реЗрдВрд╢рдмреНрдж").

рд╢реЗрд╖ рдкреИрд░рд╛рдореАрдЯрд░ "рд╢рдмреНрджрдХреЛрд╢" рдореЗрдВ рд▓рд┐рдЦреЗ рдЧрдП рд╣реИрдВ (рдЧреЛрд▓рдВрдЧ рдореЗрдВ "рдорд╛рдирдЪрд┐рддреНрд░") рдХрд┐рд╕реА рджрд┐рдП рдЧрдП рдХрд╛рд░реНрдп рдХреЗ рд▓рд┐рдП, рдЙрдирдХреА рд╕реВрдЪреА "рдХрд╛рд░реНрд░рд╡рд╛рдИ" рдореЗрдВ рдЬреЛ рд▓рд┐рдЦрд╛ рд╣реИ рдЙрд╕ рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддреА рд╣реИред

рдПрдХ рд╣реА рдвреЗрд░ рдореЗрдВ рдХрдИ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдХреНрд░рд┐рдпрд╛рдУрдВ рдХрд╛ рд╡рд░реНрдгрди рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ (рдЕрдиреБрднрд╛рдЧ). рдпрд╛ рдЖрдк рдЗрд╕реЗ рдЦреАрдВрдЪрдХрд░ рдЕрд▓рдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ. рдЬреИрд╕рд╛ рдХрд┐ рдореИрдВрдиреЗ рдКрдкрд░ рджрд┐рдЦрд╛рдпрд╛ред

рдореИрдВрдиреЗ рдмрд╛рд╣рд░реА рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рддреБрд░рдВрдд "Exec" рдХреНрд░рд┐рдпрд╛ рд╕реЗрдЯ рдХреАред рд░рд┐рдХреЙрд░реНрдб рдХрд┐рдП рдЧрдП рдмрдлрд╝рд░ рдХреЛ stdin рдореЗрдВ рдкреБрд╢ рдХрд░рдиреЗ рдХреЗ рд╡рд┐рдХрд▓реНрдк рдХреЗ рд╕рд╛рдеред

  • "рдкреНрд░рддреАрдХреНрд╖рд╛ = 1" - рдЪрд▓ рд░рд╣реА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдкреВрд░реА рд╣реЛрдиреЗ рддрдХ рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░реЗрдВред
  • рд╕рдВрднрд╡рддрдГ, "рдвреЗрд░ рддрдХ" рдЖрдк рдкрд░реНрдпрд╛рд╡рд░рдг рдореЗрдВ рдЕрддрд┐рд░рд┐рдХреНрдд рд▓реЛрдЧреЛрдВ рдХреЛ рд░рдЦрдирд╛ рдЪрд╛рд╣реЗрдВрдЧреЗред рдЬрд╛рдирдХрд╛рд░реА рдЬреИрд╕реЗ рдХрд┐ рд╡рд┐рдВрдбреЛ рдХреНрд▓рд╛рд╕ рдХрд╛ рдирд╛рдо рдЬрд┐рд╕рд╕реЗ рдЗрд╕реЗ рдЗрдВрдЯрд░рд╕реЗрдкреНрдЯ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред
    тАЬрдХреНрдпрд╛ рдЖрдк рдЕрдкрдиреЗ рд╣реИрдВрдбрд▓рд░ рдХреЛ рдХрдиреЗрдХреНрдЯ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ? рдпрд╣реА рд╡рд╣ рдЬрдЧрд╣ рд╣реИ рдЬрд╣рд╛рдВ рдЖрдкрдХреЛ рдЬрд╛рдиреЗ рдХреА рдЬрд░реВрд░рдд рд╣реИред"

рдУрдлрд╝реНрдлрд╝ (рд╕рд╛рдБрд╕ рдЫреЛрдбрд╝рддреЗ рд╣реБрдП)ред рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдЬреИрд╕реЗ рдореИрдВ рдХреБрдЫ рднреА рдирд╣реАрдВ рднреВрд▓рд╛ рд╣реВрдВ.

рдЙрдлрд╝! рд╣рд╛рдБ, рдореИрдВ рдирд╣реАрдВ рднреВрд▓рд╛...
рд▓реЙрдиреНрдЪ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдХрд╣рд╛рдВ рд╣реИ? рд╣рд╛рд░реНрдб рдХреЛрдб рдореЗрдВ? рдЙрд╕ рддрд░рд╣:

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

рдореИрдВ рдХрд╣рд╛рдВ рднреВрд▓/рдЧрд▓рддреА рдХрд░ рдЧрдпрд╛? (рдЗрд╕рдХреЗ рдмрд┐рдирд╛ рдХреЛрдИ рд░рд╛рд╕реНрддрд╛ рдирд╣реАрдВ), рдореИрдВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЖрд╢рд╛ рдХрд░рддрд╛ рд╣реВрдВ рдХрд┐ рдЪреМрдХрд╕ рдкрд╛рдардХ рдЕрдкрдиреА рдирд╛рдХ рдореЗрдВ рджрдо рдХрд░рдиреЗ рдореЗрдВ рдЖрд▓рд╕реА рдирд╣реАрдВ рд╣реЛрдВрдЧреЗред

рднрд╛рдЧреНрдп рдЕрдЪреНрдЫрд╛ рд╣реИ!

рд╕реНрд░реЛрдд: www.habr.com

рдПрдХ рдЯрд┐рдкреНрдкрдгреА рдЬреЛрдбрд╝реЗрдВ