xneur ์ง์ ์ข ๋ฃ๋ก ์ธํด ์ง๋ XNUMX๊ฐ์ ๋์ ์ฝ๊ฐ์ ๊ณ ํต์ ๊ฒช์์ต๋๋ค. (๋ฐ์คํฌํ์ OpenSUSE 15.1์ด ๋ฑ์ฅํ๋ฉด์ xneur๋ฅผ ํ์ฑํํ๋ฉด ํค๋ณด๋ ์ ๋ ฅ์ ๋ง์ถฐ ์ฐฝ์ด ์ด์ ์ ์๊ณ ์ด์ํ๊ฒ ๊น๋ฐ์ ๋๋ค.).
"์, ์ ์ฅ, ๋ ์๋ชป๋ ๋ ์ด์์์ ์ ๋ ฅํ๊ธฐ ์์ํ์ด์." - ๋ด ์์ ์์๋ ์ด๋ฐ ์ผ์ด ์ธ์ค์ ์ผ๋ก ์์ฃผ ๋ฐ์ํฉ๋๋ค. ๊ทธ๋ฆฌ๊ณ ๊ทธ๊ฒ์ ๊ธ์ ์ ์ธ ์ด๋ค ๊ฒ๋ ์ถ๊ฐํ์ง ์์ต๋๋ค.
๋์์ ๋๋ (์ค๊ณ ์์ง๋์ด๋ก์) ๋ด๊ฐ ์ํ๋ ๊ฒ์ ์์ฃผ ๋ช
ํํ๊ฒ ๊ณต์ํํ ์ ์์ต๋๋ค. ํ์ง๋ง ์ ๋ ์ ํํ ํ ๊ฐ์ง๋ฅผ ์ํ์ต๋๋ค(์ฒ์์๋ Punto Switcher์์, ๊ทธ ๋ค์์๋ Windows Vista ๋๋ถ์ ๋ง์นจ๋ด xneur์์ Linux๋ก ์ ํ). ํ๋ฉด์ ์ฐ๋ ๊ธฐ๊ฐ ์๋ชป๋ ๋ ์ด์์์ ์๋ค๋ ๊ฒ์ ๊นจ๋ฌ์๋ค๋ฉด(์ด๊ฒ์ ์ผ๋ฐ์ ์ผ๋ก ์ ๋จ์ด๋ฅผ ์
๋ ฅํ ํ์ ๋ฐ์ํฉ๋๋ค) "์ผ์ ์ค์ง/์ค๋จ"์ ๋ฐ์ผ์ญ์์ค. ๊ทธ๋ฆฌ๊ณ ์ธ์ํ ๊ฒ์ ์ป์ผ์ธ์.
ํ์ฌ ์ด ์ ํ์ (๋ด ๊ด์ ์์) ์ต์ ์ ๊ธฐ๋ฅ/๋ณต์ก์ฑ ๋น์จ์ ๊ฐ๊ณ ์์ต๋๋ค. ์ด์ ๊ณต์ ํ ์๊ฐ์ ๋๋ค.
TL.DR
๋ชจ๋ ์ข
๋ฅ์ ๊ธฐ์ ์ ์ธ ์ธ๋ถ ์ฌํญ์ ๋์ค์ ๋์ฌ ๊ฒ์ด๋ฏ๋ก ๋จผ์ -
ํ์ฌ ๋ค์ ๋์์ด ํ๋์ฝ๋ฉ๋์ด ์์ต๋๋ค.
- "์ผ์ ์ค์ง/์ค๋จ": ๋ง์ง๋ง ๋จ์ด๋ฅผ ๋ค๋ก ์ด๋ํ๊ณ ํ์ฑ ์ฐฝ์ ๋ ์ด์์์ ์ ํํ๊ณ (0๊ณผ 1 ์ฌ์ด) ๋ค์ ์ ํ๋ฅผ ๊ฒ๋๋ค.
- "์๋ฌด๊ฒ๋ ์์ด ์ผ์ชฝ Ctrl": ํ์ฑ ์ฐฝ์ ๋ ์ด์์์ ์ ํํฉ๋๋ค(0๊ณผ 1 ์ฌ์ด).
- โ์๋ฌด๊ฒ๋ ์์ด ์ผ์ชฝ Shiftโ: ํ์ฑ ์ฐฝ์์ ๋ ์ด์์ ๋ฒํธ 0์ ์ผญ๋๋ค.
- โ์๋ฌด๊ฒ๋ ์์ด ์ค๋ฅธ์ชฝ Shiftโ: ํ์ฑ ์ฐฝ์์ ๋ ์ด์์ 1๋ฒ์ ์ผญ๋๋ค.
์ด์ ๋ถํฐ๋ ๋์์ ๋ง์ถค์ค์ ํ ๊ณํ์ ๋๋ค. ํผ๋๋ฐฑ์ด ์์ผ๋ฉด ์ฌ๋ฏธ๊ฐ ์์ต๋๋ค(์ด์จ๋ ๊ด์ฐฎ์ต๋๋ค). ๋๋ Habrรฉ์์ ๋น์ทํ ๋ฌธ์ ๋ฅผ ๊ฐ์ง ์ฒญ์ค์ ๋น์จ์ด ์ถฉ๋ถํ ๊ฒ์ด๋ผ๊ณ ๋ฏฟ์ต๋๋ค.
NB ์๋ํ๋ฉด ํ์ฌ ๋ฒ์ ์์๋ ํค๋ก๊ฑฐ๊ฐ "/dev/input/"์ ์ฐ๊ฒฐ๋์ด ์์ผ๋ฉฐ xswitcher๋ ๋ฃจํธ ๊ถํ์ผ๋ก ์คํ๋์ด์ผ ํฉ๋๋ค:
chown root:root xswitcher
chmod +xs xswitcher
์ฐธ๊ณ : suid๊ฐ ํฌํจ๋ ํ์ผ์ ์์ ์๋ ๋ฃจํธ์ฌ์ผ ํฉ๋๋ค. ์์ ์๊ฐ ๋๊ตฌ์ด๋ ์์ ์ 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 XNUMXMB).
์ธ๋ถ
์ด์ - ์ธ๋ถ ์ฌํญ.
์ ์ฒด ์ ์ฅ์๋ ์๋ ๋ด ์ ์ ๋๋ฌผ ํ๋ก์ ํธ ์ ์ฉ์ด์๊ณ ๋ค๋ฅธ ํ๋ก์ ํธ๋ฅผ ์์ํ๊ธฐ์๋ ๋๋ฌด ๊ฒ์ผ๋ฅด๋ค. ๊ทธ๋์ ๋ชจ๋ ๊ฒ์ด (ํด๋์๋ง) ์์ฌ ์๊ณ AGPL(โ์ญํนํโ)๋ก ๋ณดํธ๋ฉ๋๋ค.
xswitcher ์ฝ๋๋ C๋ฅผ ์ต์ํ์ผ๋ก ํฌํจํ๊ณ golang์ผ๋ก ์์ฑ๋์์ต๋๋ค. ์ด ์ ๊ทผ ๋ฐฉ์์ ์ฌ์ฉํ๋ฉด ์ต์ํ์ ๋ ธ๋ ฅ๋ง ๋ค์ธ๋ค๊ณ ๊ฐ์ ํฉ๋๋ค(์ง๊ธ๊น์ง). cgo๋ฅผ ์ฌ์ฉํ์ฌ ๋๋ฝ๋ ๋ถ๋ถ์ ์ฐ๊ฒฐํ๋ ๊ธฐ๋ฅ์ ์ ์งํ๋ฉด์.
ํ
์คํธ์๋ ๋น๋ฆฐ ๊ณณ๊ณผ ์ด์ ์ ๋ํ ์ค๋ช
์ด ํฌํจ๋์ด ์์ต๋๋ค. ์๋ํ๋ฉด xneur ์ฝ๋๋ "๋์๊ฒ ์๊ฐ์ ์ฃผ์ง ์์์ต๋๋ค", ๋๋ ๊ทธ๊ฒ์ ์ถ๋ฐ์ ์ผ๋ก ์ผ์์ต๋๋ค
"/dev/input/"์ ์ฌ์ฉํ๋ฉด ์ฅ์ (๋๋ฅธ ์๋ ๋ฐ๋ณต ํค๋ฅผ ํฌํจํ์ฌ ๋ชจ๋ ๊ฒ์ด ํ์๋จ)๊ณผ ๋จ์ ์ด ๋ชจ๋ ์์ต๋๋ค. ๋จ์ ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
- ์๋ ๋ฐ๋ณต(์ฝ๋ "2"๊ฐ ์๋ ์ด๋ฒคํธ)์ x์์ ๋ฐ๋ณต๊ณผ ์๊ด ๊ด๊ณ๊ฐ ์์ต๋๋ค.
- X11 ์ธํฐํ์ด์ค๋ฅผ ํตํ ์ ๋ ฅ์ ํ์๋์ง ์์ต๋๋ค(์๋ฅผ ๋ค์ด VNC๊ฐ ์๋ํ๋ ๋ฐฉ์).
- ๋ฃจํธ๊ฐ ํ์ํฉ๋๋ค.
๋ฐ๋ฉด์ "XSelectExtensionEvent()"๋ฅผ ํตํด X ์ด๋ฒคํธ๋ฅผ ๊ตฌ๋
ํ๋ ๊ฒ์ด ๊ฐ๋ฅํฉ๋๋ค. ์ฟ๋ณผ ์ ์๋ค
"์ญ๋ฐฉํฅ" ์ถ๋ ฅ์ ํ์ฌ ๊ฐ์ ํค๋ณด๋๋ฅผ ์กฐ์ด๋ ๋ฐฉ์์ผ๋ก ์ด๋ฃจ์ด์ง๋๋ค. keybd_event์ ์์ฑ์์๊ฒ ๊ฐ์ฌ๋๋ฆฝ๋๋ค. ๊ทธ๋ฌ๋ ์ถ์ํ ์์ค์ด ๋๋ฌด ๋์ ์ถ๊ฐ๋ก ๋ค์ ์ํํด์ผ ํฉ๋๋ค. ์๋ฅผ ๋ค์ด ์ค๋ฅธ์ชฝ Win ํค๋ฅผ ์ฌ์ฉํ์ฌ ์ธ ๋ฒ์งธ ํ์ ์ ํํฉ๋๋ค. ๊ทธ๋ฆฌ๊ณ ์ผ์ชฝ Win๋ง ๋ค์ ์ ์ก๋ฉ๋๋ค.
์๋ ค์ง ๋ฒ๊ทธ
- ์ฐ๋ฆฌ๋ "๋ณตํฉ" ์ ๋ ฅ(์: ยฝ)์ ๋ํด ์๋ฌด๊ฒ๋ ๋ชจ๋ฆ ๋๋ค. ์ง๊ธ์ ํ์ํ์ง ์์ต๋๋ค.
- ์ฐ๋ฆฌ๋ ์ฌ๋ฐ๋ฅธ ์น๋ฆฌ๋ฅผ ์๋ชปํ๊ณ ์์ต๋๋ค. ์ ๊ฒฝ์ฐ์๋ ๊ฐ์กฐ๊ฐ ๊นจ์ก์ต๋๋ค.
- ๋ช
ํํ ์
๋ ฅ ๊ตฌ๋ฌธ ๋ถ์์ด ์์ต๋๋ค. ๋์ Compare(), CtrlSequence(), RepeatSequence(), SpaceSequence()์ ๊ฐ์ ์ฌ๋ฌ ํจ์๊ฐ ์์ต๋๋ค. ๊ฐ์ฌ
nsmcan ์ฃผ์ ์ฌํญ: ์ฝ๋์ ์ฌ๊ธฐ์์ ์์ ํ์ต๋๋ค. ์ผ์ ํ๋ฅ ๋ก ๊ต์ฒด ์ ๋ฒ๊ทธ๋ฅผ ์ก์ ์ ์์ต๋๋ค.
ํ ์์ ์์๋ "๋ฐฉ๋ฒ"์ ์์ง ๋ชปํ๋ฏ๋ก ์ด๋ค ์ ์์ด๋ผ๋ ํ์ํฉ๋๋ค. - (์ค ๋ง์์ฌ) ์ฑ๋์ ๊ฒฝ์์ ์ฌ์ฉ(keyboardEvents, mouseEvents)
๊ฒฐ๋ก
์ฝ๋๋ ๊ฐ์ฅ ๊ฐ๋จํ ์ ์ฐจ์ ๋๋ค. ๊ทธ๋ฆฌ๊ณ ๋์ฒ๋ผ ๋ฉ์ฒญํด์. ๊ทธ๋์ ๋๋ ๊ฑฐ์ ๋ชจ๋ ๊ธฐ์ ์๊ฐ ์์ ์ด ์ํ๋ ๊ฒ์ ์์ฑํ ์ ์์ ๊ฒ์ด๋ผ๋ ํฌ๋ง์ ๊ฐ๊ณ ์์ต๋๋ค. ๋๋ถ์ ์ด ์ ํ์ ๋๋ถ๋ถ์ ์ฌ๋ฏธ์ฉ ์ ํ์ฒ๋ผ ์ง์ ์์ด๋ ์ฌ๋ผ์ง์ง ์์ต๋๋ค.
ํ์ด์ ๋น๋๋ค!
์ถ์ฒ : habr.com