synergy 는 네트워크를 통해 KVM 스위치 역할을 하는 키보드,마우스,클립보드 공유프로그램이다.
공개소프트웨어이며 아주 안정적으로 작동하고,
*nix, OSX, ms-windows 세가지의 OS에서 cross-platform으로 작동한다.
다만 현재 배포되는 버전은 한글키코드 처리에 버그가 있고, 제대로 지원하지 않는다.
이에 패치를 만들고 컴파일된 버전을 만들었다.
다만 capslock, Scrlock, Numlock 이 켜져있을때는 한글조합이 깨진다.
IME메소드를 보낼때 END메세지를 보내는 문제인것 같은데 좀 더 찾아봐야겠다.
소스코드 : http://synergy2.sourceforge.net/
patch 내용에 대한 설명 보기
diff -ur synergy-1.3.1/lib/platform/CMSWindowsKeyState.cpp synergy-1.3.1-hangul/lib/platform/CMSWindowsKeyState.cpp
--- synergy-1.3.1/lib/platform/CMSWindowsKeyState.cpp 2006-04-03 04:16:39.000000000 +0900
+++ synergy-1.3.1-hangul/lib/platform/CMSWindowsKeyState.cpp 2008-02-20 13:42:05.000000000 +0900
@@ -56,11 +56,16 @@
/* 0x012 */ { kKeyAlt_L }, // VK_MENU
/* 0x013 */ { kKeyPause }, // VK_PAUSE
/* 0x014 */ { kKeyCapsLock }, // VK_CAPITAL
- /* 0x015 */ { kKeyNone }, // VK_KANA
- /* 0x016 */ { kKeyNone }, // VK_HANGUL
+/**
+ * VK_HANGUL is not 0x016 but 0x015.
+ * http://msdn2.microsoft.com/en-us/library/ms645540.aspx
+ *
+ * */
+ /* 0x015 */ { kKeyHangul }, // VK_KANA, VK_HANGUL
+ /* 0x016 */ { kKeyNone }, // undefined
/* 0x017 */ { kKeyNone }, // VK_JUNJA
/* 0x018 */ { kKeyNone }, // VK_FINAL
- /* 0x019 */ { kKeyZenkaku }, // VK_KANJI
+ /* 0x019 */ { kKeyHanja }, // VK_KANJI,VK_HANJA
/* 0x01a */ { kKeyNone }, // undefined
/* 0x01b */ { kKeyEscape }, // VK_ESCAPE
/* 0x01c */ { kKeyHenkan }, // VK_CONVERT
@@ -313,11 +318,11 @@
/* 0x112 */ { kKeyAlt_R }, // VK_MENU
/* 0x113 */ { kKeyNone }, // VK_PAUSE
/* 0x114 */ { kKeyNone }, // VK_CAPITAL
- /* 0x115 */ { kKeyNone }, // VK_KANA
- /* 0x116 */ { kKeyNone }, // VK_HANGUL
+ /* 0x115 */ { kKeyHangul }, // VK_KANA , VK_HANGUL
+ /* 0x116 */ { kKeyNone }, // undefined
/* 0x117 */ { kKeyNone }, // VK_JUNJA
/* 0x118 */ { kKeyNone }, // VK_FINAL
- /* 0x119 */ { kKeyNone }, // VK_KANJI
+ /* 0x119 */ { kKeyHanja }, // VK_KANJI, VK_HANJA
/* 0x11a */ { kKeyNone }, // undefined
/* 0x11b */ { kKeyNone }, // VK_ESCAPE
/* 0x11c */ { kKeyNone }, // VK_CONVERT
diff -ur synergy-1.3.1/lib/synergy/KeyTypes.cpp synergy-1.3.1-hangul/lib/synergy/KeyTypes.cpp
--- synergy-1.3.1/lib/synergy/KeyTypes.cpp 2006-02-13 09:40:43.000000000 +0900
+++ synergy-1.3.1-hangul/lib/synergy/KeyTypes.cpp 2008-02-20 13:13:27.000000000 +0900
@@ -154,6 +154,8 @@
{ "WWWSearch", kKeyWWWSearch },
{ "WWWStop", kKeyWWWStop },
{ "Zenkaku", kKeyZenkaku },
+ { "Hangul", kKeyHangul },
+ { "Hanja", kKeyHanja },
{ "Space", 0x0020 },
{ "Exclaim", 0x0021 },
{ "DoubleQuote", 0x0022 },
diff -ur synergy-1.3.1/lib/synergy/KeyTypes.h synergy-1.3.1-hangul/lib/synergy/KeyTypes.h
--- synergy-1.3.1/lib/synergy/KeyTypes.h 2006-02-21 04:14:55.000000000 +0900
+++ synergy-1.3.1-hangul/lib/synergy/KeyTypes.h 2008-02-20 13:32:53.000000000 +0900
@@ -105,6 +105,8 @@
static const KeyID kKeyEscape = 0xEF1B;
static const KeyID kKeyHenkan = 0xEF23; /* Start/Stop Conversion */
static const KeyID kKeyZenkaku = 0xEF2A; /* Zenkaku/Hankaku */
+static const KeyID kKeyHangul = 0xEF31; /* Hangul */
+static const KeyID kKeyHanja = 0xEF34; /* Hangul-Hanja */
static const KeyID kKeyDelete = 0xEFFF; /* Delete, rubout */
// cursor control
lib/platform/MSWindowsKeystate.cpp
VK_HANGUL의 키코드가 잘못들어가 있다. 0x016으로 되어있는데
http://msdn2.microsoft.com/en-us/library/ms645540.aspx 를 참고하면 사실은 0x015 이다.
VK_HANJA도 생략되어있으며 이 키코드는 0x019이다.
그리고 무슨 이유에서인지 0x115와 0x119에 한글키코드를 넣는 부분이 더 있고
빌드후 큰 차이는 없었지만 모두 정의해줬다.
여기에 세팅하는 것은 시너지에서 정의한 가상키코드값과
VK_* 을 매핑하는 것이다.
kKey* 은 lib/synergy/KeyTypes.h 에서 정의한다.
lib/synergy/KeyTypes.cpp
에서는 logging에 사용되는 Key이름을 매핑한다.
lib/synergy/KeyTypes.h
이 부분이 가장 중요한 부분이다.
windows클라이언트의 debug1 레벨에서 로그를 보니
ef31을 키보드에서 찾을수 없다고 했는데,
VK_HANGUL의 매핑을 찾을수 없다는 말인것 같다.
DEBUG1: recv key down id=0x0000ef31, mask=0x1000, button=0x00d2즉,
DEBUG1: mapKey ef31 (61233) with mask 1000, start state: 0000
DEBUG1: key ef31 is not on keyboard
한글키는 0x0000EF31
한자키는 0x0000EF34
가 찍혔다.
실제 우분투에서 xev로 키코드를 찍어본 결과 각각
0x0000FF31,
0x0000FF34
이다.
시너지는 호스트시스템에서 잡아낸 키코드를 베이스로 해서 가상키코드를 만든다음
각 플랫폼의 VK로 매핑하는 것이다.
이를 kKeyHangul , kKeyHanja에 담아서
lib/platform/MSWindowsKeystate.cpp에서
각각 0x015,0x016 과 0x115,0x116에 짝을 지어주면 다음과 같이 진행된다.
- 리눅스에서 한글키를 누르면 0xFF31을 시너지가 받아서
- 마스크를 씌워 0xEF31로 가상키코드로 만들고
- 0xEF31를 클라이언트에게 보낸다.
- 0xEF31을 받은 윈도우클라이언트는
- 그에 매핑되어있는 0x015(VK_HANGUL)로 키보드메세지를 만들어
- 메세지큐에 보내어서 키보드이벤트를 발생시킨다.








synergy_1.3.1_hangul_patch_sng2nara.diff
Synergy_1.3.1_korean.zip