ruby-****@sourc*****
ruby-****@sourc*****
2005年 10月 18日 (火) 14:07:27 JST
------------------------- REMOTE_ADDR = 218.231.161.82 REMOTE_HOST = REMOTE_USER = ruby-gnome2-hiki URL = /ja/hiki.cgi?gtk2-tut-signals-and-callbacks ------------------------- TITLE = シグナルとコールバックの仕組み KEYWORD = =シグナルとコールバックの仕組み GTKバージョン2.0では,シグナルシステムがGTKからGLibに移っている. ここでは,GTK 1.2のシグナルからGLib 2.0のシグナルへ移行する際に拡張された部分に関する詳細は扱わない. (({helloworld.rb}))を詳しく見ていく前に、シグナルとコールバックについて説明しよう。 GTKはイベントドリブンのツールキットである。 すなわちイベントが発生するまで(({Gtk.main}))でスリープし、その後適切なメソッドへ制御を渡す. 制御の受渡しには"シグナル"のアイデアを使っている ((-ここで言うシグナルは、用語は同じだが、Unixシステムでいうシグナルと同じものではなく、実装にも使われていない-))。 マウスボタンの押下のようなイベントが発生すると、その押されたウィジェットから適切なシグナルが"発行"される。 GTKの持つ便利な機能のほとんどで使われている仕組みがこれである。 シグナルには"destory"のように、全てのウィジェットが継承していて発行できるものや、トグルボタンの"toggled"のように、特定のウィジェット特有のものがある。 例えばボタンに何か処理をさせるには、シグナルを捉えて適切な処理を実行するようシグナルハンドラを設定する必要がある。 Ruby/GTK2ではGLib::Instantiatable#signal_connectメソッドを用いてシグナルハンドラの設定を行う. GLib::Instantiatable#signal_connect("シグナル名") do # "シグナル名"に対する処理 end GLib::Instantiatable#signal_connectメソッドの引数は,ウィジェットが捉えるべきシグナル名とそのシグナルを捉えた時に実行する処理を記述したブロックである. 以下ではこのブロックのことを"コールバックブロック"と呼ぶこととする. このコールバックブロックは次のように引数を一つ取ることができる. GLib::Instantiatable#signal_connect("シグナル名") do |w| # "シグナル名"に対する処理 end この引数(({w}))にはシグナルを発行したウィジェットが代入される.