X11 bindings for D いじり。

誰か既に書いてておかしくない気もするのだが、何故か見あたらないので書いた。D言語使いの人って Windows ユーザに多いからだろか。

一応まとめてアップ。tinywm.d も同梱。
http://konbu.s13.xrea.com/lib/d/libdx11-20070810.tar.bz2
import Xlib;してる hoge.d をコンパイルするには

% dmd Xlib*.d hoge.d -L-lX11 -L-L/usr/X11R6/lib

と。たぶんそれが無難かなーと思う。

ごちゃごちゃしてたのでいくつかに切り分けた。

Xlib.d (ライブラリのトップレベル、あといくつかDから呼ぶのに便利めな関数を定義したり), Xlib_types.d (型定義), Xlib_define.d (定数定義), Xlib_funcs.d (関数定義)。

試しにライブラリ化してみた。DMD_HOME/src/phobos/linux.mak など参考に。

% dmd -c -w Xlib.d
% dmd -c -w Xlib_define.d
% dmd -c -w Xlib_funcs.d
% dmd -c -w Xlib_types.d
% ar rv libdx11.a Xlib.o Xlib_define.o Xlib_funcs.o Xlib_types.o
ar: libdx11.a を作成します
a - Xlib.o
a - Xlib_define.o
a - Xlib_funcs.o
a - Xlib_types.o
%

一応 tinywm.d をコンパイルできることは確認。

% dmd tinywm.d -L-lX11 -L-L/usr/X11R6/lib -L-ldx11 -L-L.
gcc tinywm.o -o tinywm -m32 -lX11 -Xlinker -L/usr/X11R6/lib -ldx11 -Xlinker -L. -lphobos -lpthread -lm
%

ただまあ問題があって、-ldx11 を tinywm.o の前にもってくるとコンパイルできない。

% gcc -ldx11 tinywm.o -o tinywm -lX11 -L/usr/X11R6/lib -L. -m32 -lphobos -lpthread -lm
tinywm.o(.data+0x30): undefined reference to `_D4Xlib12__ModuleInfoZ'
tinywm.o(.gnu.linkonce.t_Dmain+0x49): In function `_Dmain':
: undefined reference to `_D4Xlib13DXOpenDisplayFAaZPS10Xlib_types9_XDisplay'
tinywm.o(.gnu.linkonce.t_Dmain+0x68): In function `_Dmain':
: undefined reference to `_D10Xlib_funcs17DefaultRootWindowFPS10Xlib_types9_XDisplayZk'
tinywm.o(.gnu.linkonce.t_Dmain+0x88): In function `_Dmain':
: undefined reference to `_D4Xlib16DXStringToKeysymFAaZk'
collect2: ld はステータス 1 で終了しました
%

libdx11.a 内に定義がある関数が見えないとか言う。なんだろうこれ。-lX11, -lphobos なんかはもちろん、順序を変えてもコンパイル通る。

なんかよくわからんけど、ライブラリファイルの作り方を間違えてるみたいだ。まあ、別にライブラリ書きたいわけじゃなくて X11 いじりたいだけなんだから、dmd Xlib*.d hoge.dでいいやという気分になってきた。ライブラリっぽくしたとしても、-L-ldx11とか書かなきゃいけないんだし似たようなもんだ。どうせ基本 make だし。
とりあえず、ちまちま修正しながら使う程度にはできたかなあと思った。さて。ウィンドウマネージャーを書こうか。書かないかも。

test