○ウィンドウの閉じるボタンが押された時の処理を書く
■ウィンドウシステムのプロパティの変更
プロパティを変更すると、閉じるボタンを押しても終了しなくなります
XtRealizeWidget や XtPopupの下に書く必要あり
Atom atom1,atom2;
atom1 = XInternAtom(XtDisplay(top), "WM_PROTOCOLS", False);
atom2 = XInternAtom(XtDisplay(top), "WM_DELETE_WINDOW", False);
XSetWMProtocols(XtDisplay(top),XtWindow(top), &atom2,1);
■閉じるボタンのイベントのコールバック関数の登録
XtAddEventHandler(top,NoEventMask,True,(XtEventHandler)CloseButton,NULL);//イベントのコールバック関数の登録
//ウィンドウの閉じるボタンが押された時の処理
void CloseButton( Widget w, caddr_t client_data, XEvent *event ){
if(event->type==ClientMessage){
//閉じるボタンを押されたイベントを識別
if ( event->xclient.message_type == atom1 && event->xclient.data.l[0] == atom2 ){
printf("close button click\n");
//XCloseDisplay(d);
//exit(0);
}
}
}
■ウィンドウの閉じるボタンが押されると close button click と出力されて終了しません
#include <X11/StringDefs.h>
#include <X11/Intrinsic.h>
#include <X11/Xaw/Form.h>
#include <X11/Xaw/Command.h>
Atom atom1,atom2;
//ボタンが押された時の動作
void Button1Callback( Widget w, XtPointer client, XtPointer called )
{
exit(0);
}
//ウィンドウの閉じるボタンが押された時の処理
void CloseButton( Widget w, caddr_t client_data, XEvent *event ){
if(event->type==ClientMessage){
//閉じるボタンを押されたイベントを識別
if ( event->xclient.message_type == atom1 && event->xclient.data.l[0] == atom2 ){
printf("close button click\n");
//XCloseDisplay(d);
//exit(0);
}
}
}
main( int argc, char **argv )
{
XtAppContext app_context;
Widget top, form;
top = XtVaAppInitialize( &app_context, "test", NULL, 0, &argc, argv, NULL,
//XtNwidth,500,
//XtNheight,500,
NULL);
form = XtVaCreateManagedWidget("form",formWidgetClass,top,NULL);
//ボタンの作成
Widget button1 = XtVaCreateManagedWidget("button1",//ウィジット名
commandWidgetClass,//ボタンクラスを指定
form,
//リソースの直接入力(どんどん追加できる)
XtNlabel,"END",//表示される文字
//XtNhorizDistance, 50,//開始位置
//XtNvertDistance,55,
XtNwidth,100,//幅と高さ
XtNheight,20,
XtNborderWidth,1,//境界線
//リソースここまで
NULL);
XtAddCallback(button1, XtNcallback,Button1Callback, NULL );//ボタンのコールバック関数を登録
XtRealizeWidget( top );
//ウィンドウシステムのプロパティの変更
atom1 = XInternAtom(XtDisplay(top), "WM_PROTOCOLS", False);
atom2 = XInternAtom(XtDisplay(top), "WM_DELETE_WINDOW", False);
XSetWMProtocols(XtDisplay(top),XtWindow(top), &atom2,1);
//閉じるボタンのイベント
XtAddEventHandler(top,NoEventMask,True,(XtEventHandler)CloseButton,NULL);//イベントのコールバック関数の登録
XtAppMainLoop( app_context );
}
▲トップページ
>
Linux と C