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
パッチ済みバイナリが欲しい人がいたら言ってください。