続 キー入力

Hamigaki 0.41リリース準備が整ったので、
http://d.hatena.ne.jp/y-hamigaki/20080310
の続きです。


キーの判定にGdkEventKey::hardware_keycodeを使うことにしたわけですが、
X11版では生の走査コードとなるので機種依存性が問題になります。
このため、XKeycodeToKeysym()でキーシンボルに変換して使用することにします。


さて、これまでDirectInputで行ってきたポーリングのようなインタフェースを実現するためには、

  1. 各キーの状態を保存するビット集合を用意する
  2. キーイベントに応じてビット集合を更新する
  3. ビット集合を検査してキーボードの状態を取得する

という手順を踏むわけですが、X11キーシンボルは32ビット整数なので、これでビット集合を作るのは時間かメモリを無駄に使います。
幸い、hardware_keycodeであれば8ビットで済むので、ビット集合はhardware_keycodeのまま扱い、問い合わせ時にXKeysymToKeycode()で変換して調べることにします。
Win32の場合はhardware_keycodeが仮想キーコードで8ビットなので、そのまま使います。


あとはWin32とX11でコードを共通化するため、共通のキーコードを用意する必要があります。
自分で新しいコードを振るのは何を基準に決めればよいのか分からないので、X11キーシンボルとWin32仮想キーコードに別名を付けるだけにしました。
これなら変換の手間も要らず、各システムのAPIに直接渡せて便利です。
key_codes.hpp
X11キーシンボルはちゃんと確認してないので、まだテキトーです。