lablgtk の API は,もはや Gtk とは別物なような… Ruby とかの素朴なバインディングとは異なり,名前も,呼び出しかたも独自.
OCaml:lablGTK
まぁ,そのぶん,異常にソースが簡潔になるわけなんですが.C であんなにタラタラ書いてたのが馬鹿馬鹿しくなりますな.とりあえずインラインでコールバックを書ける (クロージャ渡せる) のが素晴らしすぎる.あと型推論万歳.OCaml のコンパイルの時のエラーメッセージはけっこうわかりやすい気がする.
以下,ソース.型推論初心者にありがちな,型が合わないからとりあえず () 返しとけ !! OCaml 小学生にありがちな,とりあえず let 〜 in しとけ !! lablgtk の API がわかんなかったらとりあえず変数をグローバルにしとけ !! 的ななげやり感が随所に見えてほほえましいですね.
(* vim: set encoding=utf8: コンパイル方法 : $ ocamlopt -w s -I +lablgtk2 lablgtk.cmxa gtkInit.cmx edit.ml -o edit $ ./edit *) open GMain let window = GWindow.window () let vbox = GPack.vbox ~packing:window#add () let toolbar = GButton.toolbar ~packing:vbox#pack () let notebook = GPack.notebook ~packing:vbox#pack () let create_new_buffer () = let scrollwin = GBin.scrolled_window ~width:300 ~height:300 ~packing:notebook#append_page () in GText.view ~packing:scrollwin#add ()
let init_editor_window () = window#connect#destroy ~callback:Main.quit; let tooltips = GData.tooltips () in let b = GButton.tool_button ~stock:`ADD ~packing:toolbar#insert () in b#set_tooltip tooltips "新しいバッファを作ります" "" ; b#connect#clicked ~callback: (fun () -> create_new_buffer (); ()); window#show () let _ = init_editor_window (); create_new_buffer (); (* たぶん,この間の一瞬のもたつきが見えちゃってる *) GMain.main ()
vim のいい加減な OCaml モードでダンプしたもの (要 UTF8 保存.というか,OCaml で UTF8 が素直に通るとは思わなんだ.素晴らしい ← 英語圏で作られた処理系を信用しなさすぎ).
# 追記 : ブログ上でコメントを書き足した時に,全角スペースが入ってた… orz (uim を設定してなかった… というか,全角スペースぐらいちゃんとパースして欲しいのう (ムチャ))
なんか,起動した時に,一瞬もたつくのが気になる.OCaml に特有の現象なのか,俺のコードが葛すぎるのかは今後の調査が待たれるところです (他人事) たぶん,(show_all 相当の API が見付からなかったんだけど),ウィジットが作られるたびに show されてるから,一瞬残像が残るのだろうと思う (普通は,全部オブジェクト作ってから show するんだけど… lablgtk の API がよーわからんのじゃ).

今回はガワだけしか作ってません.ボタンを押すと,新しいバッファが開くだけ.まだ何も実用的な機能は実装されていません.まぁ,サンプルコードが Web 上に少な過ぎるので,こういうのをちょこちょこ公開してみるだけでも,微妙に誰かの役に立つかもしれないし,誰も興味を持たないかもしれない (OCaml,Gtk,なおかつ資料が少ない独自 API というマイナー三重苦 !厳しすぎる !!)
参考文献
GTK+ 2.0 Tutorial using Ocaml (Gtk のチュートリアルを,まんま OCaml + lablgtk に翻訳したもの.よくやるわ…) lablgtk リファレンス (2.4.0 なのでちょっと古い) あと,ソースの中のサンプル (lablgtk-2.6.0/examples) (これが一番素晴らしい)
|