家庭コンピュータ環境の模索 >gemcal の Gtk2 への移植
最終更新 (2005/03/05)
遅ればせながら、OS環境を Vine 2.6 → Vine3.1 にバージョンアップした。何が困ったかというと、良いカレンダー、時計が無い!!!
時計は、GNOME1.4 の AfterStep 時計をGNOMEパネルの左下に入れて使っていた。アナログ表示で、日付曜日も表示される。
カレンダーは MHC 付属のgemcal というカレンダーを使っていた。表示の大きさが適切で、繰り返し予定の機能が強力で気に入っている。うちのゴミ出しは、gemcal だよりだ。けっこうルールが複雑なので、ショボイ繰り返し予定では対応できないのだ。メールから予定を直接取り込めるのも便利。
Vine 3.1 にしたら、GNOME 2 になって、サイドバーに入る時計が全然付属してこなかった。あと XFce4 がわりとシンプルでカッコ良かったので、そっちを使うことにした。時計は、日付が表示されない(マウスを合わせるとポップアップするけど常時表示されない)のが不満だが、XFce4 のものをサイドバーに入れている。
Vine 3.1 では、GNOME2 になったのにともなって、Gtk2 になっている。また、ruby のバージョンも 1.8 になっている。gemcal は、ruby 1.4 と Gtk1 に対応した ruby-gtk に依存しており、Vine 3.1 の環境では、Gtk1 に対応した、ruby-gtk は入手できない。MHCのサイトやMLを覗いてみても、最近、開発がすすんでいて、gtk2 対応されている様子がない。Web で検索してもても、Gtk2 バージョンの gemcal は見つからなかった。
じゃ、自分で対応させてみることにした。どうせ、ユーザは自分なので、完全な対応でなくても、自分が使う範囲で対応してればいいのだから、それぐらいならできるだろう、ってことで。
ruby-gtk2 で動いている gemcal。widget のパッキングがよくわかってないので、すこし表示が太くなっている。
ちなみに、私は、ruby は、日常ほとんど触らない。ruby 1.2 のころ(1999年)に少し触っていたが、5年以上読み書きしていない。ruby の文法とクラス体系はオンラインマニュアルで参照できる。Gtk、Gtk2、(Qt、MS-Windows) のGUIプログラムも未経験だ。1999年ごろ、ruby/Tk を触っていたが、それはGtkのような本格的オブジェクト指向ではなく、Tk の ruby wrapper みたいなものだった。Gtk2 については、ruby-gnome2 のサイトで、クラスライブラリやチュートリアルがオンラインで参照できる。
そんな人間でも、自分が使う範囲での移植作業なら、なんとかできる、ということだ。せっかくソースが付いているので、みなさんも、インストールして使うだけでなく、改造などにもチャレンジしてみて欲しい。
Gtkから Gtk2になるときに、大きくライブラリの構成が変わっている。gemcal の移植で引っ掛かった点を述べる。
### ruby-gtk の場合 FONT = Gdk::Font .fontset_load(FONTSET) STYLE_SATURDAY = Gtk::Style .new .set_font(FONT) label = Gtk::Label .new(str) # str は EUC
### ruby-gtk2 の場合 FONT = Pango::FontDescription.new('sans 10') STYLE_SATURDAY = Gtk::Style .new .set_font_desc(FONT) label = Gtk::Label .new(GLib.convert(str,"utf-8", "euc-jp")) # str が EUC の時
Pango が使えるフォントは、次のようなスクリプトで取得できる。(書体関係 Wiki - X でのフォント設定で紹介されていた)
#!/usr/bin/env ruby require 'gtk2' Gtk.init fontsel = Gtk::FontSelectionDialog.new("gtkfontsel").show fontsel.signal_connect("delete-event"){ Gtk.main_quit } fontsel.cancel_button.signal_connect("clicked"){ Gtk.main_quit } fontsel.ok_button.signal_connect("clicked") do puts fontsel.font_selection.font_name Gtk.main_quit end Gtk.main
表形式データを扱う、CList から、表形式とツリー形式を扱うことのできる TreeView へ移行した。TreeView は View だけで、Model には TreeModel(の下位クラスであるListStoreなど)、Iterator には TreeIter、列の表示には TreeViewColumn などのクラス群を使う。
# ruby-gtk で CList を使って、2列の表を作る。 @lst = Gtk::CList .new(['Time', 'Desc']) .column_titles_hide \ .set_selection_mode(Gtk::SELECTION_SINGLE) \ .set_column_auto_resize(0, true) .unset_flags(CAN_FOCUS) \ .set_usize(1, 1) # CList に行を付け加える。 @lst .append([time, item])
# ruby-gtk で CList を使って、2列の表を作る。 # ListStore を作る model = Gtk::ListStore .new(String,String) # TreeView を作る @lst = Gtk::TreeView .new(model) # 1列目の表示方法をきめる。 renderer1 = Gtk::CellRendererText.new renderer1.expander=true column1 = Gtk::TreeViewColumn.new('item',renderer1,'text' => 0) \ .set_fixed_width(10) \ .set_min_width(1) \ .set_sizing(Gtk::TreeViewColumn::AUTOSIZE) @lst.append_column(column1) # 2列目も同様に renderer2 = Gtk::CellRendererText.new renderer1.expander=true column2 = Gtk::TreeViewColumn.new('time',renderer2,'text' => 1) \ .set_fixed_width(200) \ .set_min_width(1) \ .set_sizing(Gtk::TreeViewColumn::AUTOSIZE) @lst.append_column(column2) # 行を付け加える。 model = @lst.model iter = model.append iter.set_value(0,time) iter.set_value(1,GLib.convert(item, "utf-8", "euc-jp"))
マルチカラムテキストのクラスも、Text から TextView(と周辺クラス)に移行して、多機能、本格的になった。同様に Model として TextBuffer などの周辺クラスといっしょに使う。
# ruby-gtk でテキスト # text を作る @txt = Gtk::Text .new(nil, nil) # テキストを書き込む @txt .insert_text(text, 0)
# ruby-gtk2 でテキスト # buffer を作る @buffer = Gtk::TextBuffer .new # text を作る @txt = Gtk::TextView .new(@buffer) # iterator を得る iter = @buffer.start_iter # 色を変える場合は、タグを作っておく @buffer.create_tag("blue_foreground", "foreground" => "blue") # テキストを書き込む @buffer.insert(iter, GLib.convert(text, "utf-8", "euc-jp"), "blue_forground")
改めて書くまでもない雑多なこと。抜けがあるかも。
当初は、この、「その他」に書いてあるぐらいの修正で移植できるのでは、と甘く考えていた。
移植版を配布します。
配布に問題があるようでしたら、近藤までご連絡下さい。
配布しているファイルにバグがある場合は、私まで連絡していただければ、なんとかしてみるかも知れませんが、基本的には自分が困らない限り放置の方向です。自分でなんとかしてください。
配布内容は、次の3ファイルです。gemcal2 は gemcal の置き換え、mhc-gtk2.rb はmhc-gtk.rb の置き換えです。
gemcal2/ 00copyright gemcal2 gemcal2/ruby-ext/lib mhc-gtk2.rb
ruby, ruby-gtk2 は、私はディストリビューション付属のものを使った。Vine 3.1 なので、apt-get install ほげほげ、でOK。
$ rpm -q ruby ruby-1.8.1-0vl20 $ rpm -q ruby-gtk2 ruby-gtk2-0.9.1-0vl1