以前書いた「
VNC で option キーが送れない」問題は、その後も解決出来ていない。2ch やアップルサポートコミュニティにも質問してみたが、回答 0件…。ウェブ上の情報も概ね解決には至っていない…。
そんな中、「OS X の画面共有は止めて、Vine Server という VNC サーバーを使うと良い」という様な情報が在ったので、試しに使ってみた所、少なくともモディファイヤキーに関してはマトモに動作してくれた。
パッケージは
testplant.com からダウンロード出来る。
ただし、例によってキーボードレイアウトが US になってしまうという問題が残った。
一応、内部的に US-Keylayout から JP-Keylayout への変換をしていてくれているので、ほとんどのキーは問題無く打てるのだが、一部のキーがおかしかった。
| 入力したキー |
入力される文字 |
| ˆ |
6 |
| ' |
" |
| = |
+ |
| @ |
2 |
| ` |
˜ |
| : |
; |
色々検索しているうちに
日本語キーボードパッチなるモノも見つかったが、いかんせんバージョンが解らないわ、古いわで役に立たなかった…。
結局、自力で改造してみる事にした。
「
Source Forge: Vine Server (OSXvnc)」->「
web-based CVS repository viewer」->「
Download GNU tarball」からソースがダウンロード出来る。
バージョンは「4.01」。
ライセンスは「GPLv2」。
早速、ダウンロードして、解凍して「OSXvnc.xcodeproj」を Xcode で開いて、ビルドしてみた。
環境は「OS X El Capitan 10.11.4」上の「Xcode 7.3」。
やはり古いソースなので最新の環境とは設定が合わないらしく「Update to recommended settings」と質問されたので、とりあえずお薦め設定にしてビルドしてみた。
一応ビルドには成功したものの、警告23個…。
早速、Windows 側から VNC で接続してみたが、「メッセージの長さが合わないよ。続ける?」みたいなメッセージが永遠と表示され、まともに使えなかった…。
結局、時間はかかったものの、この問題は解決出来た。
Vine Server(OSXvnc) の最終バージョン(4.01)は 32bit バイナリなのに、ビルド環境が 64bit なせいで、前述のお薦め設定により「Build Settings」->「Architectures」が「Standard Architectures (64-bit intel)(x86_64)」になってしまっていた。
これを「Universal (32/64-bit intel)(x86_64, i386) - S(ARCHS_STANDARD_32_64_BIT)」に変更してビルドし直した所、使えるバイナリが出来た。
さて、本番はここからなのだが…。
警告のほとんどは、キャストや型書式に関するものだったので、適当に修正した。
残る 3つは「'xxx' is deprecated: first deprecated in OS X 99.9」といったもの。
これは「'xxx' は OS X バージョン 99.9 で廃止されますよ。」という警告なので放っておくしかない…。
最適な移行方法も、警告抑制の仕方も解らないしなぁ…。
結局、「
XCodeでのwarning抑制方法」を参考に、警告抑制した。
後はおかしいキーを直すだけ…。
キーイベントの処理を探す為、ソースの中を「keyboard」等で検索し、あちこち眺めてみた所、「VNCServer.m」の「handleKeyboard」がそれらしいと解った。
多分、この関数の引数が入力キーで、この関数の中から呼ばれている「sendKeyEvent」関数への引数が出力キーっぽいので、「NSLog」を仕掛けて観察。その結果と、US-Keylayout での入力方法を突き合わせて、入力と出力のズレを整理した。
| 入力キー |
入力コード |
出力文字(誤) |
出力コード(誤) |
出力文字(正) |
出力コード(正) |
結果 |
| ˆ |
0x5E |
6 |
0x16 |
ˆ(6 + shift) |
0X16 + shift |
shift が不足 |
| ' |
0x27 + shift |
" |
0x27 + shift |
' |
0x27 |
shift が余分 |
| = |
0x3D + shift |
+ |
0x18 + shift |
= |
0x18 |
shift が余分 |
| @ |
0x40 |
2 |
0x13 |
@(2 + shift) |
0x13 + shift |
shift が不足 |
| ` |
0x60 + shift |
˜ |
0x32 + shift |
` |
0x32 |
shift が余分 |
| : |
0x3A |
; |
0x29 |
:(; + shift) |
20x29 + shift |
shift が不足 |
結果としては「shift」が余分か、足りないか、という事だった。
こういうのはテーブルがちょっとズレてるだけとか、簡単に治りそうなもんんだけどなぁ…。
キーの定義は「kbdptr.h」に在ったが、キーとモディファイヤキーの組み合わせをどう定義しているか解らなかった…。
結局、「sendKeyEvent」関数を呼び出す直前に、「sendKeyEvent」関数への引数へ対し「shift」を足したり、引いたりする処理をぶち込んじゃった…。
次に、マウスホイールでのスクロールが異常に遅かったので、「handleMouseButtons」関数でマウスホイールの移動距離を格納している「mouseWheelDistance」変数を 4倍する処理も入れた。
あとは、クリップボードが異常な挙動をする問題も在ったのだが、これは VNC クライアント側でクリップボードの共有を止めれば問題無くなった。クリップボード共有出来た方が便利なんだけど、仕方がない…。
残るは、ログイン、ログアウト関連が対応出来てない臭いけど…。
当分これで様子を見てみようと思う。
オープンソース万歳!!!!!