Yet another JIS patch for OSXvnc 1.71 on Intel Mac (10.4)

Intel Mac の上で OSXvnc を動かしてるんだけれど、VNC client から接続したときの JIS キーボードからの入力に難儀してた。
Web で探して得られる情報では、標準だと US キーボード扱いになるから小島さんのパッチを当てろ、という話なんだけど、うちの場合はなんでか(Intel Mac だから?)入力が普通に JIS レイアウトとして扱われて、パッチを当てる必要はなかった。けれど一部のキー、具体的には + : @ ` = ^ あたりのキーを入れても別の文字が入力されて困ってたわけです。それで上のパッチをあててみると、なぜか US レイアウトの入力に逆変換されてしまうというおまけつき。

そんなんで、ものすごくアドホックなパッチ作ってみました。通常の OSXvnc で JIS レイアウトで入力できるんだけど、キーボードの右の方のキーが入力できなくて困っている人向け。
2006-07-01 くらいの日付の OSXvnc CVS コードに当たります。パッチを当てた後、Xcode でビルドできるのでできたやつを標準の OSXvnc の代わりに使ってください。パッチの機能を on/off するスイッチはありません。

Index: kbdptr.c
===================================================================
RCS file: /cvsroot/osxvnc/OSXvnc/OSXvnc-server/kbdptr.c,v
retrieving revision 1.8
diff -u -r1.8 kbdptr.c
--- kbdptr.c	19 Apr 2005 20:09:09 -0000	1.8
+++ kbdptr.c	1 Jul 2006 16:31:44 -0000
@@ -78,6 +86,48 @@
 
     rfbUndim();
 
+	//
+	
+	CGCharCode rkey = keyChar;
+	int modShift = 0;
+	switch (keyChar) {
+	case XK_at:
+		rkey = XK_2;
+		modShift = 1;
+		break;
+	case XK_colon:
+		rkey = XK_semicolon;
+		modShift = 1;
+		break;
+	case XK_asciicircum:
+		rkey = XK_6;
+		modShift = 1;
+		break;
+	case XK_equal:
+		rkey = XK_plus;
+		modShift = -1;
+		break;
+	case XK_grave:
+		rkey = XK_asciitilde;
+		modShift = -1;
+		break;
+	case XK_apostrophe:
+		rkey = XK_quotedbl;
+		modShift = -1;
+		break;
+	}
+
+	if (modShift > 0) {
+		CGPostKeyboardEvent(0, keyTable[XK_Shift_L], 65505);
+        CGPostKeyboardEvent(rkey, keyTable[(unsigned short)rkey], down);
+		CGPostKeyboardEvent(0, keyTable[XK_Shift_L], cl->modiferKeys[keyTable[XK_Shift_L]]);
+	}
+	else if (modShift < 0){
+		CGPostKeyboardEvent(0, keyTable[XK_Shift_L], 0);
+		CGPostKeyboardEvent(rkey, keyTable[(unsigned short)rkey], down);
+		CGPostKeyboardEvent(0, keyTable[XK_Shift_L], cl->modiferKeys[keyTable[XK_Shift_L]]);
+	}
+
     //rfbLog("Key Char:%c Key Code:%d Key Sym:%d\n", keyChar, keyCode, keySym);
     if (keyCode == 0xFFFF)
         rfbLog("Warning: Unable to determine Key Code for X Key Sym %d (0x%x)\n", (int)keySym, (int)keySym);
@@ -94,7 +144,7 @@
                 CGPostKeyboardEvent(0, keyTable[XK_Shift_L], (modsForKey & shiftKey));
         }
         
-        CGPostKeyboardEvent(keyChar, keyCode, down);
+		if (modShift==0) CGPostKeyboardEvent(keyChar, keyCode, down);
 
         if (down && pressModsForKeys) {
             // Return keys to previous state

パッチ済みバイナリが欲しい人がいたら言ってください。