○ウィンドウの閉じるボタンが押された時の処理を書く

■ウィンドウシステムのプロパティの変更
プロパティを変更すると、閉じるボタンを押しても終了しなくなります
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