では実際にプログラムを書いてみましょう。最初に必要なのはインクルード ファイルの宣言です。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