なんでこんな記事を書いたかというと、今作っているデスクトップマスコットをD言語で書きたくてGUIライブラリを探している途中でこのライブラリを見つけたのですが、ビルド出来ず悔しくなってデスクトップマスコットを作るという目標をほったらかして試行錯誤し、どうにか動かせて嬉しかたので書きました。
Linux Mint 17.2でのものです。WindowsやOSXでも同様のことが発生するのか、どう解決すればいいのかは分かりません
Dlanguiとは
D言語で書かれたGUIライブラリです。POSIX/Windows対応でOSX,Windows,Linuxで動きます。FreeBSDも動く気がします。
ライセンスはBoost1.0となっています。
作者はbugginsという方でDlangIDEというのも作っているようです。今度使ってみようと思っています。
はじめに
本家のページ
本家のページの通り、SDL2のインストールかLinuxならXCBのインストールをします。
dub、dmdをインストールしていないならインストールを行います
どうビルドを通したか
- gl3nのバージョンが古い
- dlibのコンパイルが通らない
- dlangui(master)のコンパイルが通らない
- 本家のページのサンプルコードが古い
これらを1つづつ潰していきます。
gl3n
自分の場合だと、まずgl3nの静的リンクライブラリが生成されませんでした。更に警告も出ます。
これの原因はよく分かりませんがバージョンを1.2.0に引き上げてやればどうにかなります。DUBのプロジェクト内のdub.selection.jsonの、"gl3n":"1.0.1",
(1.0.1の部分は環境によっては違うかも知れません)を"gl3n":"1.2.0"
に書き換えます。
無理やりバージョンを上げているので少し不安ですが、これしか無い気がするのでこれで行きます。
dlib
dlib/coding/zlib.dでコンパイルエラーが発生します。内容は、標準ライブラリのetc.c.zlibのz_stream.total_outをuint型へ暗黙の型変換が出来ないというものです。原因は、z_stream.total_out型がcore.stdc.config.dのc_long型として宣言されており、このc_long型が64bitならulong,32bitならuintとなることです。
32bitならuint -> uintなので何の問題もないのですが、64bitだとulong -> uintとなり、コンパイルエラーが発生します。
castするなりstd.conv:toを使うなりすればいいと思います。自分はどちらのほうが良いのかよく分かりません。
dlib/coding/zlib.dの75行目と85行目の
return zlibStream.total_out;
を下のコードのどちらかに書き直します。
return cast(uint)zlibStream.total_out;
return zlibStream.total_out.to!int;
toを使う場合は
import std.conv : to;
が必要です。
dlanguiのコンパイルエラー
gl3nと同じ方法で、バージョンを0.6.32と指定してやると直りました。
サンプルコードの書き直し
// main.d
import dlangui.all;
mixin DLANGUI_ENTRY_POINT;
/// entry point for dlangui based application
extern (C) int UIAppMain(string[] args) {
// resource directory search paths
string[] resourceDirs = [
appendPath(exePath, "../res/"), // for Visual D and DUB builds
appendPath(exePath, "../../res/") // for Mono-D builds
];
// setup resource directories - will use only existing directories
Platform.instance.resourceDirs = resourceDirs;
// select translation file - for english language
Platform.instance.uiLanguage = "en";
// load theme from file "theme_default.xml"
Platform.instance.uiTheme = "theme_default";
// create window
Window window = Platform.instance.createWindow("My Window", null);
// create some widget to show in window
window.mainWidget = (new Button()).text("Hello world"d).textColor(0xFF0000); // red text
// show window
window.show();
// run message loop
return Platform.instance.enterMessageLoop();
}
3行目を下のコードの上の行から下の行のものへと書き直します。
mixin DLANGUI_ENTRY_POINT;
mixin APP_ENTRY_POINT;
そして、dlangui.allなどというものは存在しないので、
import dlangui.all;
import dlangui;
上の行のコードを下の行のコードに書き換えます
更に僕はdubとテキストエディタで書いているので、resorce云々を削ります。最終的にこのようなコードになりました。
import dlangui.all;
mixin APP_ENTRY_POINT;
extern (C) int UIAppMain(string[] args)
{
Platform.instance.uiLanguage = "ja";
Platform.instance.uiTheme = "theme_default";
auto window = Platform.instance.createWindow("Hello World",null);
window.mainWidget = (new Button()).text("Hello World"d).textColor(0xFF0000);
window.show();
return Platform.instance.enterMessageLoop();
}
これでdub run
を実行すると、このようなウィンドウが現れるはずです。
終わりに
BoostライセンスでD言語で書かれておりWindows,OSX,Linuxで動くと便利そうな気がします。
間違いや誤字、誤植などがあれば教えていただけると幸いです。