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日(土) ただし、教育実習に行っていた人は期限を延長するように配慮します。

maruyama@wakhok.ac.jp
1995年02月01日 (水) 00時21分18秒 JST