----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(>k_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)----