X11プログラミング
はじめに
編集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アプリケーションを構築することが可能です。次のステップとして、さらに高度なグラフィックス機能やウィンドウ管理の方法を学ぶことができます。