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.
Prologの引数リストをtoolkitの引数リストに変換する場合には、IFXtSetArgs()を使用して下さい。
この手続きはPrologのリストを第1引数とし、widgetを第2引数として呼び出されます。widgetがすでに存在している場合には、第3引数はNULLで第4引数はArgSetValuesになります。widgetが引数リストを使って生成される場合には、第2引数はその親で、第3引数はそのクラス、第4引数はArgCreateでなければなりません。
返される値は整数で、引数の数を表します。変換が失敗した場合には、-1になります。この場合、Prologに対する例外処理はすでに生成されているので、単に失敗して終了すればそれが起動されます。
変換の結果はグローバルな引数リストIFXtArgsに代入されます。
例題: XtCreateWidgetの実現のCパート
static int IFXtCreateWidget()
{
Widget NewWidget, Parent;
WidgetClass class;
char *resname, *class_name;
TERM pro_name;
unsigned int *counter;
extern int WidgetToProlog();
extern char *IFXtCvtError;
extern WidgetClass IFXtPCCvtWidgetClass();
if ( !XChk(IsVar(IFArg(1)) || IsAt(IFArg(1)),
"variable_or_atom_expected")
|| !XChk(IsVar(IFArg(2)) || IsAt(IFArg(2)),
"variable_or_atom_expected")
|| !XChk(IsAt(IFArg(3)), IF_EXC_atom_exp)
|| !XChk(IsWidget(IFArg(4),&Parent),IF_EXC_widget_exp)
|| !XChk(IsListOrNil(IFArg(5)), IF_EXC_list_exp))
return 0;
class = IFXtPCCvtWidgetClass( IFArg( 3), &counter);
if ( class == NULL)
EXCEPTION( "illegal_widget_class");
IFXtCvtError = NULL;
class_name = XtNewString( class->core_class.class_name);
class_name 0 = tolower( class_name 0 );
pro_name = IFCGetNewWidgetName( IFArg( 1), class_name,
counter);
XtFree( class_name);
if ( IFXtCvtError)
EXCEPTION( IFXtCvtError);
UnifyArg( 1, pro_name);
if ( !IsAt( IFArg( 2)))
EXCEPTION( IF_EXC_atom_exp);
resname = AtStr(IFArg(2));
if( IFXtSetArgs( IFArg(5), Parent, class, ArgCreate) < 0)
return 0;
NewWidget = XtCreateWidget( resname, class,
Parent, IFXtArgs, (Cardinal) IFXtnof_args);
IFXtFreeArgsAfterUsage();
/* I actually call this to register the new widget */
WidgetToProlog( NewWidget, pro_name);
return 1;
}
|