Новый Π°Π½Π°Π»ΠΎΠ³ Punto Switcher для linux: xswitcher

ΠŸΡ€Π΅ΠΊΡ€Π°Ρ‰Π΅Π½ΠΈΠ΅ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠΈ xneur Π²Ρ‹Π·Π²Π°Π»ΠΎ Ρƒ мСня ΠΎΠΏΡ€Π΅Π΄Π΅Π»Ρ‘Π½Π½Ρ‹Π΅ страдания Π² послСдниС ΠΏΠΎΠ»Π³ΠΎΠ΄Π° (с появлСниСм OpenSUSE 15.1 Π½Π° ΠΌΠΎΠΈΡ… дСсктопах: ΠΏΡ€ΠΈ Π²ΠΊΠ»ΡŽΡ‡Ρ‘Π½Π½ΠΎΠΌ xneur ΠΎΠΊΠ½Π° Ρ‚Π΅Ρ€ΡΡŽΡ‚ фокус ΠΈ Π·Π°Π±Π°Π²Π½ΠΎ ΠΌΠ΅Ρ€Ρ†Π°ΡŽΡ‚ Π² Ρ‚Π°ΠΊΡ‚ Π²Π²ΠΎΠ΄Π° с ΠΊΠ»Π°Π²ΠΈΠ°Ρ‚ΡƒΡ€Ρ‹).

«А, Π±Π»ΠΈΠ½, ΠΎΠΏΡΡ‚ΡŒ Π½Π΅ Π² Ρ‚ΠΎΠΉ раскладкС Π½Π°Ρ‡Π°Π» Π½Π°Π±ΠΈΡ€Π°Ρ‚ΡŒΒ» β€” Π² ΠΌΠΎΠ΅ΠΉ Ρ€Π°Π±ΠΎΡ‚Π΅ встрСчаСтся Π΄ΠΎ нСприличия часто. И ΠΏΠΎΠ·ΠΈΡ‚ΠΈΠ²Π° Π½Π΅ добавляСт.

Новый Π°Π½Π°Π»ΠΎΠ³ Punto Switcher для linux: xswitcher
Π’ Ρ‚ΠΎ ΠΆΠ΅ врСмя, я (ΠΊΠ°ΠΊ ΠΈΠ½ΠΆΠ΅Π½Π΅Ρ€-конструктор) ΠΌΠΎΠ³Ρƒ достаточно ясно ΡΡ„ΠΎΡ€ΠΌΡƒΠ»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Ρ‡Π΅Π³ΠΎ Ρ…ΠΎΡ‡Ρƒ. А Ρ…ΠΎΡ‚Π΅Π» я (сначала ΠΎΡ‚ Punto Switcher, Π° Π·Π°Ρ‚Π΅ΠΌ, спасибо Windows Vista, ΠΎΠΊΠΎΠ½Ρ‡Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ пСрСсСв Π½Π° Linux, ΠΎΡ‚ xneur) Ρ€ΠΎΠ²Π½ΠΎ ΠΎΠ΄Π½ΠΎΠ³ΠΎ. Осознав, Ρ‡Ρ‚ΠΎ Π½Π° экранС Π±Π΅Π»ΠΈΠ±Π΅Ρ€Π΄Π° Π½Π΅ Π² Ρ‚ΠΎΠΉ раскладкС (Ρ‚Π°ΠΊΠΎΠ΅ ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ случаСтся Π² ΠΊΠΎΠ½Ρ†Π΅ Π½Π°Π±ΠΎΡ€Π° Π½ΠΎΠ²ΠΎΠ³ΠΎ слова), Ρ‚ΠΎΠΏΠ½ΡƒΡ‚ΡŒ ΠΏΠΎ Β«Pause/BreakΒ». И ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ Ρ‚ΠΎ Ρ‡Ρ‚ΠΎ ΠΏΠ΅Ρ‡Π°Ρ‚Π°Π».

На Π΄Π°Π½Π½Ρ‹ΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ‚ ΠΈΠ·Π΄Π΅Π»ΠΈΠ΅ ΠΈΠΌΠ΅Π΅Ρ‚ ΠΎΠΏΡ‚ΠΈΠΌΠ°Π»ΡŒΠ½ΠΎΠ΅ (с Ρ‚ΠΎΡ‡ΠΊΠΈ зрСния мСня) ΠΎΡ‚Π½ΠΎΡˆΠ΅Π½ΠΈΠ΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ/ΡΠ»ΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ. ΠŸΠΎΡ€Π° Π΄Π΅Π»ΠΈΡ‚ΡŒΡΡ.

TL.DR

Π”Π°Π»ΡŒΡˆΠ΅ ΠΏΠΎΠΉΠ΄ΡƒΡ‚ всякиС тСхничСскиС подробности, поэтому сначала β€” ссылка Β«Π½Π° ΠΏΠΎΡ‚Ρ€ΠΎΠ³Π°Ρ‚ΡŒΒ» для Π½Π΅Ρ‚Π΅Ρ€ΠΏΠ΅Π»ΠΈΠ²Ρ‹Ρ….

На Π΄Π°Π½Π½Ρ‹ΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ‚ Π·Π°Ρ…Π°Ρ€Π΄ΠΊΠΎΠΆΠ΅Π½ΠΎ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π΅ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅:

  • Β«Pause/BreakΒ»: Π·Π°Π±ΠΈΠ²Π°Π΅Ρ‚ (Backspace) послСднСС слово, ΠΏΠ΅Ρ€Π΅ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ раскладку Π² Π°ΠΊΡ‚ΠΈΠ²Π½ΠΎΠΌ ΠΎΠΊΠ½Π΅ (ΠΌΠ΅ΠΆΠ΄Ρƒ 0 ΠΈ 1) ΠΈ Π½Π°Π±ΠΈΡ€Π°Π΅Ρ‚ Π΅Ρ‰Ρ‘ Ρ€Π°Π·.
  • Β«Π›Π΅Π²Ρ‹ΠΉ Ctrl Π±Π΅Π· Π½ΠΈΡ‡Π΅Π³ΠΎΒ»: ΠΏΠ΅Ρ€Π΅ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ раскладку Π² Π°ΠΊΡ‚ΠΈΠ²Π½ΠΎΠΌ ΠΎΠΊΠ½Π΅ (ΠΌΠ΅ΠΆΠ΄Ρƒ 0 ΠΈ 1).
  • Β«Π›Π΅Π²Ρ‹ΠΉ Shift Π±Π΅Π· Π½ΠΈΡ‡Π΅Π³ΠΎΒ»: Π²ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ Π² Π°ΠΊΡ‚ΠΈΠ²Π½ΠΎΠΌ ΠΎΠΊΠ½Π΅ раскладку β„–0.
  • Β«ΠŸΡ€Π°Π²Ρ‹ΠΉ Shift Π±Π΅Π· Π½ΠΈΡ‡Π΅Π³ΠΎΒ»: Π²ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ Π² Π°ΠΊΡ‚ΠΈΠ²Π½ΠΎΠΌ ΠΎΠΊΠ½Π΅ раскладку β„–1.

Π‘ этого ΠΌΠΎΠΌΠ΅Π½Ρ‚Π° я ΠΏΠ»Π°Π½ΠΈΡ€ΡƒΡŽ ΠΊΠ°ΡΡ‚ΠΎΠΌΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅. Π‘Π΅Π· ΠΎΠ±Ρ€Π°Ρ‚Π½ΠΎΠΉ связи β€” Π½Π΅ интСрСсно (мСня ΠΈ Ρ‚Π°ΠΊ устраиваСт). Полагаю, Π½Π° Π₯Π°Π±Ρ€Π΅ найдётся достаточный ΠΏΡ€ΠΎΡ†Π΅Π½Ρ‚ Π°ΡƒΠ΄ΠΈΡ‚ΠΎΡ€ΠΈΠΈ с Π°Π½Π°Π»ΠΎΠ³ΠΈΡ‡Π½Ρ‹ΠΌΠΈ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ°ΠΌΠΈ.

N.B. Π’.ΠΊ. Π² Ρ‚Π΅ΠΊΡƒΡ‰Π΅ΠΉ вСрсии ΠΊΠ΅ΠΉΠ»ΠΎΠ³Π³Π΅Ρ€ прикручиваСтся ΠΊ "/dev/input/", xswitcher Π΄ΠΎΠ»ΠΆΠ΅Π½ Π·Π°ΠΏΡƒΡΠΊΠ°Ρ‚ΡŒΡΡ с Ρ€ΡƒΡ‚ΠΎΠ²Ρ‹ΠΌΠΈ ΠΏΡ€Π°Π²Π°ΠΌΠΈ:

chown root:root xswitcher
chmod +xs xswitcher

ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅: Π²Π»Π°Π΄Π΅Π»ΡŒΡ†Π΅ΠΌ Ρ„Π°ΠΉΠ»Π° с suid Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±Ρ‹Ρ‚ΡŒ root, Ρ‚.ΠΊ. ΠΊΡ‚ΠΎ Π²Π»Π°Π΄Π΅Π»Π΅Ρ† β€” Π² Ρ‚ΠΎΠ³ΠΎ suid ΠΈ ΠΏΡ€Π΅Π²Ρ€Π°Ρ‚ΠΈΡ‚ ΠΏΡ€ΠΈ запускС.

ΠŸΠ°Ρ€Π°Π½ΠΎΠΈΠΊΠΈ (я Π½Π΅ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅) ΠΌΠΎΠ³ΡƒΡ‚ ΠΊΠ»ΠΎΠ½ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΈΠ· 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

Автозапуск Π΄ΠΎΠ±Π°Π²Π»ΡΡ‚ΡŒ ΠΏΠΎ вкусу (Π² зависимости ΠΎΡ‚ DE).

Π Π°Π±ΠΎΡ‚Π°Π΅Ρ‚, «каши Π½Π΅ просит» (β‰ˆ30 сСкунд CPU Π² сутки, β‰ˆ12 ΠœΠ‘ Π² RSS).

ΠŸΠΎΠ΄Ρ€ΠΎΠ±Π½ΠΎΡΡ‚ΠΈ

Π’Π΅ΠΏΠ΅Ρ€ΡŒ β€” подробности.

Π’Π΅ΡΡŒ Ρ€Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΠΉ ΠΈΠ·Π½Π°Ρ‡Π°Π»ΡŒΠ½ΠΎ Π±Ρ‹Π» посвящён ΠΌΠΎΠ΅ΠΌΡƒ ΠΏΠ΅Ρ‚-ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Ρƒ, Π° Π΄Ρ€ΡƒΠ³ΠΎΠΉ Π·Π°Π²ΠΎΠ΄ΠΈΡ‚ΡŒ β€” ΠΏΠΎΠΊΠ° лСнь. Π’Π°ΠΊ Ρ‡Ρ‚ΠΎ, всё свалСно Π² ΠΊΡƒΡ‡Ρƒ (просто ΠΏΠΎ ΠΏΠ°ΠΏΠΊΠ°ΠΌ) ΠΈ Π½Π°ΠΊΡ€Ρ‹Ρ‚ΠΎ AGPL (Β«ΠΏΠ°Ρ‚Π΅Π½Ρ‚ Π½Π°ΠΎΠ±ΠΎΡ€ΠΎΡ‚Β»).

Код xswitcher написан Π½Π° golang, с ΠΌΠΈΠ½ΠΈΠΌΠ°Π»ΡŒΠ½Ρ‹ΠΌΠΈ вкраплСниями C. ΠŸΡ€Π΅Π΄ΠΏΠΎΠ»Π°Π³Π°Π΅Ρ‚ΡΡ, Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠΉ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ даст наимСньшиС Ρ‚Ρ€ΡƒΠ΄ΠΎΠ·Π°Ρ‚Ρ€Π°Ρ‚Ρ‹ (ΠΏΠΎΠΊΠ° Ρ‚Π°ΠΊ ΠΈ Π΅ΡΡ‚ΡŒ). Бохраняя Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π°Ρ‚ΡŒ Π½Π΅Π΄ΠΎΡΡ‚Π°ΡŽΡ‰Π΅Π΅ посрСдством cgo.

По тСксту Ρ€Π°Π·Π»ΠΎΠΆΠ΅Π½Ρ‹ ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΈ, ΠΎΡ‚ΠΊΡƒΠ΄Π° Ρ‡Π΅Π³ΠΎ позаимствовал ΠΈ Π·Π°Ρ‡Π΅ΠΌ. Π’.ΠΊ. ΠΊΠΎΠ΄ xneur мСня Β«Π½Π΅ Π²Π΄ΠΎΡ…Π½ΠΎΠ²ΠΈΠ»Β», Π·Π° ΠΎΡ‚ΠΏΡ€Π°Π²Π½ΡƒΡŽ Ρ‚ΠΎΡ‡ΠΊΡƒ взял loloswitcher.

ИспользованиС "/dev/input/" ΠΈΠΌΠ΅Π΅Ρ‚ ΠΊΠ°ΠΊ свои ΠΏΠ»ΡŽΡΡ‹ (всё Π²ΠΈΠ΄Π½ΠΎ Π² Ρ‚.Ρ‡. Π·Π°ΠΆΠ°Ρ‚ΡƒΡŽ ΠΊΠ»Π°Π²ΠΈΡˆΡƒ с Π°Π²Ρ‚ΠΎΠΏΠΎΠ²Ρ‚ΠΎΡ€ΠΎΠΌ), Ρ‚Π°ΠΊ ΠΈ минусы. ΠœΠΈΠ½ΡƒΡΡ‹ Ρ‚Π°ΠΊΠΈΠ΅:

  • Автоповтор (события с ΠΊΠΎΠ΄ΠΎΠΌ Β«2Β») Π½Π΅ ΠΊΠΎΡ€Ρ€Π΅Π»ΠΈΡ€ΡƒΠ΅Ρ‚ с ΠΏΠΎΠ²Ρ‚ΠΎΡ€ΠΎΠΌ с иксах.
  • НС Π²ΠΈΠ΄Π½ΠΎ Π²Π²ΠΎΠ΄Π° Ρ‡Π΅Ρ€Π΅Π· интСрфСйсы X11 (Ρ‚Π°ΠΊ Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ VNC Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚).
  • НуТСн Ρ€ΡƒΡ‚.

Π‘ Π΄Ρ€ΡƒΠ³ΠΎΠΉ стороны, ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΠ΄ΠΏΠΈΡΡ‹Π²Π°Ρ‚ΡŒΡΡ Π½Π° события X Ρ‡Π΅Ρ€Π΅Π· Β«XSelectExtensionEvent()Β». ΠŸΠΎΠ΄ΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ ΠΌΠΎΠΆΠ½ΠΎ Π² ΠΊΠΎΠ΄Π΅ xinput. Для go Π½ΠΈΡ‡Π΅Π³ΠΎ ΠΏΠΎΠ΄ΠΎΠ±Π½ΠΎΠ³ΠΎ Π½Π΅ Π½Π°ΡˆΡ‘Π», Π° чСрновая рСализация Π΄Π°Π»Π° с Ρ…ΠΎΠ΄Ρƒ ΡΠΎΡ‚Π½ΡŽ строчСк C-ΠΊΠΎΠ΄Π°. Пока ΠΎΡ‚Π»ΠΎΠΆΠΈΠ» Π² сторону.

Π’Ρ‹Π²ΠΎΠ΄ Β«ΠΎΠ±Ρ€Π°Ρ‚Π½ΠΎΒ» ΠΏΠΎΠΊΠ° сдСлан Ρ‡Π΅Ρ€Π΅Π· ΠΏΡ€ΠΈΠΊΡ€ΡƒΡ‡ΠΈΠ²Π°Π½ΠΈΠ΅ Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½ΠΎΠΉ ΠΊΠ»Π°Π²ΠΈΠ°Ρ‚ΡƒΡ€Ρ‹. Бпасибо Π°Π²Ρ‚ΠΎΡ€Ρƒ keybd_event, Π½ΠΎ Ρ‚Π°ΠΌ слишком высокоуровнСвая абстракция ΠΈ дальшС придётся ΠΏΠ΅Ρ€Π΅Π΄Π΅Π»Ρ‹Π²Π°Ρ‚ΡŒ. Π£ мСня, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, правая Win-клавиша 3-ΠΉ ряд Π²Ρ‹Π±ΠΈΡ€Π°Π΅Ρ‚. А ΠΎΠ±Ρ€Π°Ρ‚Π½ΠΎ транслируСтся Ρ‚ΠΎΠ»ΡŒΠΊΠΎ лСвая Win.

Π˜Π·Π²Π΅ΡΡ‚Π½Ρ‹Π΅ ошибки

  • НичСго Π½Π΅ Π·Π½Π°Π΅ΠΌ ΠΏΡ€ΠΎ Β«ΠΊΠΎΠΌΠΏΠΎΠ·ΠΈΡ‚Π½Ρ‹ΠΉΒ» Π²Π²ΠΎΠ΄ (ΠΏΡ€ΠΈΠΌΠ΅Ρ€: Β½). ΠŸΡ€ΡΠΌΠΎ сСйчас ΠΎΠ½ΠΎ Π½Π΅ Π½ΡƒΠΆΠ½ΠΎ.
  • НСвСрно воспроизводим ΠΏΡ€Π°Π²ΡƒΡŽ Win. Π’ ΠΌΠΎΡ‘ΠΌ случаС Π»ΠΎΠΌΠ°Π΅Ρ‚ расстановку акцС́нтов.
  • НСт внятного Ρ€Π°Π·Π±ΠΎΡ€Π° Π²Π²ΠΎΠ΄Π°. ВмСсто этого β€” нСсколько Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ: Compare(), CtrlSequence(), RepeatSequence(), SpaceSequence(). Бпасибо nsmcan Π·Π° Π²Π½ΠΈΠΌΠ°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ: исправил Π² ΠΊΠΎΠ΄Π΅ ΠΈ здСсь. Π‘ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Ρ‘Π½Π½ΠΎΠΉ Π²Π΅Ρ€ΠΎΡΡ‚Π½ΠΎΡΡ‚ΡŒΡŽ ΠΌΠΎΠΆΠ½ΠΎ ΠΎΡ‚Ρ…Π²Π°Ρ‚ΠΈΡ‚ΡŒ Π±Π°Π³ΠΈ ΠΏΡ€ΠΈ Π·Π°ΠΌΠ΅Π½Π΅.
    Π’ этом мСстС я Π½Π΅ знаю Β«ΠΊΠ°ΠΊ Π½Π°Π΄ΠΎΒ» ΠΈ Π±ΡƒΠ΄Ρƒ Ρ€Π°Π΄ Π»ΡŽΠ±Ρ‹ΠΌ прСдлоТСниям.
  • (О уТас) ΠΊΠΎΠ½ΠΊΡƒΡ€Π΅Π½Ρ‚Π½ΠΎΠ΅ использованиС ΠΊΠ°Π½Π°Π»ΠΎΠ² (keyboardEvents, miceEvents).

Π—Π°ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅

Код β€” ΠΏΡ€ΠΎΡΡ‚Π΅ΠΉΡˆΠΈΠΉ ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Π½Ρ‹ΠΉ. И Ρ‚ΡƒΠΏ ΠΊΠ°ΠΊ я. Π’Π°ΠΊ Ρ‡Ρ‚ΠΎ, Ρ‚Π΅ΡˆΡƒ сСбя Π½Π°Π΄Π΅ΠΆΠ΄ΠΎΠΉ Ρ‡Ρ‚ΠΎ Π΄ΠΎΠΏΠΈΡΠ°Ρ‚ΡŒ ΠΆΠ΅Π»Π°Π΅ΠΌΠΎΠ΅ смоТСт практичСски любой Ρ‚Π΅Ρ…Π½Π°Ρ€ΡŒ. И Π΄Π°Π½Π½ΠΎΠ΅ ΠΈΠ·Π΄Π΅Π»ΠΈΠ΅ благодаря этому Π½Π΅ сгинСт Π±Π΅Π· ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠΈ ΠΏΠΎΠ΄ΠΎΠ±Π½ΠΎ Π±ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²Ρƒ just-for-fun.

Π£Π΄Π°Ρ‡ΠΈ!

Π˜ΡΡ‚ΠΎΡ‡Π½ΠΈΠΊ: habr.com