はじめに

編集

X11(X Window System)は、Unix系オペレーティングシステムにおいて、グラフィカルユーザーインターフェース(GUI)を提供するための基盤となるシステムです。X11は、クライアントとサーバのモデルに基づいて動作し、グラフィックスやウィンドウ管理を行います。X11を理解することは、Unix系システムでGUIを扱うための基本となります。

最初のX11プログラム

編集

最初に、X11を使ってウィンドウを作成し、基本的な描画を行うシンプルなプログラムを作成してみましょう。以下に示すコードは、最初のX11プログラムの例です。これにより、X11サーバに接続し、ウィンドウを作成し、そのウィンドウに簡単な描画を行います。

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

int main() {
    // Xサーバに接続
    Display *display = XOpenDisplay(NULL);
    if (display == NULL) {
        fprintf(stderr, "X11サーバに接続できませんでした。\n");
        return -1;
    }
    int screen = DefaultScreen(display);

    // ウィンドウの作成
    Window window = XCreateSimpleWindow(display, RootWindow(display, screen), 10, 10, 500, 300, 1,
                                        BlackPixel(display, screen), WhitePixel(display, screen));
    XMapWindow(display, window);

    // イベントループ
    for (;;) {
        XEvent event;
        XNextEvent(display, &event);
        if (event.type == Expose) {
            // ウィンドウに線を描画
            XDrawLine(display, window, DefaultGC(display, screen), 10, 10, 490, 290);
        }
    }

    // Xサーバとの接続を閉じる
    XCloseDisplay(display);
    return 0;
}

このコードでは、XOpenDisplayを使用してX11サーバに接続し、XCreateSimpleWindowでウィンドウを作成します。次に、XNextEventでイベントを待機し、ウィンドウが再描画されるタイミングで線を描画しています。

X11での描画とグラフィックス

編集

X11では、グラフィックスを描画するためにいくつかの関数を使用します。ウィンドウ上に直線、矩形、円などを描画することができます。次のコード例では、ウィンドウ内に矩形を描画する方法を示しています。

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

int main() {

    // Xサーバに接続
    Display *display = XOpenDisplay(NULL);
    if (display == NULL) {
        fprintf(stderr, "X11サーバに接続できませんでした。\n");
        return -1;
    }

    int screen = DefaultScreen(display);

    // ウィンドウの作成
    Window window = XCreateSimpleWindow(display, RootWindow(display, screen), 10, 10, 500, 300, 1,
                                        BlackPixel(display, screen), WhitePixel(display, screen));
    XMapWindow(display, window);

    // イベントループ
    for (;;) {
        XEvent event;
        XNextEvent(display, &event);
        if (event.type == Expose) {
            // ウィンドウに矩形を描画
            XFillRectangle(display, window, DefaultGC(display, screen), 50, 50, 200, 100);
        }
    }

    // Xサーバとの接続を閉じる
    XCloseDisplay(display);
    return 0;
}

このコードでは、XFillRectangleを使用してウィンドウ内に矩形を描画しています。Exposeイベントはウィンドウが再描画されるたびに発生し、そのタイミングで描画処理を行います。

イベント処理とインタラクション

編集

X11では、ユーザーの入力(マウスクリック、キー入力など)に対してイベントを処理する必要があります。次のコード例では、マウスクリックを検出し、クリックした位置に点を描画する方法を示しています。

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

int main() {
    // Xサーバに接続
    Display *display = XOpenDisplay(NULL);
    if (display == NULL) {
        fprintf(stderr, "X11サーバに接続できませんでした。\n");
        return -1;
    }

    int screen = DefaultScreen(display);

    // ウィンドウの作成
    Window window = XCreateSimpleWindow(display, RootWindow(display, screen), 10, 10, 500, 300, 1,
                                        BlackPixel(display, screen), WhitePixel(display, screen));
    XMapWindow(display, window);

    // マウスクリックイベントを処理する
    for (;;) {
        XEvent event;
        XNextEvent(display, &event);
        if (event.type == ButtonPress) {
            // マウスクリック位置に点を描画
            XDrawPoint(display, window, DefaultGC(display, screen), event.xbutton.x, event.xbutton.y);
        }
    }

    // Xサーバとの接続を閉じる
    XCloseDisplay(display);
    return 0;
}

このコードでは、ButtonPressイベントを使用して、マウスクリック時の位置に点を描画しています。event.xbutton.xおよびevent.xbutton.yでクリックされた座標を取得し、その位置に点を描画します。

まとめ

編集

X11プログラミングでは、ウィンドウの作成、描画、イベント処理など、基本的な操作を学ぶことができます。これらの知識を活用して、より複雑なGUIアプリケーションを構築することが可能です。次のステップとして、さらに高度なグラフィックス機能やウィンドウ管理の方法を学ぶことができます。