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