« SQLite の VFS | メイン | xp3_vfs »

2008年01月19日

日常の備忘録:: Synergy のソースを追う

    

Synergy の 日本語キーパッチ 版を使っていると次のような問題がある。
サーバー側で突然 ALT キーが押しっぱなしになる、かな入力が突然ローマ字入力になるという問題がある。(パッチ関係ないかも)
あと、クライアント側では、「を」が入力できない。( 「わ」と入れて変換すればなんとか入力出来る )
「-」と「?」も入力できない。( 「-」は位置が違う。「?」は「はてな」と入れて変換すれば出来る )
クライアント側で「無変換」キーが効かない。
この中で「かな入力が突然ローマ字入力になる」がかなりイライラする。
クライアント側の入力出来ない文字も気になるが、突然ローマ字入力になるのに比べればストレスは少ない。
と言うことで、ソースを追って改善できないか調べることにした。

まず、基本的には、グローバルフック ( システムフック ) を用いて、キーボードとマウス、クリップボード関係のメッセージをフックし、それをネットワーク経由で送っているようだ。
仕組み自体はそれほど複雑ではない。
ALTはローマ字入力はグローバルフック の実装が悪いのだろうか?

日本語キーパッチを入れると、サーバー側の IME を切り替えるようになるようだ。
元は、クライアント側だった気がする。
と言うか、クライアントの設定出して切り替えていたか。

かな打ちの時、「a」と「ち」では仮想キーコードが違う。
「を」は、「わ」のコードが得られるが、Shiftを押下しているので、それで判定しているようだ。
構造的には、抽象クラスがあって、その派生クラスとして、Windows と Linux、 MacOS X 用が実装されている。
基本構造はどれでも共通化されているようだ。

後、フック時の CSynergyHook.cpp 内の doKeyboardHookHandler で「VK_HANGUL」が特別扱いされている。
このキーは、「VK_KANA」と仮想キーコードが同じなので、「IME かなモード」になる。
処理は、ローレベルフックが使われている時はこのキーをスルーし、そうでない時は捨てるようだ。
VK_CAPITAL と VK_NUMLOCK、VK_SCROLL も同様にスルーするようになっているので、これがサーバー側で処理すると言うことかな?
が、この辺りを変更してみても意味なさげ。
NO_LOWLEVEL_HOOKS を 1 にしてビルドすると、変換モードが変わる問題は発生しなくなった。
でも、クライアント側でいろいろと問題が出て、まともにキーボー入力とかできない。
ローレベルフック関係で何かあるのだろうか?
ただ、Synergy を終了すると変換モードがおかしくても元に戻るので、サーバー側がおかしい気もする。
何らかのきっかけで、Synergy の内部状態がおかしくなって、キーコードに変な変換をかけているんじゃなかろうか。
そうだとすると追うのはかなり大変。
後、ローマ字入力になると思っていたけど、どうも全角英数字入力になっているようだ。
全角英数字入力は、「Shift + 無変換」で切り替わる。
うーん・・・
フックDLLだけではなく、サーバーやクライアントの構造、プロトコル周りも見ないと辛いかなぁ。
そうなると、かなり面倒。
で、とりあえず、 NO_GRAB_KEYBOARD を 1 にしてビルドし、キーボードの共有を止めた。
クライアント側で入力できないのは少し不便だけど、だいたいはマウスで事足りるのでそれでなんとかする。

フックDLLがキーボード入力を受け取って後、他のスレッドにキーコードなどをメッセージで送っていて、その後の処理はあまり見ていないけど、その辺りも見て全体構造と状態をどのように持っているかを把握しないと解決は難しいか・・・
ちょっと時間かかりそうなので、今はこれ以上手をつけられないな。
また後でやろう。


関連記事・続きの記事

Synergy の犯人はローレベルフック
やはり、クライアント側で入力できないのは辛いので、再び何とかしようとした。 で、... [続きを読む]


投稿者 Takenori : 2008年01月19日 17:21




comments powered by Disqus
Total : Today : Yesterday : なかのひと