ここでは、BeOSプログラミングのTipsを紹介しています。
Trackerのスクリプティング 2000.2.22BeOS標準のメールソフト「BeMail」は、TrackerのウィンドウからEmailファイルを開くと、その前後(上下)のファイルを順番に表示することができます。Queryのウィンドウでも同じことができることから、これはメッセージシステムによって実現されていると考えるのが妥当ですね。ということで、KEditにこの機能を実装すべく、Trackerのスクリプティングに挑戦してみました。その際に学んだことをつらつらと書いていきます。
まず、ウィンドウの特定には、ファイルを開く際のメッセージ「B_REFS_RECEIVED(註)」の付加情報を利用します。Messageの内容はこんな感じです。
BMessage: what = _RRC (0x5f525243, or 1599230531)
entry TrackerViewToken, type=MSNG, c=1, size=24,
entry refs, type=RREF, c=1, size= 0,
註)B_REFS_RECEIVEDは、BApplicationのRefsReceived()仮想関数に渡されるMessageオブジェクトの命令定数です。
「TrackerViewToken」という名前のMessengerが付加されています。この付加情報は、ファイルのダブルクリックまたはTracker上でファイルをアプリケーションにドラッグ&ドロップした場合にのみ付加されます。ファイルを右クリックした時に表示されるポップアップメニューから「Open With...」を実行してファイルを開いた場合や、LaunchPad等のアプリケーションを介して開いた場合は付加されません。MessageからMessengerを取り出すには、
//Messageをmsgとすると…
BMessneger aMessenger;
msg->FindMessenger("TrackerViewToken", 0, &aMessenger);
とするだけです。もちろんこのMessengerオブジェクトはMessageと共に消える運命なので、後ほどアプリケーション中で利用する場合はコピーを作って保存しておく必要があります。
//Messengerのコピー
BMessenger* aNewMessenger = new BMessenger(aMessenger);
さて、このMessengerが、Trackerの該当ウィンドウに対するMessengerとなるわけです。このMessengerは、該当ウィンドウが閉じられた場合は無効になるので、使用する前には必ず「IsValid()」を呼び出してメッセンジャーが使用可能かどうか確認しておきましょう。
次は、このメッセンジャーを使って、ウィンドウ内のファイルのEntryを取り出します。この場合、"Entry"に対し、B_GET_PROPERTYを送ります。帰ってきたメッセージには、"result"という名前のentry_ref構造体データが付加されています。
//Messenger (= aMessenger) の利用
//エラー処理は全て省略
BMessage aMessage, aReply;
type_code aType;
int32 aCount;
entry_ref aRef;
BEntry aEntry;
//Messageの組み立て
aMessage.what = B_GET_PROPERTY;
aMessage.AddSpecifier("Entry");
//Messageの送信と受信
aMessneger->SendMessage(&aMessage, &aReply);
//Entryの取り出し
aReply.GetInfo("result", &aType, &aCount);
aReply.FindEntry("result", 0, &aRef);
aEntry.SetTo(&aRef);
これで、ひとつ目のEntryを取り出せます。Entryの個数はaCount個なので、forループを利用すれば全てのEntryを簡単に取り出せます。
さて、次はファイルの選択です。選択には、"Selection"に対し、B_SET_PROPERTYを送ります。撰択するEntry情報は、"data"という名前でMessageに付加しておきます。
現在開いているファイルの隣のファイルのEntryを(entry_ref構造体)aRefとすると、コードは次の様になります。
//aRefはentry_ref構造体
BMessage aMessage;
aMessage.what = B_SET_PROPERTY;
aMessage.AddSpecifier("Selection");
aMessage.AddRef("data", &aRef);
aMessenger->SendMessage(&aMessage);
これで指定したファイル(エントリー)が強調表示されます。
Entryを得る方法や撰択範囲を指定する方法は複数用意されていますので、用途によって使い分けるとよいと思います。
以上、Trackerスクリプティングでした (^ ^;
(やっぱりたいしたことなかった…)