----Next_Part(Thu_Mar_29_01:19:47_2001_799)--
Content-Type: Text/Plain; charset=iso-2022-jp
Content-Transfer-Encoding: 7bit

酒井です。

Ruby/Gtkを外部で拡張しても、
get_gtk_type()が拡張されたクラスに対して正しく動作しないので、
make_gobject_auto_type()やget_value_from_gobject()が使えず、
(若干ですが)不便に感じたので、
rbgtk_register_class()で登録したクラスに対しても
get_gtk_type()が正しく動作するようにしてみました。

ついでに、rbgtk_lookup_class_by_gtype()も実装してあります。

--
酒井 政裕 / Masahiro Sakai
E-Mail: mailto:zvm01052 / nifty.com
   Web: http://homepage1.nifty.com/susho/
   ICQ: 68968814

----Next_Part(Thu_Mar_29_01:19:47_2001_799)--
Content-Type: Text/Plain; charset=iso-2022-jp
Content-Transfer-Encoding: 7bit
Content-Disposition: inline; filename="get_gtk_type.diff"

diff -ur gtk-0.24.orig/README.EXT.ja gtk-0.24/README.EXT.ja
--- gtk-0.24.orig/README.EXT.ja	Sat Jan 13 01:07:46 2001
+++ gtk-0.24/README.EXT.ja	Thu Mar 29 00:42:21 2001
@@ -45,7 +45,7 @@
 
 rbgtk_class_info *rbgtk_lookup_class_by_gtype(GtkType gtype);
 
-    (未実装)GTK+の型gtypeでクラス情報を検索する。
+    GTK+の型gtypeでクラス情報を検索する。
 
 * 参照管理
 
diff -ur gtk-0.24.orig/src/rbgtk.c gtk-0.24/src/rbgtk.c
--- gtk-0.24.orig/src/rbgtk.c	Fri Jan 12 05:51:22 2001
+++ gtk-0.24/src/rbgtk.c	Thu Mar 29 01:04:55 2001
@@ -116,6 +116,7 @@
 
 static st_table *gtk_object_list;
 static VALUE gtk_object_list_v;
+static VALUE gtk_type_hash;
 
 ID id_gtkdata;
 ID id_relatives;
@@ -131,6 +132,7 @@
 {
     VALUE data  ata_Wrap_Struct(rb_cData, 0, 0, cinfo);
     rb_ivar_set(cinfo->klass, id_class_info, data);
+    rb_hash_aset(gtk_type_hash, INT2NUM(cinfo->gtype), cinfo->klass);
 }
 
 rbgtk_class_info *
@@ -146,6 +148,18 @@
     }
 }
 
+rbgtk_class_info *
+rbgtk_lookup_class_by_gtype(gtype)
+    GtkType gtype;
+{
+    VALUE klass  b_hash_aref(gtk_type_hash, INT2NUM(gtype));
+
+    if (NIL_P(klass))
+        return NULL;
+    else
+        return rbgtk_lookup_class(klass);
+}
+
 static void
 gobj_mark(obj)
     GtkObject *obj;
@@ -293,6 +307,16 @@
     GtkObject *gtkobj;
 {
     VALUE klass  ;
+    GtkType gtype;
+
+    for (gtype  TK_OBJECT_TYPE(gtkobj);
+         gtype ! TK_TYPE_INVALID;
+         gtype  tk_type_parent(gtype))
+    {
+        VALUE klass  b_hash_aref(gtk_type_hash, INT2NUM(gtype));
+        if (!NIL_P(klass))
+            return klass;
+    }
 
     if (0);
     else if GTK_IS_ITEM_FACTORY(gtkobj) klass  ItemFactory;
@@ -750,6 +774,8 @@
     gtk_object_list_v  ata_Wrap_Struct(rb_cObject,
                                          rb_mark_tbl, st_free_table,
                                          gtk_object_list);
+    rb_global_variable(&gtk_type_hash);
+    gtk_type_hash  b_hash_new();
 
     /* IDs */
     id_gtkdata  b_intern("gtkdata");
diff -ur gtk-0.24.orig/src/rbgtk.h gtk-0.24/src/rbgtk.h
--- gtk-0.24.orig/src/rbgtk.h	Sat Jan 13 02:00:52 2001
+++ gtk-0.24/src/rbgtk.h	Thu Mar 29 00:37:28 2001
@@ -50,6 +50,7 @@
 
 extern void rbgtk_register_class(rbgtk_class_info *cinfo);
 extern rbgtk_class_info *rbgtk_lookup_class(VALUE klass);
+extern rbgtk_class_info *rbgtk_lookup_class_by_gtype(GtkType gtype);
 
 extern VALUE warn_handler;
 extern VALUE mesg_handler;

----Next_Part(Thu_Mar_29_01:19:47_2001_799)----