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)로 키보드메세지를 만들어
- 메세지큐에 보내어서 키보드이벤트를 발생시킨다.