では実際にプログラムを書いてみましょう。最初に必要なのはインクルード ファイルの宣言です。Motif関連の.hファイルはインクルードファイル用ディ レクトリのXmというサブディレクトリにあることになっています。標準的には /usr/includeですが、システムによっては別の所にインストールされているか もしれません。例えば/usr/local/X11R5/inclu deとなっているかも知れませ ん。このときはccの-Iオプションでそのディレクトリを指定してください。そ の上で本文では、
#include <Xm/Xm.h>
#include <Xm/BulletinB.h>
#include <Xm/PushB.h>
次にやることはXt Intrinsicsの初期化です。
main( argc, argv )
int argc;
char **argv;
{
Widget toplevel;
XtAppContext app_context;
toplevel = XtAppInitialize( &app_context, "Sample1", NULL, 0, &argc, argv,
NULL, NULL, 0 );
これでトップレベルになるシェルウィジェットが出来ました。この下に次々に 子ウィジェットを作ってゆけばよいことになります。
Widget bulletinboard, pushbutton;
bulletinboard = XmCreateBulletinBoard( toplevel, "bulletinB", NULL, 0 );
XtManageChild( bulletinboard );
pushbutton = XmCreatePushButton( bulletinboard, "pushB", NULL, 0 );
XtManageChild( pushbutton );
ボタンが押されたら終わるようにしましょう。
void quitCB( w, clientdata, calldata )
Widget w;
XtPointer clientdata;
XmPushButtonCallbackStruct *calldata;
{
exit( 0 );
}
この関数をプッシュボタンのコールバックに割り付けます。XmPushButtonクラ スはXmNact ivateCallbackリソースを持っています。
XtAddCallback( pushbutton, XmNactivateCallback, quitCB, NULL );
まだ表示はされません。表示しましょう。
XtRealizeWidget( toplevel );
最後にイベント処理の無限ループに入ります。
XtAppMainLoop( app_context );
基本的な流れはXt Intrinsicsで見てきたものそのものです。
これでプログラムは出来ました。コンパイルリンクして走らせましょう。メ イクファイルは次のもののようなはずです。
XMDIR = /usr/local/X11R5
XMINCFLAGS = -I$(XMDIR)/include
XMLIBFLAGS = -L$(XMDIR)/lib -lXm -lXt -X11
xmdemo: xmdemo.o
cc -o xmdemo xmdemo.o $(XMLIBFLAGS)
xmdemo.o: xmdemo.c
cc -c $(XMINCFLAGS) xmdemo.c