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

処理を書かないと、×ボタンを押すとアプリケーションが自動的に終了します
処理を書くと、アプリケーションの終了なども、自分で書かないといけません
イベントを書かないと、×を押しても、プログラムは終了しません。



■ウィンドウシステムのプロパティの変更

Atom atom1,atom2;
atom1 = XInternAtom(d, "WM_PROTOCOLS", False);
atom2 = XInternAtom(d, "WM_DELETE_WINDOW", False);
XSetWMProtocols(d, w, &atom2,1);

▼×ボタンを押された時のイベントを記述する

case ClientMessage:
	//閉じるボタンを押されたイベントを識別
	if ( event.xclient.message_type == atom1 && event.xclient.data.l[0] == atom2 ){
		//終了処理
		XCloseDisplay(d);
		exit(0);
	}
	break;




■×ボタンを押してもtestと出力して終了しないプログラム

#include<X11/Xlib.h>
#include<X11/Xutil.h>


//描画メソッド
void paint(Display*d,Window w,int screen,GC gc){
	Colormap    colormap; 
	XColor      near_color, true_color;
	//色の変更
	colormap = DefaultColormap( d, screen ); 
	XAllocNamedColor( d, colormap, "red", &near_color, &true_color ); 
	XSetForeground( d, gc, near_color.pixel );
	//塗りつぶした四角を描画
	XFillRectangle(d,w,gc,10,10,180,180);
	XFlush( d );
}

main(){
	Display	*d;
	Window	w;
	int screen;
	XSetWindowAttributes attr;
	GC gc;
	
	d = XOpenDisplay( NULL );//Xサーバーに接続する
	screen=DefaultScreen(d);
	//ウインドウの作成
	w = XCreateSimpleWindow( d, RootWindow(d,screen),
						0, 0, 200, 200,//ウインドウのサイズ
						1,BlackPixel(d,screen),//枠の設定
						WhitePixel(d,screen));//背景色の色番号

	//ウィンドウの内容を記憶
	attr.backing_store = WhenMapped;
	XChangeWindowAttributes( d, w, CWBackingStore, &attr); 

	//ウインドウ名の設定
	XStoreName(d, w, "test Window");
	XSetIconName(d, w, "test Window");
	
	//グラフィックコンテキストを取得
	gc = XCreateGC( d, RootWindow( d,screen ), 0, 0); 


	XEvent event;
	//イベントマスクを登録
	XSelectInput( d, w,ButtonPressMask | ExposureMask); 

	//ウィンドウシステムのプロパティの変更
	Atom atom1,atom2;
	atom1 = XInternAtom(d, "WM_PROTOCOLS", False);
	atom2 = XInternAtom(d, "WM_DELETE_WINDOW", False);
	XSetWMProtocols(d, w, &atom2,1);

	//マップして表示
	XMapWindow( d, w );
	XFlush( d );

	while(1){
		XNextEvent( d, &event );
		switch(event.type){
			case ButtonPress://画面上でマウスのボタンが押された時
				XDestroyWindow( d, w);//終了処理
				XCloseDisplay( d );
				exit(0);
			case Expose://再描画要求
				paint(d,w,screen,gc);//再描画
				break;
			case ClientMessage:
				//閉じるボタンを押されたイベントを識別
				if ( event.xclient.message_type == atom1 && event.xclient.data.l[0] == atom2 ){
					printf("test\n");
					//XCloseDisplay(d);
					//exit(0);
				}
			break;
			default:
				break;
		}
	}
}








▲トップページ > Linux と C