highlight.xcode

2016年4月27日水曜日

Vine Server(OSXvnc)



以前書いた「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 クライアント側でクリップボードの共有を止めれば問題無くなった。クリップボード共有出来た方が便利なんだけど、仕方がない…。

残るは、ログイン、ログアウト関連が対応出来てない臭いけど…。
当分これで様子を見てみようと思う。

オープンソース万歳!!!!!

0 件のコメント:

コメントを投稿