ืื ืœื•ื’ื™ ื—ื“ืฉ ืฉืœ Punto Switcher ืขื‘ื•ืจ ืœื™ื ื•ืงืก: xswitcher

ืกื™ื•ื ื”ืชืžื™ื›ื” ื‘-xneur ื’ืจื ืœื™ ืกื‘ืœ ืžืกื•ื™ื ื‘ืžื”ืœืš ืฉืฉืช ื”ื—ื•ื“ืฉื™ื ื”ืื—ืจื•ื ื™ื. (ืขื ื”ื•ืคืขืชื• ืฉืœ OpenSUSE 15.1 ื‘ืžื—ืฉื‘ื™ื ืฉื•ืœื—ื ื™ื™ื ืฉืœื™: ื›ืืฉืจ xneur ืžื•ืคืขืœืช, ื—ืœื•ื ื•ืช ืžืื‘ื“ื™ื ืžื™ืงื•ื“ ื•ืžืจืฆื“ื™ื ืžืฆื—ื™ืงื™ื ื‘ื–ืžืŸ ืขื ืงืœื˜ ืžืงืœื“ืช).

"ืื•ื™, ืœืขื–ืื–ืœ, ืฉื•ื‘ ื”ืชื—ืœืชื™ ืœื”ืงืœื™ื“ ื‘ืคืจื™ืกื” ื”ืœื ื ื›ื•ื ื”" - ื–ื” ืงื•ืจื” ืœืขืชื™ื ืงืจื•ื‘ื•ืช ื‘ืฆื•ืจื” ืžื’ื•ื ื” ื‘ืขื‘ื•ื“ื” ืฉืœื™. ื•ื–ื” ืœื ืžื•ืกื™ืฃ ืฉื•ื ื“ื‘ืจ ื—ื™ื•ื‘ื™.

ืื ืœื•ื’ื™ ื—ื“ืฉ ืฉืœ Punto Switcher ืขื‘ื•ืจ ืœื™ื ื•ืงืก: xswitcher
ื™ื—ื“ ืขื ื–ืืช, ืื ื™ (ื›ืžื”ื ื“ืก ืขื™ืฆื•ื‘) ื™ื›ื•ืœ ืœื ืกื— ื‘ืฆื•ืจื” ื“ื™ ื‘ืจื•ืจื” ืžื” ืื ื™ ืจื•ืฆื”. ืื‘ืœ ืจืฆื™ืชื™ (ืงื•ื“ื ื›ืœ ืž-Punto Switcher, ื•ืื—ืจ ื›ืš, ื”ื•ื“ื•ืช ืœ-Windows Vista, ืกื•ืฃ ืกื•ืฃ ืœืขื‘ื•ืจ ืœืœื™ื ื•ืงืก, ืž-xneur) ื‘ื“ื™ื•ืง ื“ื‘ืจ ืื—ื“. ืœืื—ืจ ืฉื”ื‘ื ื• ืฉื”ื–ื‘ืœ ืขืœ ื”ืžืกืš ื ืžืฆื ื‘ืคืจื™ืกื” ืฉื’ื•ื™ื” (ื‘ื“ืจืš ื›ืœืœ ื–ื” ืงื•ืจื” ื‘ืกื•ืฃ ื”ืงืœื“ืช ืžื™ืœื” ื—ื“ืฉื”), ืจืงืข ืขืœ "ื”ืฉื”ื”/ื”ืคืกืงื”". ื•ืงื‘ืœ ืืช ืžื” ืฉื”ื“ืคืกืช.

ื ื›ื•ืŸ ืœืขื›ืฉื™ื•, ืœืžื•ืฆืจ ื™ืฉ ืืช ื”ื™ื—ืก ื”ืื•ืคื˜ื™ืžืœื™ (ืžื ืงื•ื“ืช ืžื‘ื˜ื™) ืคื•ื ืงืฆื™ื•ื ืœื™ื•ืช/ืžื•ืจื›ื‘ื•ืช. ื”ื’ื™ืข ื”ื–ืžืŸ ืœืฉืชืฃ.

TL.DR

ื™ื”ื™ื• ื›ืœ ืžื™ื ื™ ืคืจื˜ื™ื ื˜ื›ื ื™ื™ื ื‘ื”ืžืฉืš, ืื– ืงื•ื“ื ื›ืœ - ืงื™ืฉื•ืจ "ืœื’ืขืช" ืœื—ืกืจื™ ืกื‘ืœื ื•ืช.

ื ื›ื•ืŸ ืœืขื›ืฉื™ื•, ื”ื”ืชื ื”ื’ื•ืช ื”ื‘ืื” ืžืงื•ื“ื“ืช ื‘ืฆื•ืจื” ืงืฉื™ื—ื”:

  • "ื”ืฉื”ื”/ื”ืคืกืงื”": ื”ืขื‘ืจื” ืœืื—ื•ืจ ืฉืœ ื”ืžื™ืœื” ื”ืื—ืจื•ื ื”, ืžื—ืœื™ืคื” ืืช ื”ืคืจื™ืกื” ื‘ื—ืœื•ืŸ ื”ืคืขื™ืœ (ื‘ื™ืŸ 0 ืœ-1) ื•ืžื—ื™ื•ื’ ืฉื•ื‘.
  • "Ctrl ืฉืžืืœื™ ื‘ืœื™ ื›ืœื•ื": ืžื—ืœื™ืฃ ืืช ื”ืคืจื™ืกื” ื‘ื—ืœื•ืŸ ื”ืคืขื™ืœ (ื‘ื™ืŸ 0 ืœ-1).
  • "Shift ืฉืžืืœื” ื‘ืœื™ ื›ืœื•ื": ืžืคืขื™ืœ ืคืจื™ืกื” ืžืก' 0 ื‘ื—ืœื•ืŸ ื”ืคืขื™ืœ.
  • "ื”ื–ื–ื” ื™ืžื™ื ื” ื‘ืœื™ ื›ืœื•ื": ืžืคืขื™ืœ ืคืจื™ืกื” ืžืก' 1 ื‘ื—ืœื•ืŸ ื”ืคืขื™ืœ.

ืžืขื›ืฉื™ื• ืื ื™ ืžืชื›ื ืŸ ืœื”ืชืื™ื ืื™ืฉื™ืช ืืช ื”ื”ืชื ื”ื’ื•ืช. ื‘ืœื™ ืคื™ื“ื‘ืง, ื–ื” ืœื ืžืขื ื™ื™ืŸ (ื‘ื›ืœ ืžืงืจื” ืื ื™ ื‘ืกื“ืจ ืขื ื–ื”). ืื ื™ ืžืืžื™ืŸ ืฉื‘ื”ืื‘ืจื” ื™ื”ื™ื” ืื—ื•ื– ืžืกืคื™ืง ืžื”ืงื”ืœ ืขื ื‘ืขื™ื•ืช ื“ื•ืžื•ืช.

ื .ื‘. ื›ื™ ื‘ื’ืจืกื” ื”ื ื•ื›ื—ื™ืช, ื”-keylogger ืžืฆื•ืจืฃ ืœ-"/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 ืฉื ื™ื•ืช ืžืขื‘ื“ ืœื™ื•ื, โ‰ˆ12 MB ื‘-RSS).

ืคืจื˜ื™ื

ืขื›ืฉื™ื• - ื”ืคืจื˜ื™ื.

ื”ืžืื’ืจ ื›ื•ืœื• ื”ื•ืงื“ืฉ ื‘ืžืงื•ืจ ืœืคืจื•ื™ืงื˜ ื—ื™ื™ืช ื”ืžื—ืžื“ ืฉืœื™, ื•ืื ื™ ืขืฆืœืŸ ืžื›ื“ื™ ืœื”ืชื—ื™ืœ ืขื•ื“ ืื—ื“. ืื– ื”ื›ืœ ื ืขืจื (ืจืง ื‘ืชื™ืงื™ื•ืช) ื•ืžื›ื•ืกื” ืขืœ ื™ื“ื™ AGPL ("ืคื˜ื ื˜ ื”ืคื•ืš").

ืงื•ื“ ื”-xswitcher ื›ืชื•ื‘ ื‘ื’ื•ืœืื ื’, ืขื ื”ื›ืœืœื•ืช ืžื™ื ื™ืžืœื™ื•ืช ืฉืœ C. ื”ื”ื ื—ื” ื”ื™ื ืฉื’ื™ืฉื” ื–ื• ืชื‘ื™ื ืœืคื—ื•ืช ืžืืžืฅ (ืขื“ ื›ื”). ืชื•ืš ืฉืžื™ืจื” ืขืœ ื”ื™ื›ื•ืœืช ืœื—ื‘ืจ ืืช ืžื” ืฉื—ืกืจ ื‘ืืžืฆืขื•ืช cgo.

ื”ื˜ืงืกื˜ ืžื›ื™ืœ ื”ืขืจื•ืช ืžื”ื™ื›ืŸ ื”ื•ื ื”ื•ืฉืืœ ื•ืžื“ื•ืข. ื›ื™ ืงื•ื“ xneur "ืœื ืขื•ืจืจ ื‘ื™ ื”ืฉืจืื”", ืœืงื—ืชื™ ืื•ืชื• ื›ื ืงื•ื“ืช ื”ืชื—ืœื” loloswitcher.

ืœืฉื™ืžื•ืฉ ื‘-"/dev/input/" ื™ืฉ ื’ื ื™ืชืจื•ื ื•ืช (ื”ื›ืœ ื’ืœื•ื™, ื›ื•ืœืœ ืžืงืฉ ื”ื—ื–ืจื” ื”ืื•ื˜ื•ืžื˜ื™ืช ืœื—ื•ืฅ) ื•ื’ื ื—ืกืจื•ื ื•ืช. ื”ื—ืกืจื•ื ื•ืช ื”ื:

  • ื—ื–ืจื” ืื•ื˜ื•ืžื˜ื™ืช (ืื™ืจื•ืขื™ื ืขื ืงื•ื“ "2") ืื™ื ื• ืžืชืื ืขื ื—ื–ืจื” ืขื x.
  • ืงืœื˜ ื“ืจืš ืžืžืฉืงื™ X11 ืื™ื ื• ื’ืœื•ื™ (ื›ืš ืขื•ื‘ื“ VNC, ืœืžืฉืœ).
  • ืฆืจื™ืš ืฉื•ืจืฉ.

ืžืฆื“ ืฉื ื™, ืืคืฉืจ ืœื”ื™ืจืฉื ืœืื™ืจื•ืขื™ X ื“ืจืš "XSelectExtensionEvent()". ืืชื” ื™ื›ื•ืœ ืœื”ืฆื™ืฅ ืงื•ื“ xinput. ืœื ืžืฆืืชื™ ืžืฉื”ื• ื›ื–ื” ื‘ืฉื‘ื™ืœ ืœืœื›ืช, ื•ื”ื™ื™ืฉื•ื ื”ื’ืก ืœืงื— ืžื™ื“ ืžืื” ืฉื•ืจื•ืช ืฉืœ ืงื•ื“ C. ืฉื™ืžื• ืืช ื–ื” ื‘ืฆื“ ืœืขืช ืขืชื”.

ื”ืคืœื˜ ื”"ื”ืคื•ืš" ืžืชื‘ืฆืข ื›ืขืช ื‘ืืžืฆืขื•ืช ื”ื‘ืจื’ื” ืฉืœ ื”ืžืงืœื“ืช ื”ื•ื•ื™ืจื˜ื•ืืœื™ืช. ืชื•ื“ื” ืœืžื—ื‘ืจ ืฉืœ keybd_event, ืื‘ืœ ื”ื”ืคืฉื˜ื” ืฉื ื”ื™ื ื‘ืจืžื” ื’ื‘ื•ื”ื” ืžื“ื™ ื•ื™ื”ื™ื” ืฆื•ืจืš ืœื‘ืฆืข ืื•ืชื” ืžื—ื“ืฉ. ืœื“ื•ื’ืžื”, ืื ื™ ืžืฉืชืžืฉ ื‘ืžืงืฉ Win ื”ื™ืžื ื™ ื›ื“ื™ ืœื‘ื—ื•ืจ ืืช ื”ืฉื•ืจื” ื”ืฉืœื™ืฉื™ืช. ื•ืจืง ื”-Win ื”ืฉืžืืœื™ ืžื•ืขื‘ืจ ื‘ื—ื–ืจื”.

ื‘ืื’ื™ื ื™ื“ื•ืขื™ื

  • ืื™ื ื ื• ื™ื•ื“ืขื™ื ื“ื‘ืจ ืขืœ ืงืœื˜ "ืžืจื•ื›ื‘" (ื“ื•ื’ืžื”: ยฝ). ื–ื” ืœื ื ื—ื•ืฅ ื›ืจื’ืข.
  • ืื ื—ื ื• ืžืฉื—ืงื™ื ืืช ื”-Win ื”ื ื›ื•ืŸ ื‘ืฆื•ืจื” ืฉื’ื•ื™ื”. ื‘ืžืงืจื” ืฉืœื™, ื–ื” ืฉื•ื‘ืจ ืืช ื”ื“ื’ืฉ.
  • ืื™ืŸ ื ื™ืชื•ื— ืงืœื˜ ื‘ืจื•ืจ. ื‘ืžืงื•ื ื–ืืช, ื™ืฉื ืŸ ืžืกืคืจ ืคื•ื ืงืฆื™ื•ืช: Compare(), CtrlSequence(), RepeatSequence(), SpaceSequence(). ืชื•ื“ื” nsmcan ืœื˜ื™ืคื•ืœืš: ืชื™ืงื ื• ืืช ื–ื” ื‘ืงื•ื“ ื•ื›ืืŸ. ืขื ื”ืกืชื‘ืจื•ืช ืžืกื•ื™ืžืช, ืืชื” ื™ื›ื•ืœ ืœืชืคื•ืก ื‘ืื’ื™ื ื‘ืขืช ื”ื—ืœืคื”.
    ื‘ืฉืœื‘ ื–ื” ืื ื™ ืœื ื™ื•ื“ืข "ืื™ืš ืœืขืฉื•ืช" ื•ืืฉืžื— ืœื›ืœ ื”ืฆืขื”.
  • (ืื•ื™ ืืœื•ื”ื™ื) ืฉื™ืžื•ืฉ ืชื—ืจื•ืชื™ ื‘ืขืจื•ืฆื™ื (keyboardEvents, miceEvents).

ืžืกืงื ื”

ื”ืงื•ื“ ื”ื•ื ื”ืคืจื•ืฆื“ื•ืจื” ื”ืคืฉื•ื˜ื” ื‘ื™ื•ืชืจ. ื•ื˜ื™ืคืฉ ื›ืžื•ื ื™. ืœื›ืŸ, ืื ื™ ืžื—ืžื™ื ืœืขืฆืžื™ ื‘ืชืงื•ื•ื” ืฉื›ืžืขื˜ ื›ืœ ื˜ื›ื ืื™ ื™ื•ื›ืœ ืœื”ืฉืœื™ื ืืช ืžื” ืฉื”ื•ื ืจื•ืฆื”. ื•ื‘ื–ื›ื•ืช ื–ื”, ื”ืžื•ืฆืจ ื”ื–ื” ืœื ื™ื’ื•ื•ืข ืœืœื ืชืžื™ื›ื”, ื›ืžื• ืจื•ื‘ ืจืง ื‘ืฉื‘ื™ืœ ื”ื›ื™ืฃ.

ืžื–ืœ ื˜ื•ื‘!

ืžืงื•ืจ: www.habr.com

ื”ื•ืกืคืช ืชื’ื•ื‘ื”