2013/01/20

Recent entries from same category

  1. Ruby の Array#<< は Array#push よりも速いか
  2. Ruby の a = a + 1 はなぜ undefined method '+' for nil:NilClass なのか
  3. Re: Ruby 製バッチ処理を省メモリ化した
  4. Crystal と CRuby でHTTPサーバのベンチマーク
  5. pure mruby な JSON パーサ書いた。

toilet mruby と言えば組み込み用途のイメージが高いですが、Windows で何度も ruby 拡張のビルドエラーを潜り抜けて来て、ある程度 ruby 拡張の仕組みも知っている僕としては mruby の方がソースが綺麗し精神衛生上良いと言いたいが、言ってしまうとどこかしらからかオノが飛んで来そうな昨今でございます。
最近はmrubyでウォシュレットの噴出を監視するシステムも登場し、「TOTO さん、そろそろ本気で mruby 組み込みウォシュレット 考えてみませんか」と言いたくなる状況です。
さて、そろそろ mruby にも GUI が欲しくなってきたので fltk3 を組み込んでみました。
mattn/mruby-fltk3 - GitHub
https://github.com/mattn/mruby-fltk3
mrbgems 化してあります。
まぁまぁ忠実に fltk3 を移植してあります。まだ全ての Widget が書けた訳ではないけど、簡単なアプリケーションを書くくらいなら出来る様になってきたので報告がてら記事にしようと思いました。

FLTK1 系を選んでも良かったのですが、FLTK1 は完全な utf-8 対応ではなく、かつ utf-8 対応した物はサードパーティプロダクトだったりします。fltk2 でも良かったのですが、どうやら最新は fltk3 という事で未来もある fltk3 を採用しました。
全てのオブジェクトは FLTK3 モジュール配下に入っています。

例えばウィンドウを作るのであれば window = FLTK3::DoubleWindow.new(00100100"mruby-fltk3")
window.show
FLTK3::run
こんな感じに。ウィンドウにボタンを足すのであれば begin メソッドと end メソッドの中でインスタンスを生成します。
window = FLTK3::DoubleWindow.new(00100100"mruby-fltk3")
window.begin
  button = FLTK3::Button.new(10108030"click me!")
window.end
window.show
FLTK3::run
begin にブロックを取る場合はブロック内で begin/end を行います。 window = FLTK3::DoubleWindow.new(00100100"mruby-fltk3")
window.begin do
  button = FLTK3::Button.new(10108030"click me!")
end
window.show
FLTK3::run
画像も扱えるので、例えば window = FLTK3::DoubleWindow.new(100100400430"mruby-fltk3")
window.begin do
  widget = FLTK3::Widget.new(1010380400)
  button = FLTK3::Button.new(103908030"load file")
  button.callback do
    fn = FLTK3::file_chooser("image file""*.{bm,bmp,gif,jpg,pbm,pgm,png,ppm,xbm,xpm}")
    image = fn ? FLTK3::SharedImage::get(fn) : nil
    if image.w > widget.w || image.h > widget.h
      if image.w > image.h
        temp = image.copy(widget.w, widget.h * image.h / image.w)
      else
        temp = image.copy(widget.w * image.w / image.h, widget.h)
      end
      image.release
      image = temp
    end
    widget.image = image
    widget.redraw
  end
end
window.show

FLTK3::run
これだけのコードで画像ビューワが出来上がり!
mruby-fltk3
なんだか mruby を組み込み用途以外で使ってるの、僕だけなんじゃないかと心配になって来ましたが負けません。戦います。
役にたつかどうか分かりませんが、遊びたい方はどうぞ。
Posted at by