xneur เชธเชชเซเชฐเซเชเชจเชพ เช เชเชคเชฅเซ เชฎเชจเซ เชเซเชฒเซเชฒเชพ เช เชฎเชนเชฟเชจเชพเชฎเชพเช เชฅเซเชกเซ เชคเชเชฒเซเชซ เชชเชกเซ เชเซ. (เชฎเชพเชฐเชพ เชกเซเชธเซเชเชเซเชชเซเชธ เชชเชฐ OpenSUSE 15.1 เชจเชพ เชเชเชฎเชจ เชธเชพเชฅเซ: xneur เชธเชเซเชทเชฎ เชธเชพเชฅเซ, เชตเชฟเชจเซเชกเซเช เชซเซเชเชธ เชเซเชฎเชพเชตเซ เชเซ เช เชจเซ เชเซเชฌเซเชฐเซเชก เชเชจเชชเซเช เชธเชพเชฅเซ เชธเชฎเชฏเชธเชฐ เชซเชจเซ เชซเซเชฒเชฟเชเชฐ).
"เชเชน, เชคเซ เชเชฐเซเชเชฐ, เชฎเซเช เชซเชฐเซเชฅเซ เชเซเชเชพ เชฒเซเชเชเชเชฎเชพเช เชเชพเชเชช เชเชฐเชตเชพเชจเซเช เชถเชฐเซ เชเชฐเซเชฏเซเช" - เชฎเชพเชฐเชพ เชเชพเชฐเซเชฏเชฎเชพเช เช เช เชถเชฟเชทเซเช เชฐเซเชคเซ เชตเชพเชฐเชเชตเชพเชฐ เชฅเชพเชฏ เชเซ. เช เชจเซ เชคเซ เชเชเชเชชเชฃ เชธเชเชพเชฐเชพเชคเซเชฎเช เชเชฎเซเชฐเชคเซเช เชจเชฅเซ.
เชคเซ เช เชธเชฎเชฏเซ, เชนเซเช (เชกเชฟเชเชพเชเชจ เชเชจเซเชเชฟเชจเชฟเชฏเชฐ เชคเชฐเซเชเซ) เชฎเชจเซ เชเซ เชเซเชเช เชเซ เชคเซ เชธเซเชชเชทเซเชเชชเชฃเซ เชเชกเซ เชถเชเซเช เชเซเช. เชชเชฐเชเชคเซ เชนเซเช เชเชเซเชเชคเซ เชนเชคเซ (เชชเชนเซเชฒเชพ เชชเซเชจเซเชเซ เชธเซเชตเชฟเชเชฐเชฅเซ, เช
เชจเซ เชชเชเซ, เชตเชฟเชจเซเชกเซเช เชตเชฟเชธเซเชเชพเชจเซ เชเชญเชพเชฐ, เชเซเชฒเซเชฒเซ xneurเชฎเชพเชเชฅเซ Linux เชชเชฐ เชธเซเชตเชฟเช เชเชฐเซเชจเซ) เชฌเชฐเชพเชฌเชฐ เชเช เชตเชธเซเชคเซ. เชธเซเชเซเชฐเซเชจ เชชเชฐเชจเซ เชเชเชฐเซ เชเซเชเชพ เชฒเซเชเชเชเชฎเชพเช เชเซ เชคเซ เชธเชฎเชเซเชฏเชพ เชชเชเซ (เช เชธเชพเชฎเชพเชจเซเชฏ เชฐเซเชคเซ เชจเชตเซ เชถเชฌเซเชฆ เชฒเชเชตเชพเชจเชพ เช
เชเชคเซ เชฅเชพเชฏ เชเซ), โเชฅเซเชญเซ/เชฌเซเชฐเซเชโ เชชเชฐ เชธเซเชเซเชฎเซเชช เชเชฐเซ. เช
เชจเซ เชคเชฎเซ เชเซ เชเชพเชชเซเชฏเซเช เชเซ เชคเซ เชฎเซเชณเชตเซ.
เช เชเซเชทเชฃเซ, เชเชคเซเชชเชพเชฆเชจเชฎเชพเช เชถเซเชฐเซเชทเซเช (เชฎเชพเชฐเชพ เชฆเซเชทเซเชเชฟเชเซเชฃเชฅเซ) เชเชพเชฐเซเชฏเชเซเชทเชฎเชคเชพ/เชเชเชฟเชฒเชคเชพ เชเซเชฃเซเชคเซเชคเชฐ เชเซ. เชถเซเชฐ เชเชฐเชตเชพเชจเซ เชธเชฎเชฏ เชเซ.
TL.DR
เชชเชเซเชฅเซ เชคเชฎเชพเชฎ เชชเซเชฐเชเชพเชฐเชจเซ เชคเชเชจเซเชเซ เชตเชฟเชเชคเซ เชนเชถเซ, เชคเซเชฅเซ เชชเซเชฐเชฅเชฎ -
เชนเชพเชฒเชฎเชพเช เชจเซเชเซเชจเซ เชตเชฐเซเชคเชฃเซเช เชนเชพเชฐเซเชกเชเซเชกเซเชก เชเซ:
- โเชฅเซเชญเซ/เชฌเซเชฐเซเชโ: เชเซเชฒเซเชฒเชพ เชถเชฌเซเชฆเชจเซ เชฌเซเชเชธเซเชชเซเชธ เชเชฐเซ เชเซ, เชธเชเซเชฐเชฟเชฏ เชตเชฟเชจเซเชกเซเชฎเชพเช เชฒเซเชเชเชเชจเซ เชธเซเชตเชฟเช เชเชฐเซ เชเซ (0 เช เชจเซ 1 เชตเชเซเชเซ) เช เชจเซ เชซเชฐเซเชฅเซ เชกเชพเชฏเชฒ เชเชฐเซ เชเซ.
- "เชเชเชเชชเชฃ เชตเชเชฐ เชกเชพเชฌเซเช Ctrl": เชธเชเซเชฐเชฟเชฏ เชตเชฟเชเชกเซเชฎเชพเช เชฒเซเชเชเชเชจเซ เชธเซเชตเชฟเช เชเชฐเซ เชเซ (0 เช เชจเซ 1 เชตเชเซเชเซ).
- โเชเชเชเชชเชฃ เชตเชฟเชจเชพ เชกเชพเชฌเซ เชถเชฟเชซเซเชโ: เชธเชเซเชฐเชฟเชฏ เชตเชฟเชเชกเซเชฎเชพเช เชฒเซเชเชเช เชจเชเชฌเชฐ 0 เชเชพเชฒเซ เชเชฐเซ เชเซ.
- โเชเชเชเชชเชฃ เชตเชฟเชจเชพ เชเชฎเชฃเซ เชฌเชพเชเซเชจเซ เชถเชฟเชซเซเชโ: เชธเชเซเชฐเชฟเชฏ เชตเชฟเชเชกเซเชฎเชพเช เชฒเซเชเชเช เชจเชเชฌเชฐ 1 เชเชพเชฒเซ เชเชฐเซ เชเซ.
เชนเชตเซเชฅเซ เชนเซเช เชตเชฐเซเชคเชจเชจเซ เชเชธเซเชเชฎเชพเชเช เชเชฐเชตเชพเชจเซ เชฏเซเชเชจเชพ เชเชกเซ เชฐเชนเซเชฏเซ เชเซเช. เชชเซเชฐเชคเชฟเชธเชพเชฆ เชตเชฟเชจเชพ, เชคเซ เชฐเชธเชชเซเชฐเชฆ เชจเชฅเซ (เชนเซเช เชเซเชเชชเชฃ เชฐเซเชคเซ เชคเซเชจเซ เชธเชพเชฅเซ เช เซเช เชเซเช). เชนเซเช เชฎเชพเชจเซเช เชเซเช เชเซ เชนเซเชฌเซเชฐเซ เชชเชฐ เชธเชฎเชพเชจ เชธเชฎเชธเซเชฏเชพเชเชตเชพเชณเชพ เชชเซเชฐเซเชเซเชทเชเซเชจเซ เชชเซเชฐเชคเซ เชเชเชพเชตเชพเชฐเซ เชนเชถเซ.
เชจเซ เชเชพเชฐเชฃ เชเซ เชตเชฐเซเชคเชฎเชพเชจ เชธเชเชธเซเชเชฐเชฃเชฎเชพเช, เชเซเชฒเซเชเชฐ "/dev/input/" เชธเชพเชฅเซ เชเซเชกเชพเชฏเซเชฒ เชเซ, xswitcher เชฐเซเช เช เชงเชฟเชเชพเชฐเซ เชธเชพเชฅเซ เชถเชฐเซ เชเชฐเชตเซเช เชเชตเชถเซเชฏเช เชเซ:
chown root:root xswitcher
chmod +xs xswitcher
เชฎเชนเซเชฐเชฌเชพเชจเซ เชเชฐเซเชจเซ เชจเซเชเชง เชเชฐเซ: 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 เชชเซเชฐเชคเชฟ เชฆเชฟเชตเชธ, RSS เชฎเชพเช โ12 MB).
เชตเชฟเชเชคเซ เชเซเช
เชนเชตเซ - เชตเชฟเชเชคเซ.
เชเชเซเช เชญเชเชกเชพเชฐ เชฎเซเชณเชฐเซเชชเซ เชฎเชพเชฐเชพ เชชเชพเชฒเชคเซ เชชเซเชฐเซเชเซเชเซเชเชจเซ เชธเชฎเชฐเซเชชเชฟเชค เชนเชคเซเช, เช เชจเซ เชนเซเช เชฌเซเชเซ เชเช เชถเชฐเซ เชเชฐเชตเชพเชฎเชพเช เชเซเชฌ เชเชณเชธเซ เชเซเช. เชคเซเชฅเซ, เชฆเชฐเซเช เชตเชธเซเชคเซเชจเซ เชขเชเชฒเซ เชเชฐเชตเชพเชฎเชพเช เชเชตเซ เชเซ (เชซเชเซเชค เชซเซเชฒเซเชกเชฐเชฎเชพเช) เช เชจเซ AGPL ("เชฐเชฟเชตเชฐเซเชธ เชชเซเชเชจเซเช") เชฆเซเชตเชพเชฐเชพ เชเชตเชฐเซ เชฒเซเชตเชพเชฎเชพเช เชเชตเซ เชเซ.
xswitcher เชเซเชก เชเซเชฒเชพเชเชเชฎเชพเช เชฒเชเชพเชฏเซเชฒเซ เชเซ, เชเซเชฎเชพเช C เชจเชพ เชจเซเชฏเซเชจเชคเชฎ เชธเชฎเชพเชตเซเชถ เชฅเชพเชฏ เชเซ. เชเชตเซเช เชฎเชพเชจเชตเชพเชฎเชพเช เชเชตเซ เชเซ เชเซ เช เช เชญเชฟเชเชฎ เชเชเชพเชฎเชพเช เชเชเชพ เชชเซเชฐเชฏเชคเซเชจเซเชฎเชพเช เชชเชฐเชฟเชฃเชฎเชถเซ (เช เชคเซเชฏเชพเชฐ เชธเซเชงเซ เชคเซ เชเซ). cgo เชจเซ เชเชชเชฏเซเช เชเชฐเซเชจเซ เชเซ เชเซเชเซ เชเซ เชคเซเชจเซ เชเชจเซเชเซเช เชเชฐเชตเชพเชจเซ เชเซเชทเชฎเชคเชพ เชเชพเชณเชตเซ เชฐเชพเชเชคเซ เชตเชเชคเซ.
เชเซเชเซเชธเซเชเชฎเชพเช เชคเซ เชเซเชฏเชพเชเชฅเซ เช
เชจเซ เชถเชพ เชฎเชพเชเซ เชฒเซเชตเชพเชฎเชพเช เชเชตเซเชฏเซเช เชนเชคเซเช เชคเซเชจเชพ เชชเชฐ เชเชฟเชชเซเชชเชฃเซเช เชเซ. เชเชพเชฐเชฃ เชเซ xneur เชเซเชก "เชฎเชจเซ เชชเซเชฐเซเชฐเชฃเชพ เชเชชเชคเซ เชจเชฅเซ", เชฎเซเช เชคเซเชจเซ เชชเซเชฐเชพเชฐเชเชญเชฟเช เชฌเชฟเชเชฆเซ เชคเชฐเซเชเซ เชฒเซเชงเซ
"/dev/input/" เชจเซ เชเชชเชฏเซเช เชเชฐเชตเชพเชฅเซ เชคเซเชจเชพ เชฌเชเชจเซ เชซเชพเชฏเชฆเชพ เชเซ (เชฌเชงเซเช เชฆเซเชเชพเชฏ เชเซ, เชฆเชฌเชพเชตเชตเชพเชฎเชพเช เชเชตเซเชฒ เชธเซเชตเชคเช เชชเซเชจเชฐเชพเชตเชฐเซเชคเชฟเชค เชเซ เชธเชนเชฟเชค) เช เชจเซ เชเซเชฐเชซเชพเชฏเชฆเชพ. เชเซเชฐเชซเชพเชฏเชฆเชพ เชเซ:
- เชธเซเชตเชคเช-เชชเซเชจเชฐเชพเชตเชฐเซเชคเชจ (เชเซเชก โ2โ เชธเชพเชฅเซเชจเซ เชเชเชจเชพเช) x เชธเชพเชฅเซ เชชเซเชจเชฐเชพเชตเชฐเซเชคเชจ เชธเชพเชฅเซ เชธเชเชฌเชเชงเชฟเชค เชจเชฅเซ.
- X11 เชเชจเซเชเชฐเชซเซเชธ เชฎเชพเชฐเชซเชคเซ เชเชจเชชเซเช เชฆเซเชถเซเชฏเชฎเชพเชจ เชจเชฅเซ (เชเชฆเชพเชนเชฐเชฃ เชคเชฐเซเชเซ, VNC เช เชฐเซเชคเซ เชเชพเชฐเซเชฏ เชเชฐเซ เชเซ).
- เชฐเซเชเชจเซ เชเชฐเซเชฐ เชเซ.
เชฌเซเชเซ เชฌเชพเชเซ, "XSelectExtensionEvent()" เชฆเซเชตเชพเชฐเชพ X เชเชตเซเชจเซเชเซเชธเชฎเชพเช เชธเชฌเซเชธเซเชเซเชฐเชพเชเชฌ เชเชฐเชตเซเช เชถเชเซเชฏ เชเซ. เชคเชฎเซ เชเซเช เชถเชเซ เชเซ
"เชฐเชฟเชตเชฐเซเชธ" เชเชเชเชชเซเช เชนเชพเชฒเชฎเชพเช เชตเชฐเซเชเซเชฏเซเช เชฒ เชเซเชฌเซเชฐเซเชกเชจเซ เชธเซเชเซเชฐเซ เชเชฐเซเชจเซ เชฌเชจเชพเชตเชตเชพเชฎเชพเช เชเชตเซ เชเซ. keybd_event เชจเชพ เชฒเซเชเชเชจเซ เชเชญเชพเชฐ, เชชเชฐเชเชคเซ เชเชฌเซเชธเซเชเซเชฐเซเชเซเชถเชจ เชเซเชฌ เช เชเชเซเช เชธเซเชคเชฐเชจเซเช เชเซ เช เชจเซ เชคเซเชจเซ เชเชเชณ เชซเชฐเซเชฅเซ เชเชฐเชตเซเช เชชเชกเชถเซ. เชเชฆเชพเชนเชฐเชฃ เชคเชฐเซเชเซ, เชนเซเช 3เชเซ เชชเชเชเซเชคเชฟ เชชเชธเชเชฆ เชเชฐเชตเชพ เชฎเชพเชเซ เชเชฎเชฃเซ เชตเชฟเชจ เชเซเชจเซ เชเชชเชฏเซเช เชเชฐเซเช เชเซเช. เช เชจเซ เชฎเชพเชคเซเชฐ เชกเชพเชฌเซ เชตเชฟเชจ เชชเชพเชเซ เชชเซเชฐเชธเชพเชฐเชฟเชค เชฅเชพเชฏ เชเซ.
เชเชพเชฃเซเชคเชพ เชฌเชเซเชธ
- เช เชฎเซ "เชธเชเชฏเซเชเซเชค" เชเชจเชชเซเช เชตเชฟเชถเซ เชเชเชเชชเชฃ เชเชพเชฃเชคเชพ เชจเชฅเซ (เชเชฆเชพเชนเชฐเชฃ: ยฝ). เช เชคเซเชฏเชพเชฐเซ เชคเซเชจเซ เชเชฐเซเชฐ เชจเชฅเซ.
- เช เชฎเซ เชธเชพเชเซ เชเซเชค เชเซเชเซ เชฐเซเชคเซ เชฐเชฎเซ เชฐเชนเซเชฏเชพ เชเซเช. เชฎเชพเชฐเชพ เชเชฟเชธเซเชธเชพเชฎเชพเช, เชคเซ เชญเชพเชฐเชจเซ เชคเซเชกเซ เชเซ.
- เชคเซเชฏเชพเช เชเซเช เชธเซเชชเชทเซเช เชเชจเชชเซเช เชชเชฆเชเซเชเซเชฆเชจ เชจเชฅเซ. เชคเซเชจเชพ เชฌเชฆเชฒเซ, เชคเซเชฏเชพเช เชเชฃเชพ เชเชพเชฐเซเชฏเซ เชเซ: Compare(), CtrlSequence(), RepeatSequence(), SpaceSequence(). ะกะฟะฐัะธะฑะพ
nsmcan เชคเชฎเชพเชฐเซ เชธเชเชญเชพเชณ เชฎเชพเชเซ: เชคเซเชจเซ เชเซเชกเชฎเชพเช เช เชจเซ เช เชนเซเช เชธเซเชงเชพเชฐเซเชฒ เชเซ. เชเซเชเซเชเชธ เชธเชเชญเชพเชตเชจเชพ เชธเชพเชฅเซ, เชฌเชฆเชฒเซ เชเชฐเชคเซ เชตเชเชคเซ เชคเชฎเซ เชญเซเชฒเซ เชชเชเชกเซ เชถเชเซ เชเซ.
เช เชฌเชฟเชเชฆเซเช เชนเซเช "เชเซเชตเซ เชฐเซเชคเซ" เชเชพเชฃเชคเซ เชจเชฅเซ เช เชจเซ เชเซเชเชชเชฃ เชธเซเชเชจเซเชจเซเช เชธเซเชตเชพเชเชค เชเชฐเซเชถ. - (เชเชน เชญเชเชตเชพเชจ) เชเซเชจเชฒเซเชจเซ เชธเซเชชเชฐเซเชงเชพเชคเซเชฎเช เชเชชเชฏเซเช (เชเซเชฌเซเชฐเซเชก เชเชตเซเชจเซเชเซเชธ, เชฎเชพเชเชธ เชเชตเซเชจเซเชเซเชธ).
เชจเชฟเชทเซเชเชฐเซเชท
เชเซเชก เชธเซเชฅเซ เชธเชฐเชณ เชชเซเชฐเชเซเชฐเชฟเชฏเชพเชเชค เชเซ. เช เชจเซ เชฎเชพเชฐเชพ เชเซเชตเชพ เชฎเซเชฐเซเช. เชคเซเชฅเซ, เชนเซเช เชฎเชพเชฐเซ เชเชพเชคเชจเซ เชเชตเซ เชเชถเชพ เชธเชพเชฅเซ เชเซเชถ เชเชฐเซเช เชเซเช เชเซ เชฒเชเชญเช เชเซเชเชชเชฃ เชเซเชเชจเชฟเชถเชฟเชฏเชจ เชคเซเชจเซ เชเซ เชเซเชเช เชเซ เชคเซ เชชเซเชฐเซเชฃ เชเชฐเชตเชพเชฎเชพเช เชธเชเซเชทเชฎ เชนเชถเซ. เช เชจเซ เชเชจเซ เชเชญเชพเชฐ, เช เชเชคเซเชชเชพเชฆเชจ เชธเชชเซเชฐเซเช เชตเชฟเชจเชพ เชจเชพเชถ เชชเชพเชฎเชถเซ เชจเชนเซเช, เชเซเชฎ เชเซ เชฎเซเชเชพเชญเชพเชเชจเซ เชฎเชเชพ เชฎเชพเชเซ.
เชธเชพเชฐเชพ เชจเชธเซเชฌ!
เชธเซเชฐเซเชธ: www.habr.com