あまつぶ

11.25【IOLLEvent.h】

 前回書いた、キー配列変更の続き。
  iJectやDoubleCommandのソースには、0x40000とか0x100000などの謎の定数が使われているのだが、これらはいったいなにものなんだろう。コントロールキーやコマンドキーが押されているかどうかをあらわすフラグなのだろうと思うが、どこかでまとめて定義されているのではないだろうか。
 前回、Drawinのソースをダウンロードしてきたと書いたが、そこに入っていたソースを見てみると、NX_KEYDOWNなどの定数が使われているのに気がついた。お、これは、ひょっとするとiJectで使われている「10」というのに対応するのではないか? と、プロジェクトに登録されているソース内を検索してみると、IOLLEvent.hというファイルで定義されていた。周りには、0x40000などもNX_CONTROLMASKなどとして定義されている。おお、これっぽい!
 ここにあるということは、きっと、どこかのフレームワークに入っているに違いない。ファイル名で検索をかけてみると、/System/Library/Frameworks/IOKit.framework/Headers/hidsystem/と、/System/Library/Frameworks/Kernel.framework/Headers/IOKit/hidsystem/に存在した。これらのどちらかをインクルードしてやれば、0x40000などというわかりにくい形ではなく、NX_CONTROLMASKという比較的わかりやすい形でソースを書くことができるはず。
 早速、iJectのソースに「#include <IOKit/hidsystem/IOLLEvent.h>」という1行を追加し、定数を、上記のものに置き換えてみた。ここまでは、あっさり成功。やったね。

 さて、いよいよ、fnキー→ctrlキーの置き換えに挑戦だ。DoubleCommandのenter→commandの置き換えに部分を読むと、commandキーが押されたかどうかというのは、イベントコード12(NX_FLAGSCHANGED)のイベントが届いて、かつ((flags & NX_COMMANDMASK) != 0)かどうかによって判断できるらしい。ということは、fnが押された時は、NX_FLAGSCHANGEDイベントが届き、かつ、((flags & NX_SECONDARYFNMASK) != 0)になっているのに違いない(当然、押されているキーコードは63なのだろう)。このイベントが届いた時、キーコードおよびflagsを変更してもとのルーチンに戻してやれば、きっと、いけるはず。
 と、思ったのだが、これがなぜかうまくいかない。マウスボタンとの組み合わせで押されていた場合(コンテクストメニューの表示とか)には置き換わってくれているのだが、他のキーとの組み合わせではうまくいかず。他のキーと組み合わせられると、fnとして働いてしまうのだ。fnが特殊なのかと思い、ctrl→optionも試してみたが結果は同じ。enter→commandがあのコードでうまくいくならこの方法で実現できそうなものだが、まだなにか勘違いがあるのだろうか。

 Phut(on OS X)のごみ箱へのドラッグの件は、あっさり成功。Xでは、kUserDomainを使うということでよさそうな感じだ。
 次のバージョンでは、ダイアログ関係のリソースのNib化、および初期設定ファイルのXML化を実施する予定。そこまでできたらとりあえずの正式版かな。あとは、Xでしかできないようなこと(半透明ウィンドウとか?(笑))を徐々に追加していこうかななどと思っている。

 他のソフトは、特に大きな変化はなし。ごたくのX対応版(Carbon Mach-O)を作りかけたくらいかな。ゲームのメインルーチンがイベントを無視して作っているので、このあたりは大幅な変更が必要になりそうな感じ。また、画面イメージもXにあわせて変更するつもりなので、しばらくかかりそうかな。


November 11, 2001 ↑ November index → December 18, 2001