2014年1月21日火曜日

[OCaml]グラフィックライブラリLablGtkを試してみる

調べてみたら、lablgtkというライブラリがあった。
OCamlではモジュールと呼ぶのかな?

LablGtk
LablGtk is an OCaml interface to GTK+ 1.2 and 2.x.

opamでインストールできる。
$ opam install lablgtk
〜依存パッケージと共にインストールされる。
$ rehash
(zshを使っているので。)
これで lablgtk2コマンドが使えるようになった。

.opamディレトリにサンプルコードがインストールされると思ったが、無かった。
では、ソースをダウンロードしよう。
$ cd ~/src
$ wget https://forge.ocamlcore.org/frs/download.php/1261/lablgtk-2.18.0.tar.gz

--2014-01-20 23:33:50--  https://forge.ocamlcore.org/frs/download.php/1261/lablgtk-2.18.0.tar.gz
forge.ocamlcore.org (forge.ocamlcore.org) をDNSに問いあわせています... 87.98.154.45
forge.ocamlcore.org (forge.ocamlcore.org)|87.98.154.45|:443 に接続しています... 接続しました。
証明書の所有者の名前とホスト名 `forge.ocamlcore.org' が一致しません

怒られた。うーむ。良くないなーと思いつつも、えい。
$ wget --no-check-certificate https://forge.ocamlcore.org/frs/download.php/1261/lablgtk-2.18.0.tar.gz
--no-check-certificate   サーバ証明書を検証しない
ダウンロードできた。
展開しよう。
$ tar zxf lablgtk-2.18.0.tar.gz
$ cd lablgtk-2.18.0/examples
$ ls

GL               csview.ml           events2.ml           label.ml           socket.ml
about.ml           curve.ml               expander.ml           link_button.ml       sourceview
accel_tree.ml           custom_list_generic.ml  fifteen.ml           lissajous.ml       spell.ml
action.ml           custom_tree.ml           filechooser.ml           nihongo.ml       spin.ml
assistant.ml           custom_tree_generic.ml  fixed_editor.ml           notebook.ml       test.xpm
assistant_tutorial.ml  dcalendar.ml           fixpoint.ml           panel           testdnd.ml
buttons.ml           dialog-thread.ml        gioredirect.ml           pixview.ml       testgtk.ml
calc.ml               drawing.ml           giotest.ml           pousse.ml       testthread.ml
calendar.ml           druid.ml               glade               progressbar.ml       text
canvas               editor.ml           gnome-fs-directory.png  radiobuttons.ml       timer.ml
cgets.ml           editor2.ml           gnome-fs-regular.png    rpn.ml           toolbar.ml
clist.ml           entry.ml               hello.ml               rsvg           tooltip.ml
combo.ml           entry2.ml           iconview.ml           runthread.ml       tree.ml
combobox.ml           entrycompletion.ml      image.ml               scrolledwin.ml       tree_model.ml
counter.ml           eventbox.ml           image256x256.rgb        signal_override.ml  tree_store.ml
cputs.ml           events.ml           kaimono.ml           slide_show.ml       tron.ml

いろいろあるなー。
手始めに、やっぱり hello.mlだよね。
$ lablgtk2 hello.ml
Hello World というラベルが付いたボタンのウィンドウが表示された。
ボタンを押すと、
Hello World
と文言を出力して終了した。

ソースを見ると、
$ cat hello.ml
(**************************************************************************)
(*    Lablgtk - Examples                                                  *)
(*                                                                        *)
(*    There is no specific licensing policy, but you may freely           *)
(*    take inspiration from the code, and copy parts of it in your        *)
(*    application.                                                        *)
(*                                                                        *)
(**************************************************************************)

(* $Id$ *)

open GMain

let window = GWindow.window ~border_width: 10 ()

let button = GButton.button ~label:"Hello World" ~packing: window#add ()

let main () =
  window#event#connect#delete
    ~callback:(fun _ -> prerr_endline "Delete event occured"; true);
  window#connect#destroy ~callback:Main.quit;
  button#connect#clicked ~callback:(fun () -> prerr_endline "Hello World");
  button#connect#clicked ~callback:window#destroy;
  window#show ();

ほー。簡単そうに見えるなぁ。
#で連鎖してメッセージ呼び出しできるのかな?

今日はここまでにしておこう。