Previous: 準備
Up: Xウィンドウ実習
第6回 少し複雑なイベント処理
Next: 複数のウィンドウからのイベント
Previous Page: 準備
Next Page: 複数のウィンドウからのイベント
前回の授業で勉強したイベントを処理の基本を復習します。
event1.c または event2.c を元にすればすぐできるはずです。
ソース・ファイル名は event4.c としてください。
event4.c
#include<stdio.h> #include<X11/Xlib.h> #include "yours" /* ビットマップデータ */ #include "dash" /* ビットマップデータ */ main() { Display *dsp; /* ディスプレイ構造体の宣言 */ Window win; /* ウィンドウ構造体の宣言 */ Pixmap pix, back_pix; /* ピクスマップ構造体の宣言 */ GC gc; /* GC構造体の宣言 */ XEvent eve; /* イベント構造体の宣言 */ Colormap cmap; /* カラーマップの宣言 */ XColor iro, dummy; /* カラー構造体の宣言 */ static char *win_name = "サービス スタンプ";dsp = XOpenDisplay( NULL ); /* ディスプレイのオープン */
cmap = DefaultColormap( dsp, 0 ); /* カラーマップを得る */ /* カラーマップから色を得る */ XAllocNamedColor( dsp, cmap, "red2", &iro, &dummy);
/* ウィンドウの生成 */ win = XCreateSimpleWindow( dsp, DefaultRootWindow(dsp), 0, 0, 840, 640, 1, BlackPixel(dsp,0), WhitePixel(dsp,0) ); /* ピクスマップの生成 */ pix = XCreatePixmapFromBitmapData( dsp, win, yours_bits, yours_width, yours_height, iro.pixel, WhitePixel(dsp,0), 8 ); back_pix = XCreatePixmapFromBitmapData( dsp, win, dash_bits, dash_width, dash_height, BlackPixel(dsp,0), WhitePixel(dsp,0), 8 );
gc = XCreateGC( dsp, win, NULL, NULL ); /* GCの生成 */
XStoreName( dsp, win, win_name ); /* タイトルの設定 */
XSetWindowBackgroundPixmap( dsp, win, back_pix ); /* 背景の模様を設定 */
XSelectInput( dsp, win, ButtonPressMask ); /* イベントマスクの設定 */
XMapWindow( dsp, win ); /* ウィンドウの表示 */ XFlush( dsp );
/* イベント処理の無限ループの開始 */ while( True ) { XNextEvent( dsp, &eve ); /* 新しいイベントを受け取る */ switch( eve.type ) /* イベントの種類で処理を選択 */ { case ButtonPress : switch( eve.xbutton.button ) /* ボタン番号で処理を選択 */ { case 1: /* 図形をコピー */ XCopyArea( dsp, pix, win, gc, 0, 0, yours_width, yours_height, eve.xbutton.x - yours_width/2, eve.xbutton.y - yours_height/2 ); break; case 2: XClearWindow( dsp, win ); /* ウィンドウのクリア */ break; case 3: XCloseDisplay( dsp ); /* ディスプレイのクローズ */ exit(0); /* 終了 */ default: break; } default: break; } } }
プログラムができたら、コンパイルして実行してみましょう。