Previous: ピクスマップのテクニック
Up: Xウィンドウ実習
第6回 マウスからイベントを受け取る
Previous Page: ピクスマップのテクニック
Next Page: Xウィンドウ・プログラミング
第6回 イベント処理とイベント構造体 その2
今度はもう少し複雑なイベント処理です。マウスで指定したウィンドウ
を移動させます。
ソース・ファイル名は event3.c としてください。
event3.c
#include<stdio.h>
#include<X11/Xlib.h>
#include "moyou" /* ビットマップデータ */
main()
{
Display *dsp; /* ディスプレイ構造体の宣言 */
Window win, card[8]; /* ウィンドウ構造体の宣言 */
Pixmap pix; /* ピクスマップの宣言 */
Colormap cmap; /* カラーマップの宣言 */
XColor iro1, iro2, dummy; /* カラー構造体の宣言 */
XEvent eve; /* イベント構造体の宣言 */
int i;
dsp = XOpenDisplay( NULL ); /* ディスプレイのオープン */
cmap = DefaultColormap( dsp, 0 ); /* カラーマップを得る */
/* カラーマップから色を得る */
XAllocNamedColor( dsp, cmap, "green4", &iro1, &dummy );
XAllocNamedColor( dsp, cmap, "DarkSeaGreen2", &iro2, &dummy );
/* ウィンドウの生成 */
win = XCreateSimpleWindow( dsp, DefaultRootWindow(dsp),
0, 0, 640, 400, 1,
BlackPixel(dsp,0), WhitePixel(dsp,0) );
/* ピクスマップの生成 */
pix = XCreatePixmapFromBitmapData( dsp, win,
moyou_bits, moyou_width, moyou_height,
iro1.pixel, iro2.pixel, 8 );
/* サブウィンドウの生成 */
for( i=0 ; i<8 ; i++ )
{
card[i] = XCreateSimpleWindow( dsp , win,
80-3*i, 80-3*i, 72, 128, 2,
BlackPixel(dsp,0), WhitePixel(dsp,0) );
XSetWindowBackgroundPixmap( dsp, card[i], pix );
}
XStoreName( dsp, win, "トランプ その2" ); /* タイトルの設定 */
/* イベントマスクの設定 */
XSelectInput( dsp, win, ButtonPressMask );
XMapWindow( dsp, win ); /* ウィンドウの表示 */
XMapSubwindows( dsp, win ); /* サブウィンドウの表示 */
XFlush( dsp );
/* イベント処理の無限ループの開始 */
while( True )
{
XNextEvent( dsp, &eve ); /* 新しいイベントを受け取る */
switch( eve.type ) /* イベントの種類で処理を選択 */
{
case ButtonPress :
switch( eve.xbutton.button ) /* ボタン番号で処理を選択 */
{
case 1:
i = (i+1)%8; /* カードの番号を1だけ増やす */
XMoveWindow( dsp, card[i], eve.xbutton.x, eve.xbutton.y );
break;
case 3:
XCloseDisplay( dsp ); /* ディスプレイのクローズ */
exit(0); /* 終了 */
default:
break;
}
default:
break;
}
}
}