山崎と申します。

ruby/gtk の signal_setup_args (signal_set_valueも?) の中ですが、
gtkオブジェクトの種類、シグナルの種類の組合せによって、
params の要素を ruby のオブジェクトに変換する処理が下のような形で
入っています。

    if (rb_obj_is_kind_of(obj, gWidget)) {
        if (strcmp(signame, "draw") == 0) {
            rb_ary_push(args, make_gdkrectangle(
	                     GTK_VALUE_POINTER(params[0])));
            return;
        }

このような個別の処理を、signal_setup_args の中で用意するのではなく、
rbgtkwidget.c などそれぞれのウイジェットに対応したソースファイルで
用意しリストなどの形に登録して、signal_setup_args からコールバックで
呼び出すというようなことはできないでしょうか。

あるいは、*_signal_callback を必要なウイジェットには用意し、シグナルの
パラメータ処理を行ってから、親ウイジェットまたは本来の callback を
呼ぶ方法でもいいかもしれません。
   widget_signal_callback(..){
        signame は "draw" ?  => params[0] の処理
	signal_callback(..)     この中で rb_apply が行なわれる。
   }

私の場合、C で gtkウイジェットを作って(テキストのビューワのようなもの)、
さらに ruby の拡張ライブラリでそれをrubyから使うような事をやっています。

    gtk   <---  (C/gtk viewer)       右の2つは自分で書いたもの
     ^             ^
     |             |                  矢印は依存関係
  ruby/gtk <--  (ruby/gtk viewer)

viewer がクリックされたら、文書中の位置と、 その位置に設定した
user data のポインタ(gpointer)を返すという仕様にしていたのですが、
arg_to_value 中で GTK_TYPE_POINTER 型は gtk のオブジェクトであると
されているようで、エラーメッセージが出ます。
結局 C のviewer のコードのほうで、シグナルのパラメータとしては
位置のみを返し、使う側で user data を調べる仕様に変更しました。
(私のはこれで構わないんですが) 

発生したウイジェットとシグナルの種類によって行う処理が、
ruby/gtk のコアな部分に入っているより、上記のようにしたほうが拡張しやす
いのでよいのではないかと思います。