]>
Commit | Line | Data |
---|---|---|
e04b3ea7 | 1 | Index: glib/extconf.rb |
2 | =================================================================== | |
3 | RCS file: /cvsroot/ruby-gnome2/ruby-gnome2/glib/extconf.rb,v | |
4 | retrieving revision 1.18 | |
5 | diff -u -r1.18 extconf.rb | |
6 | --- glib/extconf.rb 27 Aug 2003 17:48:05 -0000 1.18 | |
7 | +++ glib/extconf.rb 16 Sep 2003 19:09:25 -0000 | |
8 | @@ -18,6 +18,13 @@ | |
9 | Dir.chdir "src" | |
10 | begin | |
11 | $defs << "-DRUBY_GLIB2_COMPILATION" | |
12 | + print "enabling experimental glib features... " | |
13 | + if enable_config('glib-experimental') | |
14 | + puts "yes" | |
15 | + $defs << "-DRBGLIB_ENABLE_EXPERIMENTAL" | |
16 | + else | |
17 | + puts "no" | |
18 | + end | |
19 | create_makefile("glib2", srcdir) | |
20 | ensure | |
21 | Dir.chdir('..') | |
22 | Index: glib/src/rbgobj_object.c | |
23 | =================================================================== | |
24 | RCS file: /cvsroot/ruby-gnome2/ruby-gnome2/glib/src/rbgobj_object.c,v | |
25 | retrieving revision 1.52 | |
26 | diff -u -r1.52 rbgobj_object.c | |
27 | --- glib/src/rbgobj_object.c 3 Sep 2003 07:11:02 -0000 1.52 | |
28 | +++ glib/src/rbgobj_object.c 16 Sep 2003 19:09:29 -0000 | |
29 | @@ -555,11 +555,42 @@ | |
30 | } | |
31 | } | |
32 | ||
33 | +VALUE rbgobj_iface_dispatch(VALUE obj, ID func, VALUE args) | |
34 | +{ | |
35 | + volatile VALUE val = rb_funcall2(obj, func, RARRAY(args)->len, RARRAY(args)->ptr); | |
36 | + | |
37 | + printf("Returning: "); | |
38 | + rb_p(val); | |
39 | + return val; | |
40 | +} | |
41 | + | |
42 | +static VALUE | |
43 | +register_implements_interface(int argc, VALUE* argv, VALUE self) | |
44 | +{ | |
45 | + VALUE interface; | |
46 | + const RGObjClassInfo* cinfo = rbgobj_lookup_class(self); | |
47 | + const RGObjClassInfo* iinfo; | |
48 | + | |
49 | + if (cinfo->klass != self) | |
50 | + rb_raise(rb_eTypeError, "not a registered GObjectClass"); | |
51 | + | |
52 | + rb_scan_args(argc, argv, "10", &interface); | |
53 | + | |
54 | + iinfo = rbgobj_lookup_class(interface); | |
55 | + | |
56 | + if (iinfo->table == NULL) | |
57 | + rb_notimplement(); | |
58 | + | |
59 | + g_type_add_interface_static(cinfo->gtype, iinfo->gtype, iinfo->table); | |
60 | + return Qnil; | |
61 | +} | |
62 | + | |
63 | static void | |
64 | Init_gobject_subclass() | |
65 | { | |
66 | VALUE cGObject = GTYPE2CLASS(G_TYPE_OBJECT); | |
67 | rb_define_singleton_method(cGObject, "register_type", register_type, -1); | |
68 | + rb_define_singleton_method(cGObject, "implements", register_implements_interface, -1); | |
69 | ||
70 | rb_global_variable(&proc_mod_eval); | |
71 | proc_mod_eval = rb_eval_string("lambda{|obj,proc| obj.module_eval(&proc)}"); | |
72 | Index: glib/src/rbgobj_type.c | |
73 | =================================================================== | |
74 | RCS file: /cvsroot/ruby-gnome2/ruby-gnome2/glib/src/rbgobj_type.c,v | |
75 | retrieving revision 1.42 | |
76 | diff -u -r1.42 rbgobj_type.c | |
77 | --- glib/src/rbgobj_type.c 20 Aug 2003 16:52:57 -0000 1.42 | |
78 | +++ glib/src/rbgobj_type.c 16 Sep 2003 19:09:31 -0000 | |
79 | @@ -77,10 +77,12 @@ | |
80 | rbgobj_lookup_class_by_gtype(gtype) | |
81 | GType gtype; | |
82 | { | |
83 | - RGObjClassInfo* cinfo; | |
84 | + RGObjClassInfo* cinfo=NULL; | |
85 | VALUE c = rb_hash_aref(gtype_to_cinfo, INT2NUM(gtype)); | |
86 | ||
87 | - if (!NIL_P(c)){ | |
88 | + /*fprintf(stderr, "rbgobjlookup_pre; %p : 0%lx -> 0%lx\n", gtype_to_cinfo, gtype, c); | |
89 | + fflush(0);*/ | |
90 | + if (!NIL_P(c) && (TYPE(c) == T_DATA)){ | |
91 | Data_Get_Struct(c, RGObjClassInfo, cinfo); | |
92 | } else { | |
93 | void* gclass = NULL; | |
94 | @@ -107,8 +109,7 @@ | |
95 | ||
96 | default: | |
97 | /* we should raise exception? */ | |
98 | - fprintf(stderr, | |
99 | - "%s: %s's fundamental type %s isn't supported\n", | |
100 | + rb_warn("%s: %s's fundamental type %s isn't supported\n", | |
101 | "rbgobj_lookup_class_by_gtype", | |
102 | g_type_name(gtype), | |
103 | g_type_name(G_TYPE_FUNDAMENTAL(gtype))); | |
104 | @@ -119,6 +120,7 @@ | |
105 | cinfo->mark = NULL; | |
106 | cinfo->free = NULL; | |
107 | cinfo->flags = 0; | |
108 | + cinfo->table = NULL; | |
109 | ||
110 | rb_hash_aset(klass_to_cinfo, cinfo->klass, c); | |
111 | rb_hash_aset(gtype_to_cinfo, INT2NUM(gtype), c); | |
112 | @@ -704,10 +706,10 @@ | |
113 | id_new = rb_intern("new"); | |
114 | id_superclass = rb_intern("superclass"); | |
115 | ||
116 | - rb_global_variable(>ype_to_cinfo); | |
117 | - rb_global_variable(&klass_to_cinfo); | |
118 | gtype_to_cinfo = rb_hash_new(); | |
119 | klass_to_cinfo = rb_hash_new(); | |
120 | + rb_global_variable(>ype_to_cinfo); | |
121 | + rb_global_variable(&klass_to_cinfo); | |
122 | ||
123 | _register_fundamental_klass_to_gtype(rb_cFixnum, G_TYPE_LONG); | |
124 | _register_fundamental_klass_to_gtype(rb_cFloat, G_TYPE_DOUBLE); | |
125 | Index: glib/src/rbgobject.c | |
126 | =================================================================== | |
127 | RCS file: /cvsroot/ruby-gnome2/ruby-gnome2/glib/src/rbgobject.c,v | |
128 | retrieving revision 1.33 | |
129 | diff -u -r1.33 rbgobject.c | |
130 | --- glib/src/rbgobject.c 25 Aug 2003 01:50:30 -0000 1.33 | |
131 | +++ glib/src/rbgobject.c 16 Sep 2003 19:09:32 -0000 | |
132 | @@ -136,7 +136,7 @@ | |
133 | } | |
134 | g_object_unref(holder->gobj); | |
135 | } | |
136 | - free(holder); | |
137 | + g_free(holder); | |
138 | } | |
139 | ||
140 | VALUE | |
141 | Index: glib/src/rbgobject.h | |
142 | =================================================================== | |
143 | RCS file: /cvsroot/ruby-gnome2/ruby-gnome2/glib/src/rbgobject.h,v | |
144 | retrieving revision 1.46 | |
145 | diff -u -r1.46 rbgobject.h | |
146 | --- glib/src/rbgobject.h 3 Sep 2003 07:11:02 -0000 1.46 | |
147 | +++ glib/src/rbgobject.h 16 Sep 2003 19:09:32 -0000 | |
148 | @@ -83,6 +83,7 @@ | |
149 | void (*mark)(gpointer); | |
150 | void (*free)(gpointer); | |
151 | int flags; /* RGObjClassFlag */ | |
152 | + gpointer table; /* For interfaces */ | |
153 | } RGObjClassInfo; | |
154 | ||
155 | /* rbgobject.c */ | |
156 | @@ -147,6 +148,9 @@ | |
157 | /* rbgobj_object.c */ | |
158 | extern void rbgobj_register_property_setter(GType gtype, const char* prop_name, RValueToGValueFunc func); | |
159 | extern void rbgobj_register_property_getter(GType gtype, const char* prop_name, GValueToRValueFunc func); | |
160 | +#ifdef RBGLIB_ENABLE_EXPERIMENTAL | |
161 | +extern VALUE rbgobj_iface_dispatch(VALUE obj, ID function, VALUE args); | |
162 | +#endif | |
163 | ||
164 | /* rbgobj_boxed.c */ | |
165 | extern VALUE rbgobj_boxed_create(VALUE klass); | |
166 | Index: gtk/extconf.rb | |
167 | =================================================================== | |
168 | RCS file: /cvsroot/ruby-gnome2/ruby-gnome2/gtk/extconf.rb,v | |
169 | retrieving revision 1.43 | |
170 | diff -u -r1.43 extconf.rb | |
171 | --- gtk/extconf.rb 30 Aug 2003 13:22:40 -0000 1.43 | |
172 | +++ gtk/extconf.rb 16 Sep 2003 19:09:34 -0000 | |
173 | @@ -63,6 +63,13 @@ | |
174 | # | |
175 | # create Makefiles | |
176 | # | |
177 | +print "enabling experimental glib features... " | |
178 | +if enable_config('glib-experimental') | |
179 | + puts "yes" | |
180 | + $defs << "-DRBGLIB_ENABLE_EXPERIMENTAL" | |
181 | +else | |
182 | + puts "no" | |
183 | +end | |
184 | ||
185 | begin | |
186 | src_dir = File.expand_path(File.dirname(__FILE__) + '/src') | |
187 | Index: gtk/src/rbgdkatom.c | |
188 | =================================================================== | |
189 | RCS file: /cvsroot/ruby-gnome2/ruby-gnome2/gtk/src/rbgdkatom.c,v | |
190 | retrieving revision 1.8 | |
191 | diff -u -r1.8 rbgdkatom.c | |
192 | --- gtk/src/rbgdkatom.c 17 Aug 2003 08:46:06 -0000 1.8 | |
193 | +++ gtk/src/rbgdkatom.c 16 Sep 2003 19:09:34 -0000 | |
194 | @@ -58,8 +58,14 @@ | |
195 | ||
196 | rb_scan_args(argc, argv, "11", &name, &exist); | |
197 | ||
198 | - return BOXED2RVAL(gdk_atom_intern(RVAL2CSTR(name), RTEST(exist)), | |
199 | + | |
200 | + if (TYPE(name) == T_STRING) | |
201 | + return BOXED2RVAL(gdk_atom_intern(RVAL2CSTR(name), RTEST(exist)), | |
202 | GDK_TYPE_ATOM); | |
203 | + else if (TYPE(name) == T_FIXNUM) | |
204 | + return BOXED2RVAL((GdkAtom)FIX2INT(name), GDK_TYPE_ATOM); | |
205 | + else | |
206 | + rb_raise(rb_eTypeError, "Gdk::Atom.intern requires either a String or a Fixnum"); | |
207 | } | |
208 | ||
209 | static VALUE | |
210 | @@ -76,6 +82,21 @@ | |
211 | } | |
212 | ||
213 | static VALUE | |
214 | +gdkatom_to_i(self) | |
215 | + VALUE self; | |
216 | +{ | |
217 | + return UINT2NUM(_SELF(self)); | |
218 | +} | |
219 | + | |
220 | + | |
221 | +static VALUE | |
222 | +gdkatom_nil(self) | |
223 | + VALUE self; | |
224 | +{ | |
225 | + return UINT2NUM(_SELF(self)) == 0 ? Qtrue : Qfalse; | |
226 | +} | |
227 | + | |
228 | +static VALUE | |
229 | gdkatom_eq(self, other) | |
230 | VALUE self, other; | |
231 | { | |
232 | @@ -90,6 +111,8 @@ | |
233 | rb_define_singleton_method(gdkAtom, "intern", gdkatom_s_intern, -1); | |
234 | ||
235 | rb_define_method(gdkAtom, "name", gdkatom_name, 0); | |
236 | + rb_define_method(gdkAtom, "to_i", gdkatom_to_i, 0); | |
237 | + rb_define_method(gdkAtom, "nil?", gdkatom_nil, 0); | |
238 | rb_define_method(gdkAtom, "==", gdkatom_eq, 1); | |
239 | rb_define_method(gdkAtom, "===", gdkatom_eq, 1); | |
240 | rb_define_method(gdkAtom, "eql?", gdkatom_eq, 1); | |
241 | Index: gtk/src/rbgtk.h | |
242 | =================================================================== | |
243 | RCS file: /cvsroot/ruby-gnome2/ruby-gnome2/gtk/src/rbgtk.h,v | |
244 | retrieving revision 1.50 | |
245 | diff -u -r1.50 rbgtk.h | |
246 | --- gtk/src/rbgtk.h 22 Jun 2003 17:37:51 -0000 1.50 | |
247 | +++ gtk/src/rbgtk.h 16 Sep 2003 19:09:35 -0000 | |
248 | @@ -18,6 +18,7 @@ | |
249 | #include "ruby.h" | |
250 | #include "rubysig.h" | |
251 | #include "rbgobject.h" | |
252 | +#include "rbgutil.h" | |
253 | #include <gtk/gtk.h> | |
254 | ||
255 | #include <signal.h> | |
256 | Index: gtk/src/rbgtkitemfactory.c | |
257 | =================================================================== | |
258 | RCS file: /cvsroot/ruby-gnome2/ruby-gnome2/gtk/src/rbgtkitemfactory.c,v | |
259 | retrieving revision 1.20 | |
260 | diff -u -r1.20 rbgtkitemfactory.c | |
261 | --- gtk/src/rbgtkitemfactory.c 4 Jul 2003 18:34:04 -0000 1.20 | |
262 | +++ gtk/src/rbgtkitemfactory.c 16 Sep 2003 19:09:36 -0000 | |
263 | @@ -27,7 +27,7 @@ | |
264 | VALUE obj = rb_eval_string("eval('self', binding)"); | |
265 | G_RELATIVE(obj, self); | |
266 | RBGTK_INITIALIZE(self, gtk_item_factory_new(FIX2INT(type), RVAL2CSTR(path), | |
267 | - RVAL2ACCEL(accel))); | |
268 | + NIL_P(accel) ? NULL : RVAL2ACCEL(accel))); | |
269 | ||
270 | return Qnil; | |
271 | } | |
272 | Index: gtk/src/rbgtktextmark.c | |
273 | =================================================================== | |
274 | RCS file: /cvsroot/ruby-gnome2/ruby-gnome2/gtk/src/rbgtktextmark.c,v | |
275 | retrieving revision 1.6 | |
276 | diff -u -r1.6 rbgtktextmark.c | |
277 | --- gtk/src/rbgtktextmark.c 19 Jan 2003 14:28:25 -0000 1.6 | |
278 | +++ gtk/src/rbgtktextmark.c 16 Sep 2003 19:09:36 -0000 | |
279 | @@ -30,7 +30,9 @@ | |
280 | get_name(self) | |
281 | VALUE self; | |
282 | { | |
283 | - return rb_str_new2(gtk_text_mark_get_name(GTK_TEXT_MARK(RVAL2GOBJ(self)))); | |
284 | + gchar *name; | |
285 | + name = gtk_text_mark_get_name(GTK_TEXT_MARK(RVAL2GOBJ(self))); | |
286 | + return name ? rb_str_new2(name) : Qnil; | |
287 | } | |
288 | ||
289 | static VALUE | |
290 | Index: gtk/src/rbgtktreeiter.c | |
291 | =================================================================== | |
292 | RCS file: /cvsroot/ruby-gnome2/ruby-gnome2/gtk/src/rbgtktreeiter.c,v | |
293 | retrieving revision 1.16 | |
294 | diff -u -r1.16 rbgtktreeiter.c | |
295 | --- gtk/src/rbgtktreeiter.c 9 Sep 2003 15:17:22 -0000 1.16 | |
296 | +++ gtk/src/rbgtktreeiter.c 16 Sep 2003 19:09:36 -0000 | |
297 | @@ -201,11 +201,78 @@ | |
298 | return Qtrue; | |
299 | } | |
300 | ||
301 | +#ifdef RBGLIB_ENABLE_EXPERIMENTAL | |
302 | +#define SIG ((gpointer)123456) | |
303 | + | |
304 | +static VALUE | |
305 | +treeiter_initialize(self,model) | |
306 | + VALUE self,model; | |
307 | +{ | |
308 | + GtkTreeIter iter = { 0, NULL, NULL, NULL }; | |
309 | + iter.user_data3 = RVAL2GOBJ(model); | |
310 | + G_INITIALIZE(self, &iter); | |
311 | + return Qnil; | |
312 | +} | |
313 | + | |
314 | +static VALUE | |
315 | +treeiter_stamp(self) | |
316 | + VALUE self; | |
317 | +{ | |
318 | + return LONG2NUM(_SELF(self)->stamp); | |
319 | +} | |
320 | + | |
321 | +static VALUE | |
322 | +treeiter_user_data(self) | |
323 | + VALUE self; | |
324 | +{ | |
325 | + GtkTreeIter *iter = _SELF(self); | |
326 | + /*if (iter->user_data2 == SIG) | |
327 | + return (VALUE)(iter->user_data); | |
328 | + else*/ | |
329 | + return LONG2NUM((long)iter->user_data); | |
330 | +} | |
331 | + | |
332 | +static VALUE | |
333 | +treeiter_set_stamp(self, val) | |
334 | + VALUE self, val; | |
335 | +{ | |
336 | + _SELF(self)->stamp = NUM2LONG(val); | |
337 | + return self; | |
338 | +} | |
339 | + | |
340 | +static VALUE | |
341 | +treeiter_set_user_data(self, val) | |
342 | + VALUE self, val; | |
343 | +{ | |
344 | + GtkTreeIter *iter = _SELF(self); | |
345 | + /*if (TYPE(val) == T_FIXNUM) | |
346 | + {*/ | |
347 | + iter->user_data = (gpointer)NUM2LONG(val); | |
348 | + /*iter->user_data2 = 0; | |
349 | + } | |
350 | + else | |
351 | + { | |
352 | + // Another reference *must* be kept elsewhere or this may be GC'd | |
353 | + iter->user_data = (gpointer)val; | |
354 | + iter->user_data2 = SIG; | |
355 | + }*/ | |
356 | + return val; | |
357 | +} | |
358 | +#endif | |
359 | + | |
360 | void | |
361 | Init_gtk_treeiter() | |
362 | { | |
363 | VALUE gTreeIter = G_DEF_CLASS(GTK_TYPE_TREE_ITER, "TreeIter", mGtk); | |
364 | ||
365 | +#ifdef RBGLIB_ENABLE_EXPERIMENTAL | |
366 | + rb_define_method(gTreeIter, "initialize", treeiter_initialize, 1); | |
367 | + rb_define_method(gTreeIter, "stamp", treeiter_stamp, 0); | |
368 | + rb_define_method(gTreeIter, "user_data", treeiter_user_data, 0); | |
369 | + rb_define_method(gTreeIter, "stamp=", treeiter_set_stamp, 1); | |
370 | + rb_define_method(gTreeIter, "user_data=", treeiter_set_user_data, 1); | |
371 | +#endif | |
372 | + | |
373 | rb_define_method(gTreeIter, "first!", treeiter_first, 0); | |
374 | rb_define_method(gTreeIter, "next!", treeiter_next, 0); | |
375 | rb_define_method(gTreeIter, "get_value", treeiter_get_value, 1); | |
376 | Index: gtk/src/rbgtktreemodel.c | |
377 | =================================================================== | |
378 | RCS file: /cvsroot/ruby-gnome2/ruby-gnome2/gtk/src/rbgtktreemodel.c,v | |
379 | retrieving revision 1.20 | |
380 | diff -u -r1.20 rbgtktreemodel.c | |
381 | --- gtk/src/rbgtktreemodel.c 31 Aug 2003 15:29:44 -0000 1.20 | |
382 | +++ gtk/src/rbgtktreemodel.c 16 Sep 2003 19:09:37 -0000 | |
383 | @@ -201,10 +201,28 @@ | |
384 | return rb_ary_new3(4, GOBJ2RVAL(model), TREEPATH2RVAL(path), ITR2RVAL(iter), orders); | |
385 | } | |
386 | ||
387 | +static VALUE mTreeModel = Qnil; | |
388 | + | |
389 | +#ifdef RBGLIB_ENABLE_EXPERIMENTAL | |
390 | + #include "treemodel.iface.h" | |
391 | +#endif | |
392 | + | |
393 | void | |
394 | Init_gtk_treemodel() | |
395 | { | |
396 | - VALUE mTreeModel = G_DEF_INTERFACE(GTK_TYPE_TREE_MODEL, "TreeModel", mGtk); | |
397 | + mTreeModel = G_DEF_INTERFACE(GTK_TYPE_TREE_MODEL, "TreeModel", mGtk); | |
398 | + | |
399 | +#ifdef RBGLIB_ENABLE_EXPERIMENTAL | |
400 | + { | |
401 | + RGObjClassInfo* cinfo=(RGObjClassInfo*)rbgobj_lookup_class_by_gtype(GTK_TYPE_TREE_MODEL); | |
402 | + static GInterfaceInfo treemodel_iface_info = { | |
403 | + (GInterfaceInitFunc) rbglib_GtkTreeModel__interface_init, /* interface_init */ | |
404 | + NULL, /* interface_finalize */ | |
405 | + NULL /* interface_finalize */ | |
406 | + }; | |
407 | + cinfo->table = &treemodel_iface_info; | |
408 | + } | |
409 | +#endif | |
410 | ||
411 | rb_define_method(mTreeModel, "flags", treemodel_get_flags, 0); | |
412 | rb_define_method(mTreeModel, "n_columns", treemodel_get_n_columns, 0); |