ΠΡΠ΅ΠΊΡΠ°ΡΠ΅Π½ΠΈΠ΅ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠΈ xneur Π²ΡΠ·Π²Π°Π»ΠΎ Ρ ΠΌΠ΅Π½Ρ ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΠ½Π½ΡΠ΅ ΡΡΡΠ°Π΄Π°Π½ΠΈΡ Π² ΠΏΠΎΡΠ»Π΅Π΄Π½ΠΈΠ΅ ΠΏΠΎΠ»Π³ΠΎΠ΄Π° (Ρ ΠΏΠΎΡΠ²Π»Π΅Π½ΠΈΠ΅ΠΌ OpenSUSE 15.1 Π½Π° ΠΌΠΎΠΈΡ Π΄Π΅ΡΠΊΡΠΎΠΏΠ°Ρ : ΠΏΡΠΈ Π²ΠΊΠ»ΡΡΡΠ½Π½ΠΎΠΌ xneur ΠΎΠΊΠ½Π° ΡΠ΅ΡΡΡΡ ΡΠΎΠΊΡΡ ΠΈ Π·Π°Π±Π°Π²Π½ΠΎ ΠΌΠ΅ΡΡΠ°ΡΡ Π² ΡΠ°ΠΊΡ Π²Π²ΠΎΠ΄Π° Ρ ΠΊΠ»Π°Π²ΠΈΠ°ΡΡΡΡ).
Β«Π, Π±Π»ΠΈΠ½, ΠΎΠΏΡΡΡ Π½Π΅ Π² ΡΠΎΠΉ ΡΠ°ΡΠΊΠ»Π°Π΄ΠΊΠ΅ Π½Π°ΡΠ°Π» Π½Π°Π±ΠΈΡΠ°ΡΡΒ» β Π² ΠΌΠΎΠ΅ΠΉ ΡΠ°Π±ΠΎΡΠ΅ Π²ΡΡΡΠ΅ΡΠ°Π΅ΡΡΡ Π΄ΠΎ Π½Π΅ΠΏΡΠΈΠ»ΠΈΡΠΈΡ ΡΠ°ΡΡΠΎ. Π ΠΏΠΎΠ·ΠΈΡΠΈΠ²Π° Π½Π΅ Π΄ΠΎΠ±Π°Π²Π»ΡΠ΅Ρ.
Π ΡΠΎ ΠΆΠ΅ Π²ΡΠ΅ΠΌΡ, Ρ (ΠΊΠ°ΠΊ ΠΈΠ½ΠΆΠ΅Π½Π΅Ρ-ΠΊΠΎΠ½ΡΡΡΡΠΊΡΠΎΡ) ΠΌΠΎΠ³Ρ Π΄ΠΎΡΡΠ°ΡΠΎΡΠ½ΠΎ ΡΡΠ½ΠΎ ΡΡΠΎΡΠΌΡΠ»ΠΈΡΠΎΠ²Π°ΡΡ ΡΠ΅Π³ΠΎ Ρ
ΠΎΡΡ. Π Ρ
ΠΎΡΠ΅Π» Ρ (ΡΠ½Π°ΡΠ°Π»Π° ΠΎΡ 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 ΠΈ ΠΏΡΠ΅Π²ΡΠ°ΡΠΈΡ ΠΏΡΠΈ Π·Π°ΠΏΡΡΠΊΠ΅.
ΠΠ°ΡΠ°Π½ΠΎΠΈΠΊΠΈ (Ρ Π½Π΅ ΠΈΡΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅) ΠΌΠΎΠ³ΡΡ ΠΊΠ»ΠΎΠ½ΠΈΡΠΎΠ²Π°ΡΡ ΠΈΠ·
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 ΠΌΠ΅Π½Ρ Β«Π½Π΅ Π²Π΄ΠΎΡ
Π½ΠΎΠ²ΠΈΠ»Β», Π·Π° ΠΎΡΠΏΡΠ°Π²Π½ΡΡ ΡΠΎΡΠΊΡ Π²Π·ΡΠ»
ΠΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ "/dev/input/" ΠΈΠΌΠ΅Π΅Ρ ΠΊΠ°ΠΊ ΡΠ²ΠΎΠΈ ΠΏΠ»ΡΡΡ (Π²ΡΡ Π²ΠΈΠ΄Π½ΠΎ Π² Ρ.Ρ. Π·Π°ΠΆΠ°ΡΡΡ ΠΊΠ»Π°Π²ΠΈΡΡ Ρ Π°Π²ΡΠΎΠΏΠΎΠ²ΡΠΎΡΠΎΠΌ), ΡΠ°ΠΊ ΠΈ ΠΌΠΈΠ½ΡΡΡ. ΠΠΈΠ½ΡΡΡ ΡΠ°ΠΊΠΈΠ΅:
- ΠΠ²ΡΠΎΠΏΠΎΠ²ΡΠΎΡ (ΡΠΎΠ±ΡΡΠΈΡ Ρ ΠΊΠΎΠ΄ΠΎΠΌ Β«2Β») Π½Π΅ ΠΊΠΎΡΡΠ΅Π»ΠΈΡΡΠ΅Ρ Ρ ΠΏΠΎΠ²ΡΠΎΡΠΎΠΌ Ρ ΠΈΠΊΡΠ°Ρ .
- ΠΠ΅ Π²ΠΈΠ΄Π½ΠΎ Π²Π²ΠΎΠ΄Π° ΡΠ΅ΡΠ΅Π· ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΡ X11 (ΡΠ°ΠΊ Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ VNC ΡΠ°Π±ΠΎΡΠ°Π΅Ρ).
- ΠΡΠΆΠ΅Π½ ΡΡΡ.
Π‘ Π΄ΡΡΠ³ΠΎΠΉ ΡΡΠΎΡΠΎΠ½Ρ, ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΠ΄ΠΏΠΈΡΡΠ²Π°ΡΡΡΡ Π½Π° ΡΠΎΠ±ΡΡΠΈΡ X ΡΠ΅ΡΠ΅Π· Β«XSelectExtensionEvent()Β». ΠΠΎΠ΄ΡΠΌΠΎΡΡΠ΅ΡΡ ΠΌΠΎΠΆΠ½ΠΎ Π²
ΠΡΠ²ΠΎΠ΄ Β«ΠΎΠ±ΡΠ°ΡΠ½ΠΎΒ» ΠΏΠΎΠΊΠ° ΡΠ΄Π΅Π»Π°Π½ ΡΠ΅ΡΠ΅Π· ΠΏΡΠΈΠΊΡΡΡΠΈΠ²Π°Π½ΠΈΠ΅ Π²ΠΈΡΡΡΠ°Π»ΡΠ½ΠΎΠΉ ΠΊΠ»Π°Π²ΠΈΠ°ΡΡΡΡ. Π‘ΠΏΠ°ΡΠΈΠ±ΠΎ Π°Π²ΡΠΎΡΡ keybd_event, Π½ΠΎ ΡΠ°ΠΌ ΡΠ»ΠΈΡΠΊΠΎΠΌ Π²ΡΡΠΎΠΊΠΎΡΡΠΎΠ²Π½Π΅Π²Π°Ρ Π°Π±ΡΡΡΠ°ΠΊΡΠΈΡ ΠΈ Π΄Π°Π»ΡΡΠ΅ ΠΏΡΠΈΠ΄ΡΡΡΡ ΠΏΠ΅ΡΠ΅Π΄Π΅Π»ΡΠ²Π°ΡΡ. Π£ ΠΌΠ΅Π½Ρ, Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, ΠΏΡΠ°Π²Π°Ρ Win-ΠΊΠ»Π°Π²ΠΈΡΠ° 3-ΠΉ ΡΡΠ΄ Π²ΡΠ±ΠΈΡΠ°Π΅Ρ. Π ΠΎΠ±ΡΠ°ΡΠ½ΠΎ ΡΡΠ°Π½ΡΠ»ΠΈΡΡΠ΅ΡΡΡ ΡΠΎΠ»ΡΠΊΠΎ Π»Π΅Π²Π°Ρ Win.
ΠΠ·Π²Π΅ΡΡΠ½ΡΠ΅ ΠΎΡΠΈΠ±ΠΊΠΈ
- ΠΠΈΡΠ΅Π³ΠΎ Π½Π΅ Π·Π½Π°Π΅ΠΌ ΠΏΡΠΎ Β«ΠΊΠΎΠΌΠΏΠΎΠ·ΠΈΡΠ½ΡΠΉΒ» Π²Π²ΠΎΠ΄ (ΠΏΡΠΈΠΌΠ΅Ρ: Β½). ΠΡΡΠΌΠΎ ΡΠ΅ΠΉΡΠ°Ρ ΠΎΠ½ΠΎ Π½Π΅ Π½ΡΠΆΠ½ΠΎ.
- ΠΠ΅Π²Π΅ΡΠ½ΠΎ Π²ΠΎΡΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΠΌ ΠΏΡΠ°Π²ΡΡ Win. Π ΠΌΠΎΡΠΌ ΡΠ»ΡΡΠ°Π΅ Π»ΠΎΠΌΠ°Π΅Ρ ΡΠ°ΡΡΡΠ°Π½ΠΎΠ²ΠΊΡ Π°ΠΊΡΠ΅ΜΠ½ΡΠΎΠ².
- ΠΠ΅Ρ Π²Π½ΡΡΠ½ΠΎΠ³ΠΎ ΡΠ°Π·Π±ΠΎΡΠ° Π²Π²ΠΎΠ΄Π°. ΠΠΌΠ΅ΡΡΠΎ ΡΡΠΎΠ³ΠΎ β Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ ΡΡΠ½ΠΊΡΠΈΠΉ: Compare(), CtrlSequence(), RepeatSequence(), SpaceSequence(). Π‘ΠΏΠ°ΡΠΈΠ±ΠΎ
nsmcan Π·Π° Π²Π½ΠΈΠΌΠ°ΡΠ΅Π»ΡΠ½ΠΎΡΡΡ: ΠΈΡΠΏΡΠ°Π²ΠΈΠ» Π² ΠΊΠΎΠ΄Π΅ ΠΈ Π·Π΄Π΅ΡΡ. Π‘ ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΠ½Π½ΠΎΠΉ Π²Π΅ΡΠΎΡΡΠ½ΠΎΡΡΡΡ ΠΌΠΎΠΆΠ½ΠΎ ΠΎΡΡ Π²Π°ΡΠΈΡΡ Π±Π°Π³ΠΈ ΠΏΡΠΈ Π·Π°ΠΌΠ΅Π½Π΅.
Π ΡΡΠΎΠΌ ΠΌΠ΅ΡΡΠ΅ Ρ Π½Π΅ Π·Π½Π°Ρ Β«ΠΊΠ°ΠΊ Π½Π°Π΄ΠΎΒ» ΠΈ Π±ΡΠ΄Ρ ΡΠ°Π΄ Π»ΡΠ±ΡΠΌ ΠΏΡΠ΅Π΄Π»ΠΎΠΆΠ΅Π½ΠΈΡΠΌ. - (Π ΡΠΆΠ°Ρ) ΠΊΠΎΠ½ΠΊΡΡΠ΅Π½ΡΠ½ΠΎΠ΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΊΠ°Π½Π°Π»ΠΎΠ² (keyboardEvents, miceEvents).
ΠΠ°ΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅
ΠΠΎΠ΄ β ΠΏΡΠΎΡΡΠ΅ΠΉΡΠΈΠΉ ΠΏΡΠΎΡΠ΅Π΄ΡΡΠ½ΡΠΉ. Π ΡΡΠΏ ΠΊΠ°ΠΊ Ρ. Π’Π°ΠΊ ΡΡΠΎ, ΡΠ΅ΡΡ ΡΠ΅Π±Ρ Π½Π°Π΄Π΅ΠΆΠ΄ΠΎΠΉ ΡΡΠΎ Π΄ΠΎΠΏΠΈΡΠ°ΡΡ ΠΆΠ΅Π»Π°Π΅ΠΌΠΎΠ΅ ΡΠΌΠΎΠΆΠ΅Ρ ΠΏΡΠ°ΠΊΡΠΈΡΠ΅ΡΠΊΠΈ Π»ΡΠ±ΠΎΠΉ ΡΠ΅Ρ Π½Π°ΡΡ. Π Π΄Π°Π½Π½ΠΎΠ΅ ΠΈΠ·Π΄Π΅Π»ΠΈΠ΅ Π±Π»Π°Π³ΠΎΠ΄Π°ΡΡ ΡΡΠΎΠΌΡ Π½Π΅ ΡΠ³ΠΈΠ½Π΅Ρ Π±Π΅Π· ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠΈ ΠΏΠΎΠ΄ΠΎΠ±Π½ΠΎ Π±ΠΎΠ»ΡΡΠΈΠ½ΡΡΠ²Ρ just-for-fun.
Π£Π΄Π°ΡΠΈ!
ΠΡΡΠΎΡΠ½ΠΈΠΊ: habr.com