トップ «前の日記(2006-05-27 [土]) 最新 次の日記(2006-05-29 [月])» 編集

SewiGの日記

2004|01|04|05|06|07|09|10|11|12|
2005|01|02|03|04|05|06|07|08|09|10|11|12|
2006|01|02|03|04|05|06|07|08|09|10|11|12|
2007|01|02|03|04|05|06|07|08|09|10|11|12|
2008|01|02|03|

2006-05-28 [日] [長年日記]

[Programming] X11プログラミングメモ(2)

次に描画。これでおもしろいアプリケーションも作れるでしょう。

#include <stdio.h>
#include <X11/Xlib.h>
#include <X11/Xutil.h>
#include <X11/keysym.h>

Display *display;
Window root, window;
int screen;

XEvent event;
KeySym key;
GC gc;

unsigned long GetColor(Display *display, char *color) {
	Colormap cmap;
	XColor c0, c1;

	cmap = DefaultColormap(display, 0);
	XAllocNamedColor (display, cmap, color, &c1, &c0);
	return (c1.pixel);
}

int main(int argc, char *argv[]) {
	display = XOpenDisplay(NULL);
	screen = DefaultScreen(display);
	
	root = RootWindow(display, screen);
	window = XCreateSimpleWindow(display, root, 100, 100, 640, 480, 4, BlackPixel(display, screen), WhitePixel(display, window));
	XStoreName(display, window, "Hello, X11 world");

	Atom atom1, atom2;
	atom1 = XInternAtom(display, "WM_PROTOCOLS", False);
	atom2 = XInternAtom(display, "WM_DELETE_WINDOW", False);
	XSetWMProtocols(display, window, &atom2, 1);
	
	XMapWindow(display, window);
	XFlush(display);
	
	XSelectInput(display, window, ExposureMask | KeyPressMask | ButtonPressMask);
	
	gc = XCreateGC(display, window, 0, 0);
	XSetForeground(display, gc, GetColor(display, "black"));
	XSetBackground(display, gc, GetColor(display, "white"));
	
	for(;;) {
		XNextEvent(display, &event);
		switch (event.type) {
		case Expose:
			XDrawImageString(display, window, gc, 20, 50, "Hello", 5);
			XDrawLine(display, window, gc, 0, 0, 100, 100);
			XDrawPoint(display, window, gc, 20, 50);
			XDrawRectangle(display, window, gc, 80, 70, 50, 50);
			XFillRectangle(display, window, gc, 180, 170, 50, 50);
			XDrawArc(display, window, gc, 200, 200, 50, 50, 0, 360*64);
			XFillArc(display, window, gc, 250, 250, 50, 50, 0, 360*64);
			break;
		case KeyPress:
			key = XKeycodeToKeysym(display, event.xkey.keycode, 0);
			if (key == XK_q) {
				XDestroyWindow(display, window);
				XCloseDisplay(display);
				exit(0);
			}
			break;
		case ButtonPressMask:
			XDestroyWindow(display, window);
			XCloseDisplay(display);
			exit(0);
			break;
		case ClientMessage:
			if (event.xclient.message_type == atom1 && event.xclient.data.l[0] == atom2){
				XDestroyWindow(display, window);
				XCloseDisplay(display);
				exit(0);
			}
		}
	}
}

まず、#include <X11/keysym.h>とKeySymはキー入力で必要です。

そして、GCは描画に必要なものです。グラフィックコンテキスト。XCreateGC()を使用して取得します。GCさえあれば、あとは簡単。XSetForeground()で色を指定して、描画関数で描くだけです。このときXColorでRGB値を1つずつ指定するのが面倒なので、GetColorで名前を指定します。描画関数にはXDrawImageString、XDrawLine、XDrawPoint、XDrawRectangle、XDrawArcなどがあります。DrawをFillにした関数もあって、そっちは塗りつぶせます。あとはメモリ内での画像を扱うPixmapとか転送のXCopyArea()とか。

これで、タイマ回して画像でも表示させれば面白そうなアプリケーションが作れそうですね。音声はそのうち。


Copyright © 2004-2008 SewiG All rights reserved.