SewiGの日記
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()とか。
これで、タイマ回して画像でも表示させれば面白そうなアプリケーションが作れそうですね。音声はそのうち。