2007 年 1 月 31 日 23 時 55 分

マウス入力の分析


このアーカイブは同期化されません。 mixi の日記が更新されても、このアーカイブには反映されません。


今日はマウス入力を解析してみよう。

実行し、いろいろマウスを動かしてみる。

jp.loafer.rfb.message.client.PointerEventMessage[mask=0,x=0,y=22]
jp.loafer.rfb.message.client.PointerEventMessage[mask=0,x=3,y=22]
jp.loafer.rfb.message.client.PointerEventMessage[mask=0,x=8,y=28]
jp.loafer.rfb.message.client.PointerEventMessage[mask=0,x=12,y=33]
jp.loafer.rfb.message.client.PointerEventMessage[mask=0,x=14,y=34]
jp.loafer.rfb.message.client.PointerEventMessage[mask=0,x=15,y=35]
jp.loafer.rfb.message.client.PointerEventMessage[mask=0,x=16,y=36]
jp.loafer.rfb.message.client.PointerEventMessage[mask=0,x=17,y=37]
jp.loafer.rfb.message.client.PointerEventMessage[mask=0,x=18,y=38]
jp.loafer.rfb.message.client.PointerEventMessage[mask=0,x=19,y=40]
jp.loafer.rfb.message.client.PointerEventMessage[mask=0,x=19,y=41]
jp.loafer.rfb.message.client.PointerEventMessage[mask=0,x=17,y=41]
jp.loafer.rfb.message.client.PointerEventMessage[mask=1,x=17,y=41]
jp.loafer.rfb.message.client.PointerEventMessage[mask=1,x=17,y=42]
jp.loafer.rfb.message.client.PointerEventMessage[mask=1,x=18,y=42]
jp.loafer.rfb.message.client.PointerEventMessage[mask=1,x=18,y=43]
jp.loafer.rfb.message.client.PointerEventMessage[mask=1,x=18,y=44]
jp.loafer.rfb.message.client.PointerEventMessage[mask=1,x=18,y=45]
jp.loafer.rfb.message.client.PointerEventMessage[mask=1,x=18,y=46]
jp.loafer.rfb.message.client.PointerEventMessage[mask=1,x=18,y=47]
jp.loafer.rfb.message.client.PointerEventMessage[mask=1,x=18,y=48]
jp.loafer.rfb.message.client.PointerEventMessage[mask=1,x=18,y=49]
jp.loafer.rfb.message.client.PointerEventMessage[mask=1,x=18,y=51]
jp.loafer.rfb.message.client.PointerEventMessage[mask=1,x=18,y=54]
jp.loafer.rfb.message.client.PointerEventMessage[mask=1,x=18,y=56]
jp.loafer.rfb.message.client.PointerEventMessage[mask=1,x=18,y=57]
jp.loafer.rfb.message.client.PointerEventMessage[mask=1,x=18,y=58]
jp.loafer.rfb.message.client.PointerEventMessage[mask=1,x=18,y=59]
jp.loafer.rfb.message.client.PointerEventMessage[mask=1,x=18,y=60]
jp.loafer.rfb.message.client.PointerEventMessage[mask=1,x=18,y=61]
jp.loafer.rfb.message.client.PointerEventMessage[mask=1,x=18,y=62]
jp.loafer.rfb.message.client.PointerEventMessage[mask=1,x=18,y=64]
jp.loafer.rfb.message.client.PointerEventMessage[mask=1,x=18,y=65]
jp.loafer.rfb.message.client.PointerEventMessage[mask=1,x=18,y=66]
jp.loafer.rfb.message.client.PointerEventMessage[mask=1,x=18,y=67]
jp.loafer.rfb.message.client.PointerEventMessage[mask=1,x=18,y=69]
jp.loafer.rfb.message.client.PointerEventMessage[mask=1,x=18,y=71]
jp.loafer.rfb.message.client.PointerEventMessage[mask=5,x=18,y=71]
jp.loafer.rfb.message.client.PointerEventMessage[mask=4,x=18,y=71]
jp.loafer.rfb.message.client.PointerEventMessage[mask=0,x=18,y=71]
jp.loafer.rfb.message.client.PointerEventMessage[mask=0,x=16,y=71]
jp.loafer.rfb.message.client.PointerEventMessage[mask=0,x=15,y=72]
jp.loafer.rfb.message.client.PointerEventMessage[mask=0,x=14,y=72]
jp.loafer.rfb.message.client.PointerEventMessage[mask=0,x=12,y=72]
jp.loafer.rfb.message.client.PointerEventMessage[mask=0,x=6,y=72]
jp.loafer.rfb.message.client.PointerEventMessage[mask=0,x=3,y=72]
jp.loafer.rfb.message.client.PointerEventMessage[mask=0,x=2,y=72]
jp.loafer.rfb.message.client.PointerEventMessage[mask=0,x=1,y=72]
jp.loafer.rfb.message.client.PointerEventMessage[mask=0,x=0,y=72]

RFB のポインタメッセージは、完全に低水準であり、
ポインティングデバイスの状態が変化した際に、
その時のデバイスの状態を送ってくるようである。

これは、デバイスの入力状況を常にポーリングするタイプの
VNC アプリを作るには適している。(ゲーム系とか)

しかし、メッセージを「変化」として捉えて、
高水準なイベントを生成するためには、
2 つのメッセージを比較する必要がある。
変化とは、座標の移動やボタンの押し離しのことだ。

いくつかピックアップして調べてみよう。

    PointerEventMessage[mask=0,x=0,y=22]
    PointerEventMessage[mask=0,x=3,y=22]

上は、ボタンは押されておらず、座標は 0,22 である。
下は、ボタンは押されておらず、座標は 3,22 である。
つまり、この間にポインタが移動したことを示しており、
mouseMoved 系イベントとして捉えることができる。

    PointerEventMessage[mask=0,x=17,y=41]
    PointerEventMessage[mask=1,x=17,y=41]

上は、ボタンは押されておらず、座標は 17,41 である。
下は、左ボタンが押されており、座標は 17,41 である。
つまり、この間に左ボタンが押されたことを示しており、
mousePressed 系イベントとして捉えることができる。

また、2 つのメッセージの間では、
ボタンの状態と座標が両方変化することも考えられる。
RFB の仕様上では特に制約されていないからだ。

また、デバイスの精度が高くて細かい通知ができるとしても、
ネットワークの速度が遅い等の問題で、
クライアントがメッセージの間引き制御を行う可能性がある。

そのため、クライアントがメッセージを送る頻度は不定で、
サーバはそのことを考慮しておく必要がある。



Copyright (c) 1994-2007 Project Loafer. All rights reserved.