コールバック構造体
MINERVA superseeded IF/Prolog. Please see http://www.ifcomputer.co.jp/MINERVA for details.

We discontinued to sell IF/Prolog Dec 31. 2003. For current customers, we continue to provide professional support for IF/Prolog until Dec 31, 2008.

OSF/Motifではすべてのコールバックは、アプリケーションが最終的に受け付けるデータを含むデータ構造によって呼び出されます。データは、コールバックを引き起こす理由に依存する変数です。共通のコンポーネントは、定数名で指定されている理由とイベント構造体です。理由定数とwidgetクラスとの組み合わせが引き渡されるデータを決定し、イベント構造体はコールバックを引き起こす低レベル(Xlib)のイベントを含んでいます。

IF/PrologのOSF/Motifインタフェースでは、理由だけがアトムとして、また最後の引数としてCallbackに引き渡されます。理由は、標準的な理由を変換するコンバータによって文字列表現に変換されます。

コールバック構造体の別のコンポーネントは、特別な述語によって問い合わせを行わなければならず、要求された場合にのみProlog表現に変換されます。多くの場合、アプリケーションはコールバック構造体を問い合わせる必要はありません。それは、widgetから直接同一の情報を得ることができるからです。

xmGetCallbackComponents(?CallbackComponentList) xmGetCallbackComponent(?CallbackComponent)

現在コールバックのコールバック構造体から、指定されたコンポーネントを取り出します。

CallbackComponentListは、要素component(?Value)のリストです。 'component'は問い合わせるコンポーネントを指定し、Valueはコンポーネントの値に単一化されます。C構造体の要素名に対応するアトムは、コンポーネントの指定子として使用することができます。コンポーネント名があいまいに使用されている場合には、指定子はコンポーネント名と同一ではなくなります。たとえば名前'value'が整数とXmStringの両方に使われている場合、指定子は'value'と'valueString'になります。

この述語がコールバックから呼び出されない場合には、例外処理が引き起こされます。また現在のコールバックの構造体が、要求されたコンポーネントを含んでいない場合にも例外処理が生じます。このためアプリケーションは最初に理由をチェックし、それから正しいコンポーネントを決定しなければなりません。

特別なコンポーネントの指定子 'widget'は、コールバックのwidgetを問い合わせます。

コンポーネントの指定子がcallbackstructの場合には、Valueは単純変数ではありません。それは、CallbackComponentListのようなリストになります。

イベントコンポーネントも調べることができます。この場合には、アプリケーションは最初にeventTypeをチェックしなければなりません。正しいイベント構造体のコンポーネントは、それに依存します。Prologイベントコンポーネントの指定子は、'event'の後にCイベント構造体のコンポーネント名を続け、アンダースコアの代わりに大文字によって単語を区切ったものです。 (x --> eventX, in_out_detail --> eventInOutDetail)

正しいコールバック構造体のコンポーネント、および正しいイベント構造体のコンポーネント名については、索引の一覧表を参照して下さい。

?- [user].

| breakCallback(_,_,Reason) :- write(Reason), nl, break. | EOF

yes

?- xtAddCallback(pushButton, activateCallback, breakCallback, _).

yes ?- xtMainLoop.

< click to push button > activate [2] ?- xtGetCallbackComponents([ widget(Widget), reason(Reason), eventType(Type), eventButton(Button) ]).

Widget = pushButton Reason = activate Type = KeyPress Button = buttonX

yes ?-

list_expected CallbackComponentListは、リストでなければならない illegal_component_list_elememt CallbackComponentListの要素は、アリティ1の項でなければならない。 no_callback_struct_to_analyze コールバックから呼び出されなかったか、あるいはコールバックがコールバックの構造体をもっていなかった illegal_class_component 要求されたコンポーネントがこのコールバックの構造体に存在せず、呼び出し中のwidgetのコールバックの構造体のメンバでない illegal_reason_component 要求されたコンポーネントがこのコールバックの構造体に存在せず、この理由に対して有効でない illegal_callback_component 要求されたコールバックのコンポーネントがインタフェースに登録されていない


Darueber read on...