2014年06月22日

Updated Ruby/GTK API reference with Ruby

    I updated almost all of wiki pages of Ruby/GTK API reference(Japanese version) on the official Ruby-GNOME2 web site several days ago.

    I wrote three Ruby scripts doing three tasks below:

  • Downloading the wiki pages in edit-mode. (They have class members documented)

  • Listing up members of each classes implemented in the library for MS Windows itself.

  • Comparing the pairs of class members lists above, and adding missing members on the documents to the wiki data.


    Some useful methods made automating the second task possible for this time. They are "singleton_methods", "instance_methods", "constants" and "included_modules" methods built in Ruby, and "properties" and "signals" methods Ruby/GTK classes have. All of them will accept an option parameter representing whether returning members list includes inherited members or not.

    I made new wiki data for uploading with the three scripts above. Then made some adjustments to the data and uploaded it to the web manually.
posted by chrono at 08:58| Comment(0) | TrackBack(0) | Ruby

Listing up classes or modules in specific module in Ruby

    If you want a list of classes in Ruby/GtkSourceView3 library, run this code.

require 'gtksourceview3'

mod = GtkSource
list = mod.constants.select do |const|
Object.const_get("#{mod}::#{const}").class == Class
end
puts list


    Replace "Class" with "Module", when you want a modules list.
タグ:ruby programming
posted by chrono at 07:35| Comment(0) | TrackBack(0) | Ruby

2014年06月21日

Rubyで特定のモジュール内にあるクラスやモジュールをリストアップする方法

例えば、Ruby/GtkSourceView3のクラスってどこまで実装されてるんだろう?と思った時には、

require 'gtksourceview3'

mod = GtkSource
list = mod.constants.select do |const|
Object.const_get("#{mod}::#{const}").class == Class
end
puts list


といったコードを実行すれば、リストアップできる。

"== Class"のところを"== Module"にすればモジュールが出てくる。
posted by chrono at 16:52| Comment(0) | Ruby

2014年06月17日

Ruby/GTKのAPIリファレンスを一気に更新してみた



 Ruby-GNOME2のWikiサイト上のデータと(Windows向けの)gtk2ライブラリに含まれているクラスの情報を照らし合わせてWikiページ更新用のデータを作るRubyスクリプトを書いたので、それでドバーッとやってみた。

Ruby/GTK APIリファレンス インデックス

 スクリプトでは、リファレンスの編集用のデータを含むページのダウンロード、ライブラリ内のクラスが実際に持っている項目のリストアップ、前記2つのデータを比較して抜けている項目を追加するなどして新しいリファレンスのデータを作る、という3つの作業をやった。新しいデータの細かい手直しと、Wikiページを更新する作業は手作業でやった。

 今回の作業のキモは、ライブラリ内のクラスの情報を取得するところで、これがプログラムで簡単にできなければ、あれほど大量のページをまとめて更新するなんてことはできなかった。

 Rubyには元々、クラスが持っているメソッドや定数をリストアップするsingleton_methods、instance_methods、constantsといったメソッドや、インクルードされているモジュールをリストアップするincluded_modulesメソッドがあり、さらにRuby-GNOME2のクラスには、プロパティとシグナルをリストアップするproperties、signalsというメソッドがあり、これらはすべて先祖のクラスから継承したメンバを含めるかどうかのオプションを指定することができる。

 これらのメソッドから得られる情報を元にしてリファレンスの"見出し"部分を更新した。今回は基本的にプログラムでできることだけをやるつもりだったので、本文には手をつけていない。
posted by chrono at 16:21| Comment(0) | Ruby

2014年05月11日

Gtk::TextViewに表示するテキストの属性の操作方法



 頭の中だけで整理しようとするとややこしいのでメモっとく。ざっと勉強しただけのやっつけまとめ。テキスト本体の編集の話ではなく、あくまで表示などに関わる属性の話。とりあえずはGTK+2向け。

 まずTextViewのテキスト全体に対する操作は、TextViewがdefault_attributesとして持っているGtk::TextAttributesをいじればいいのだが、TextAttributesはさらに入れ子構造になっていて真面目に掘っていこうとするとめんどくさい。(そうでもなかった)TextAttributes以下で管理している属性のいくつかはTextViewのメソッドやプロパティとして操作できるので、まずはそちらから触ることを試みるのが得策か。

 対してテキストの一部分に適用するための属性は、テキストの範囲を指定して設定するGtk::TextTagを介して操作する。TextTagを使うには、まずTextBufferに紐付けられているGtk::TextTagTableに登録した上で、テキスト上の位置を指定して貼り付ける。TextTagの作成、貼り付けはTextBufferのメソッドで行う。

【参考リンク】
 GTK+ 2 Reference Manual: Text Widget Overview
 Ruby/GTK API Reference - Ruby-GNOME2 Project Website
posted by chrono at 08:02| Comment(0) | Ruby

2014年05月08日

WindowsのRuby 2.0とgtk2 gemの組み合わせで作ったプログラムの終了時にsegmentation faultが出てしまう場合の対処法

 メインウィンドウのクローズボタンを押すかAlt+F4押し下げでdelete_eventシグナルを受け付け、その時のプログラムの状態によってdelete_eventシグナルのハンドラで真偽値のどちらかを返し、(その戻り値によって発生するかどうかが決まる)destroyシグナルのハンドラでGtk.main_quitを呼び出す形でプログラムの終了/非終了を制御している自作プログラムで、delete_eventシグナルのハンドラでfalseを返したときになぜかプログラムが正常に終了せずに、segmentation faultが出てしまいプロセスが終了しないことがあった。

 そのときのエラーメッセージ。

C:/Users/foo/hoge.rb: [BUG] Segmentation fault
ruby 2.0.0p451 (2014-02-24) [i386-mingw32]

-- Control frame information -----------------------------------------------
c:0001 p:0000 s:0002 E:000314 TOP [FINISH]


-- C level backtrace information -------------------------------------------


 これだけなので、自分の知識では原因がまったく推測もできず困ってしまったのですが、とりあえず以下のやり方でエラーを出さずに終了させるようにできました。

delete_eventシグナルのハンドラ内でプログラムを終了させる判定になったら、falseを返すのではなく明示的にdestroyシグナルのハンドラ(もしくは直接Gtk.main_quit)を呼び出してしまう


 例えば、エラーが出るコードが以下のようになっているとしたら、

def on_window_main_delete_event(widget, *args)
 !quit?()
end

def on_window_main_destroy(widget, *args)
 Gtk.main_quit
end


 以下のように書き換えます。

def on_window_main_delete_event(widget, *args)
 if quit?()
  on_window_main_destroy(widget)
 end
 true
end

def on_window_main_destroy(widget, *args)
 Gtk.main_quit
end
posted by chrono at 07:53| Comment(0) | Ruby

2014年05月05日

Ruby-GNOME2公式WikiのGtk::SourceViewのリファレンスを翻訳してみた

 Ruby-GNOME2公式WikiのGtk::SourceViewクラスのリファレンスを内容を更新しつつ翻訳してみました。gemのgtksourceview2に含まれるバージョンに対応するものです。他の関連クラスのリファレンスもぼちぼちやっていければなあと思っています。

 Gtk::SourceView - Ruby-GNOME2 Project Website

 上記のgtksourceview2 gemはGTK+2ベースですが、GTK+3ベースのgtksourceview3というのもあります。こちらは名前空間が例えばGtkSource::Viewというように、GtkSource::〜の形に変更されています。
posted by chrono at 02:38| Comment(0) | Ruby