山崎です。

Subject: [ruby-ext:00941] Re: how to call 'super' in C level?
From: Yasushi Shoji <yashi / yashi.com>

> 現在の Ruby/Gtk 0.23だと singnal_callback()の中で singnal_setup_args() 
> が呼ばれるのですが core widgetではない widgetだと自前で一連の関数群を用
> 意しなければならないようです。[ruby-ext:00522]からの threadがそれです。
> 
> そこで、singnal_callback()の中で objectが持つ singnal_setup_args()を呼ん
> で、もし与えられた singnalがその object特有の singnalではない場合、つま
> り親クラスが処理する物の場合に superを使って signal_setup_args()を定義し
> ている次の祖先?に飛びたいんです。
> 
> class GtkObject で signal_setup_args()を定義しておけば name errorも起き
> なくて名案かと思ったんですけど(^^;;; どんなもんでしょう。

他にやろうとする人なんか居ないだろうと思って黙っていたんですが、
あの後考えていたのは、次のような方法です。
(1)widget class の VALUE 値と signal_callback 関数ポインタの組
をリストにする(親クラス -> 子の順が保証されるように。それぞれ *_init時
にリストに追加すればよい)。
(2)signal_connect 時に、リストの後ろから rb_obj_is_kind_of で探索してその
callback 関数を signal_connect する。後ろから探すのは、スクリプトで
widget のサブクラスを作っているかも知れないので is_kind_of を使わないと
駄目だから。
上の方法なら、signal_connect は一つあればいいし、connect 時には探索があり
ますが問題はないと思います。

親のシグナル処理関数を呼ぶのは直接Cの関数を呼ぶのでいいんじゃないですか?
 
やすしさんの方法だと、対応するsetup_args を探すのと、親クラスの
setup_args 呼ぶのが簡単なのでいいとは思うんですが、signal が頻繁に発生す
るようなときに call_super を呼んでいくコストが気になっています。
(全然問題ないかも知れないけど)
---------------
山崎