コンテンツにスキップ

X Window Programming/CLX

出典: フリー教科書『ウィキブックス(Wikibooks)』

CLX(Common Lisp X Interface)は、X Window System に接続するための標準的なプロトコルであり、Common Lisp 向けのクライアントライブラリです。CLXを利用すると、X Windowシステムでのグラフィック描画やイベント処理が可能になります。

概要

[編集]

CLXは、X11プロトコルを直接扱うためのAPIを提供します。これにより、ウィンドウの作成、描画、イベント処理といった基本的な操作が可能です。

すべてのコマンドは、xlib: というプレフィックスを付けて呼び出すか、(in-package :xlib) を使用してxlibをカレントパッケージに設定することで利用できます。

Xサーバーとの接続

[編集]

X Window Systemを利用するには、まずXサーバーに接続する必要があります。以下のようにxlib:open-default-displayまたはxlib:open-displayを使用します。

デフォルトディスプレイへの接続

[編集]

デフォルトディスプレイに接続する場合、ホスト名やディスプレイ番号を指定する必要はありません。

;; デフォルトのディスプレイに接続
(defparameter *display* (xlib:open-default-display))

;; 接続結果の確認
(format t "Connected to display: ~A~%" (xlib:display-string *display*))

指定ディスプレイへの接続

[編集]

特定のホスト名やディスプレイ番号を指定して接続することも可能です。

;; ホスト名とディスプレイ番号を指定して接続
(defparameter *display* (xlib:open-display "localhost" :display 0))

;; 接続結果の確認
(format t "Connected to display: ~A~%" (xlib:display-string *display*))

基本操作

[編集]

ここでは、簡単なウィンドウを作成し、描画を行う例を紹介します。

ウィンドウの作成と表示

[編集]

以下のコードは、ウィンドウを作成して表示する最小限の例です。

;; 必要なライブラリをロード
(require 'clx)

;; デフォルトディスプレイに接続
(defparameter *display* (xlib:open-default-display))

;; ルートウィンドウを取得
(defparameter *root-window* (xlib:screen-root (xlib:default-screen *display*)))

;; ウィンドウを作成
(defparameter *window*
  (xlib:create-window *display* *root-window*
                      :x 100 :y 100
                      :width 400 :height 300
                      :border-width 2
                      :class :input-output
                      :attributes (list :background (xlib:color-pixel (xlib:screen-white-pixel (xlib:default-screen *display*))))))

;; ウィンドウを表示
(xlib:map-window *window*)
(xlib:flush *display*)
(format t "Window created and displayed!~%")

描画の例

[編集]

ウィンドウに簡単な図形を描画する例を示します。

;; 描画用コンテキストを作成
(defparameter *gc* (xlib:create-gcontext *display* *window* :foreground (xlib:color-pixel (xlib:screen-black-pixel (xlib:default-screen *display*)))))

;; 線を描画
(xlib:draw-line *display* *window* *gc* 50 50 200 200)

;; 四角形を描画
(xlib:draw-rectangle *display* *window* *gc* 100 100 150 100)

;; 描画を反映
(xlib:flush *display*)
(format t "Drawing completed!~%")

注意点

[編集]
  • CLXは比較的低レベルのAPIであるため、効率的な開発には慣れが必要です。
  • ディスプレイやウィンドウは明示的に解放する必要があります。開放しないとリソースリークの原因になります。
;; ウィンドウとディスプレイを解放
(xlib:destroy-window *window*)
(xlib:close-display *display*)
(format t "Resources released.~%")

外部リンク

[編集]