○ウィンドウを画面中央に配置し最前面に持ってくる

■画面中央にウィンドウを配置

		//画面サイズ取得
		int dx = DisplayWidth(XtDisplay(top1),0);
		int dy = DisplayHeight(XtDisplay(top1), 0);

		// ウィンドウ位置、サイズ取得
		unsigned int x,y,width, height, border, depth;
		Window rwin;
		XGetGeometry(XtDisplay(top1),XtWindow(top1),&rwin,&x, &y, &width, &height, &border, &depth);
		//printf("x=%d y=%d width=%d height=%d border=%d depth=%d\n",x,y,width,height,border,depth);

		//ウィンドウの位置、サイズ設定
		XMoveResizeWindow(XtDisplay(top1),XtWindow(top1),(dx-width)/2,(dy-height-depth)/2,width,height);

■ウィンドウを最前面に持ってくる

		//ウィンドウを最前面に移動
		XRaiseWindow(XtDisplay(top1),XtWindow(top1));

■2つのウィンドウを中央に配置して、交互に前面に持ってきます
ウィンドウマネージャにより動かない場合あり

    




#include <X11/StringDefs.h>
#include <X11/Intrinsic.h>
#include <X11/Shell.h>
#include <X11/Xaw/Form.h>
#include <X11/Xaw/Command.h>

Widget top1,top2,form1,form2;
Widget label1,label2;

int flag=0;

//タイマーとして動作
void timer(XtAppContext app_context) 
{
	//ここにタイマーの処理内容を書く
	if(flag){
		//ウィンドウを最前面に移動
		XRaiseWindow(XtDisplay(top1),XtWindow(top1));
		flag=0;
	}else{
		//ウィンドウを最前面に移動
		XRaiseWindow(XtDisplay(top2),XtWindow(top2));
		flag=1;
	}

	//経過時間後に関数を呼び出す設定(ミリ秒)
	XtAppAddTimeOut(app_context, 500, (XtTimerCallbackProc)timer,app_context); 
}



main(int argc, char **argv)
{
	XtAppContext app_context;

	XtToolkitInitialize();//初期化
	app_context = XtCreateApplicationContext();
	Display *d = XtOpenDisplay(app_context, NULL, NULL, NULL, NULL, 0, &argc, argv);;
	//form1を作成
	{ 
		top1 = XtAppCreateShell("form1", "form1", applicationShellWidgetClass, d,NULL,0);
		form1 = XtVaCreateManagedWidget("form1",formWidgetClass,top1,
					XtNheight,200,
					XtNwidth, 200,
					NULL);
		XtRealizeWidget(top1);
		//画面サイズ取得
		int dx = DisplayWidth(XtDisplay(top1),0);
		int dy = DisplayHeight(XtDisplay(top1), 0);

		// ウィンドウ位置、サイズ取得
		unsigned int x,y,width, height, border, depth;
		Window rwin;
		XGetGeometry(XtDisplay(top1),XtWindow(top1),&rwin,&x, &y, &width, &height, &border, &depth);
		//printf("x=%d y=%d width=%d height=%d border=%d depth=%d\n",x,y,width,height,border,depth);

		//ウィンドウの位置、サイズ設定
		XMoveResizeWindow(XtDisplay(top1),XtWindow(top1),(dx-width)/2,(dy-height-depth)/2,width,height);
	}

	//form2を作成
	{
		top2 = XtAppCreateShell("form2", "form2", applicationShellWidgetClass, d,NULL,0);
		form2 = XtVaCreateManagedWidget("form2",formWidgetClass,top2,
					XtNheight,200,
					XtNwidth, 200,
					NULL);
		XtRealizeWidget(top2);
		//画面サイズ取得
		int dx = DisplayWidth(XtDisplay(top2),0);
		int dy = DisplayHeight(XtDisplay(top2), 0);

		// ウィンドウ位置、サイズ取得
		unsigned int x,y,width, height, border, depth;
		Window rwin;
		XGetGeometry(XtDisplay(top2),XtWindow(top2),&rwin,&x, &y, &width, &height, &border, &depth);
		//printf("x=%d y=%d width=%d height=%d border=%d depth=%d\n",x,y,width,height,border,depth);

		//ウィンドウの位置、サイズ設定
		XMoveResizeWindow(XtDisplay(top2),XtWindow(top2),(dx-width)/2,(dy-height-depth)/2,width,height);
	}


	//ラベルの作成
	label1 = XtVaCreateManagedWidget("label1",//ウィジット名
					labelWidgetClass,//ラベルクラスを指定
					form1,
					//リソースの直接入力(どんどん追加できる)
					XtNlabel,"Label1 test",//表示される文字
					XtNhorizDistance,5,//開始位置
					XtNvertDistance,5,
					XtNwidth,100,//幅と高さ
					XtNheight,20,
					XtNborderWidth,1,//境界線
					//リソースここまで
					NULL);
	//ラベルの作成
	label2 = XtVaCreateManagedWidget("label2",//ウィジット名
					labelWidgetClass,//ラベルクラスを指定
					form2,
					//リソースの直接入力(どんどん追加できる)
					XtNlabel,"Label2 test",//表示される文字
					XtNhorizDistance,5,//開始位置
					XtNvertDistance,5,
					XtNwidth,100,//幅と高さ
					XtNheight,20,
					XtNborderWidth,1,//境界線
					//リソースここまで
					NULL);

	//経過時間後に関数を呼び出す設定(ミリ秒)
	XtAppAddTimeOut(app_context, 500, (XtTimerCallbackProc)timer,app_context); 

	XtAppMainLoop(app_context);
}







▲トップページ > Linux と C