Previous: 準備
Up: Xウィンドウ実習
第9回 アイコンとカーソル
Previous Page: 準備
Next Page: Xウィンドウ概論
第9回 アニメーションを作ろう
前回のペイントツールにアイコンとカーソルの機能を追加します。
図形はビットマップを使いますが、
図形の輪郭を指定するために「マスク」のビットマップと呼ばれるものも
用意します。
アイコンに自分の作った図形を登録するには、
ウィンドウマネジャーに情報を伝える XSetWMHints() を使います。
カーソルはキャンバス内でペンの形を取るようにします。
(ビットマップのデータは先生の用意したものを利用してください。)
プログラムの大半は前回の paint2.c をそのまま利用しますが、
ソース・ファイル名は新しく paint3.c としてください。
paint3 .c
#include<stdio.h>#include<stdio.h> #include<X11/Xlib.h> #include<X11/Xutil.h> /* XWMHints構造体を使用するのに必要 */ #include "zou1" /* アイコンのビットマップデータ */ #include "zou1_mask" /* アイコン・マスクのビットマップデータ */ #include "pen" /* カーソルのビットマップデータ */ #include "pen_mask" /* カーソル・マスクのビットマップデータ */ #define MAX_COLOR 12 #define MAX_PEN 6 main() { Display *dsp; Window frame; Window canvas, command; Window quit, clear; Window palette, tool; Window color[MAX_COLOR], pen[MAX_PEN]; GC gc; XEvent eve; Colormap cmap; XColor iro[MAX_COLOR], dummy; static char *cname[] = { "red", "green", "blue", "yellow", "pink", "sky blue", "orange", "violet", "dark green", "gray", "black", "white" }; static int pen_data[] = { 1, 2, 4, 8 ,12, 20 };
int x1,y1,x2,y2; int i;
Pixmap bit1, bit1_mask; /* カーソルで使用するビットマップ */ Pixmap bit2, bit2_mask; /* アイコンで使用するビットマップ */ XWMHints hint; /* ウィンドウ・マネジャへ伝える情報 */ Cursor cur; /* マウス・カーソル */
dsp = XOpenDisplay( NULL );
cmap = DefaultColormap( dsp, 0 ); for( i=0 ; i<MAX_COLOR ; i++ ) XAllocNamedColor( dsp, cmap, cname[i], &iro[i], &dummy );
frame = XCreateSimpleWindow( dsp, DefaultRootWindow(dsp), 0, 0, 600, 400, 1, BlackPixel(dsp,0), BlackPixel(dsp,0) ); canvas = XCreateSimpleWindow( dsp, frame, 5, 5, 555, 355, 0, BlackPixel(dsp,0), WhitePixel(dsp,0) ); command = XCreateSimpleWindow( dsp, frame, 565, 265, 30, 95, 0, BlackPixel(dsp,0), WhitePixel(dsp,0) ); quit = XCreateSimpleWindow( dsp, command, 2, 5, 24, 24, 1, BlackPixel(dsp,0), WhitePixel(dsp,0) ); clear = XCreateSimpleWindow( dsp, command, 2, 35, 24, 24, 1, BlackPixel(dsp,0), WhitePixel(dsp,0) );
palette = XCreateSimpleWindow( dsp, frame, 5, 365, 590, 30, 0, BlackPixel(dsp,0), WhitePixel(dsp,0) ); tool = XCreateSimpleWindow( dsp, frame, 565, 5, 30, 255, 0, BlackPixel(dsp,0), WhitePixel(dsp,0) ); for( i=0 ; i<MAX_COLOR ; i++ ) { color[i] = XCreateSimpleWindow( dsp, palette, 5+30*i, 2, 24, 24, 1, BlackPixel(dsp,0), iro[i].pixel ); } for( i=0 ; i<MAX_PEN ; i++ ) { pen[i] = XCreateSimpleWindow( dsp, tool, 2, 5+30*i, 24, 24, 1, BlackPixel(dsp,0), WhitePixel(dsp,0) ); }
gc = XCreateGC( dsp, frame, NULL, NULL ); XSetForeground( dsp, gc, BlackPixel(dsp,0) );
XSelectInput( dsp, canvas, ButtonPressMask | Button1MotionMask ); XSelectInput( dsp, quit, ButtonPressMask | ExposureMask ); XSelectInput( dsp, clear, ButtonPressMask | ExposureMask );
for( i=0 ; i<MAX_COLOR ; i++ ) XSelectInput( dsp, color[i], ButtonPressMask | ExposureMask ); for( i=0 ; i<MAX_PEN ; i++ ) XSelectInput( dsp, pen[i], ButtonPressMask | ExposureMask );
XStoreName( dsp, frame, "Paint Tool" );
/* カーソル用のビットマップの生成 */ bit1 = XCreateBitmapFromData( dsp, frame, pen_bits, pen_width, pen_height ); bit1_mask = XCreateBitmapFromData( dsp, frame, pen_mask_bits, pen_mask_width, pen_mask_height ); /* カーソルの生成 */ cur = XCreatePixmapCursor( dsp, bit1, bit1_mask, iro[MAX_COLOR-2], iro[MAX_COLOR-1], pen_x_hot, pen_y_hot ); /* ウィンドウのカーソルを指定 */ XDefineCursor( dsp, canvas, cur );
/* アイコン用のビットマップの生成 */ bit2 = XCreateBitmapFromData( dsp, frame, zou1_bits, zou1_width, zou1_height ); bit2_mask = XCreateBitmapFromData( dsp, frame, zou1_mask_bits, zou1_mask_width, zou1_mask_height );
hint.flags = IconPixmapHint | IconMaskHint; /* どの情報を伝えるかの情報 */ hint.icon_pixmap = bit2; /* アイコンで使用するピクスマップの指定 */ hint.icon_mask = bit2_mask; /* アイコンで使用するマスクのピクスマップの指定 */ XSetWMHints( dsp, frame, &hint ); /* ウィンドウ・マネジャに情報を送る */ XSetIconName( dsp, frame, "Paint" ); /* アイコンに表示されるの文字列の指定 */
XMapWindow( dsp, frame ); XMapSubwindows( dsp, frame ); XMapSubwindows( dsp, command ); XMapSubwindows( dsp, palette ); XMapSubwindows( dsp, tool );
XFlush( dsp );
while( True ) { XNextEvent( dsp, &eve ); : : (以下、paint2.c と同じ内容なので省略)
レポート課題について前期の実習のまとめとして全員にXウィンドウのプログラムを作ってもらい、 レポートとして提出してもらいます。内容・長さに特に制限は設けません。
条件: グラフィックの表示とマウスのイベント処理を必ず行なうこと。 自作のビットマップを用意し、アイコンの絵として利用すること。
提出方法: 各自のディレクトリ x に report.c という名前で作っておくこと。 絵のデータファイルも同じディレクトリに置いておきなさい。
期限: 7月 16日(土) ただし、教育実習に行っていた人は期限を延長するように配慮します。