glib2 1.0.0-x86-mingw32 → 1.0.1-x86-mingw32
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/ChangeLog +107 -0
- data/ext/glib2/glib2.def +12 -1
- data/ext/glib2/rbglib.c +258 -69
- data/ext/glib2/rbglib.h +25 -5
- data/ext/glib2/rbglib_bookmarkfile.c +507 -519
- data/ext/glib2/rbglib_completion.c +4 -4
- data/ext/glib2/rbglib_error.c +1 -1
- data/ext/glib2/rbglib_i18n.c +1 -10
- data/ext/glib2/rbglib_iochannel.c +5 -1
- data/ext/glib2/rbglib_keyfile.c +103 -114
- data/ext/glib2/rbglib_maincontext.c +45 -13
- data/ext/glib2/rbglib_messages.c +2 -1
- data/ext/glib2/rbglib_shell.c +11 -19
- data/ext/glib2/rbglib_spawn.c +28 -110
- data/ext/glib2/rbglib_utils.c +5 -20
- data/ext/glib2/rbgobj_closure.c +3 -2
- data/ext/glib2/rbgobj_enums.c +37 -17
- data/ext/glib2/rbgobj_object.c +3 -3
- data/ext/glib2/rbgobj_param.c +2 -1
- data/ext/glib2/rbgobj_signal.c +9 -10
- data/ext/glib2/rbgobj_strv.c +9 -32
- data/ext/glib2/rbgobj_type.c +7 -6
- data/ext/glib2/rbgobj_typeinterface.c +142 -142
- data/ext/glib2/rbgobj_value.c +2 -1
- data/ext/glib2/rbgobj_valuearray.c +20 -15
- data/ext/glib2/rbgobj_valuetypes.c +3 -2
- data/ext/glib2/rbgobject.c +12 -12
- data/ext/glib2/rbgprivate.h +4 -0
- data/ext/glib2/rbgutil.h +14 -0
- data/ext/glib2/rbgutil_callback.c +22 -14
- data/lib/1.8/glib2.so +0 -0
- data/lib/1.9/glib2.so +0 -0
- data/lib/glib2.rb +30 -20
- data/lib/mkmf-gnome2.rb +6 -2
- data/test/glib-test-init.rb +1 -0
- metadata +4 -4
data/ext/glib2/rbgobj_object.c
CHANGED
@@ -184,7 +184,7 @@ gobj_mark(gpointer ptr)
|
|
184
184
|
guint n_properties;
|
185
185
|
GParamSpec** properties;
|
186
186
|
GValue gval = {0,};
|
187
|
-
|
187
|
+
guint i;
|
188
188
|
|
189
189
|
properties = g_object_class_list_properties(G_OBJECT_GET_CLASS(gobj), &n_properties);
|
190
190
|
|
@@ -292,7 +292,7 @@ gobj_new_body(struct param_setup_arg* arg)
|
|
292
292
|
static VALUE
|
293
293
|
gobj_new_ensure(struct param_setup_arg* arg)
|
294
294
|
{
|
295
|
-
|
295
|
+
guint i;
|
296
296
|
g_type_class_unref(arg->gclass);
|
297
297
|
for (i = 0; i < arg->param_size; i++) {
|
298
298
|
if (G_IS_VALUE(&arg->params[i].value))
|
@@ -396,7 +396,7 @@ gobj_s_properties(int argc, VALUE* argv, VALUE self)
|
|
396
396
|
GParamSpec** props;
|
397
397
|
VALUE inherited_too;
|
398
398
|
VALUE ary;
|
399
|
-
|
399
|
+
guint i;
|
400
400
|
|
401
401
|
if (rb_scan_args(argc, argv, "01", &inherited_too) == 0)
|
402
402
|
inherited_too = Qtrue;
|
data/ext/glib2/rbgobj_param.c
CHANGED
data/ext/glib2/rbgobj_signal.c
CHANGED
@@ -79,8 +79,7 @@ gobj_s_signal_new(int argc, VALUE* argv, VALUE self)
|
|
79
79
|
VALUE signal_name, signal_flags, accumulator, return_type, params;
|
80
80
|
GClosure* class_closure;
|
81
81
|
GType* param_types;
|
82
|
-
|
83
|
-
int i;
|
82
|
+
long i, n_params;
|
84
83
|
guint sig;
|
85
84
|
|
86
85
|
rb_scan_args(argc, argv, "4*", &signal_name, &signal_flags,
|
@@ -287,7 +286,7 @@ gobj_sig_get_invocation_hint(VALUE self)
|
|
287
286
|
}
|
288
287
|
#endif
|
289
288
|
|
290
|
-
struct emit_arg{
|
289
|
+
struct emit_arg {
|
291
290
|
VALUE self;
|
292
291
|
VALUE args;
|
293
292
|
|
@@ -307,7 +306,7 @@ emit_body(struct emit_arg* arg)
|
|
307
306
|
g_value_unset(¶m);
|
308
307
|
|
309
308
|
{
|
310
|
-
|
309
|
+
guint i;
|
311
310
|
for (i = 0; i < arg->query.n_params; i++){
|
312
311
|
GType gtype = arg->query.param_types[i] & ~G_SIGNAL_TYPE_STATIC_SCOPE;
|
313
312
|
|
@@ -370,7 +369,7 @@ gobj_sig_emit(int argc, VALUE *argv, VALUE self)
|
|
370
369
|
|
371
370
|
g_signal_query(signal_id, &arg.query);
|
372
371
|
|
373
|
-
if (arg.query.n_params != RARRAY_LEN(arg.args))
|
372
|
+
if (arg.query.n_params != (guint)RARRAY_LEN(arg.args))
|
374
373
|
rb_raise(rb_eArgError, "wrong number of arguments(%ld for %d)",
|
375
374
|
RARRAY_LEN(arg.args) + 1,
|
376
375
|
arg.query.n_params + 1);
|
@@ -484,7 +483,7 @@ chain_from_overridden_body(struct emit_arg* arg)
|
|
484
483
|
|
485
484
|
{
|
486
485
|
GValue* params = arg->instance_and_params->values + 1;
|
487
|
-
|
486
|
+
guint i;
|
488
487
|
for (i = 0; i < arg->query.n_params; i++) {
|
489
488
|
GType gtype = arg->query.param_types[i] & ~G_SIGNAL_TYPE_STATIC_SCOPE;
|
490
489
|
g_value_init(params + i, gtype);
|
@@ -526,7 +525,7 @@ gobj_sig_chain_from_overridden(int argc, VALUE *argv, VALUE self)
|
|
526
525
|
g_signal_query(hint->signal_id, &arg.query);
|
527
526
|
}
|
528
527
|
|
529
|
-
if (arg.query.n_params != argc)
|
528
|
+
if (arg.query.n_params != (guint)argc)
|
530
529
|
rb_raise(rb_eArgError, "wrong number of arguments(%d for %d)",
|
531
530
|
argc, arg.query.n_params);
|
532
531
|
|
@@ -687,7 +686,7 @@ query_param_types(VALUE self)
|
|
687
686
|
{
|
688
687
|
GSignalQuery* query;
|
689
688
|
VALUE result;
|
690
|
-
|
689
|
+
guint i;
|
691
690
|
Data_Get_Struct(self, GSignalQuery, query);
|
692
691
|
|
693
692
|
result = rb_ary_new2(query->n_params);
|
@@ -866,7 +865,7 @@ rbgobj_define_action_methods(VALUE klass)
|
|
866
865
|
GString* source;
|
867
866
|
guint n_ids;
|
868
867
|
guint* ids;
|
869
|
-
|
868
|
+
guint i;
|
870
869
|
|
871
870
|
if (gtype == G_TYPE_INTERFACE)
|
872
871
|
return;
|
@@ -884,7 +883,7 @@ rbgobj_define_action_methods(VALUE klass)
|
|
884
883
|
gchar* method_name = g_strdup(query.signal_name);
|
885
884
|
gchar* p;
|
886
885
|
GString* args;
|
887
|
-
|
886
|
+
guint j;
|
888
887
|
|
889
888
|
for (p = method_name; *p; p++)
|
890
889
|
if (*p == '-')
|
data/ext/glib2/rbgobj_strv.c
CHANGED
@@ -14,48 +14,25 @@
|
|
14
14
|
#if GLIB_CHECK_VERSION(2,6,0)
|
15
15
|
|
16
16
|
static VALUE
|
17
|
-
strv_to_ruby(const GValue*
|
17
|
+
strv_to_ruby(const GValue *from)
|
18
18
|
{
|
19
|
-
|
20
|
-
const gchar** boxed = (const gchar**)g_value_get_boxed(from);
|
21
|
-
if (!boxed)
|
22
|
-
return Qnil;
|
23
|
-
|
24
|
-
ary = rb_ary_new();
|
25
|
-
while (*boxed){
|
26
|
-
rb_ary_push(ary, CSTR2RVAL(*boxed));
|
27
|
-
boxed++;
|
28
|
-
}
|
29
|
-
return ary;
|
19
|
+
return STRV2RVAL((const gchar **)g_value_get_boxed(from));
|
30
20
|
}
|
31
21
|
|
32
22
|
static void
|
33
|
-
strv_from_ruby(VALUE from, GValue*
|
23
|
+
strv_from_ruby(VALUE from, GValue *to)
|
34
24
|
{
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
if (NIL_P(from)) {
|
39
|
-
g_value_set_boxed(to, NULL);
|
40
|
-
return;
|
41
|
-
}
|
42
|
-
|
43
|
-
Check_Type(from, T_ARRAY);
|
44
|
-
gstrv = g_new(gchar*, RARRAY_LEN(from) + 1);
|
45
|
-
|
46
|
-
for (i = 0; i < RARRAY_LEN(from); i++) {
|
47
|
-
VALUE v = RARRAY_PTR(from)[i];
|
48
|
-
gstrv[i] = g_strdup(StringValuePtr(v));
|
49
|
-
}
|
50
|
-
gstrv[RARRAY_LEN(from)] = NULL;
|
51
|
-
|
52
|
-
g_value_set_boxed(to, gstrv);
|
25
|
+
const gchar **strings = RVAL2STRV(from);
|
26
|
+
g_value_set_boxed(to, strings);
|
27
|
+
g_free(strings);
|
53
28
|
}
|
54
29
|
|
55
|
-
void
|
30
|
+
void
|
31
|
+
Init_gobject_gstrv()
|
56
32
|
{
|
57
33
|
/* GStrv is treated as Array */
|
58
34
|
rbgobj_register_g2r_func(G_TYPE_STRV, strv_to_ruby);
|
59
35
|
rbgobj_register_r2g_func(G_TYPE_STRV, strv_from_ruby);
|
60
36
|
}
|
37
|
+
|
61
38
|
#endif
|
data/ext/glib2/rbgobj_type.c
CHANGED
@@ -192,7 +192,7 @@ rbgobj_lookup_class_by_gtype_without_lock(GType gtype, VALUE parent,
|
|
192
192
|
if (G_TYPE_IS_INSTANTIATABLE(gtype)){
|
193
193
|
GType* interfaces = NULL;
|
194
194
|
guint n_interfaces = 0;
|
195
|
-
|
195
|
+
guint i;
|
196
196
|
|
197
197
|
interfaces = g_type_interfaces(gtype, &n_interfaces);
|
198
198
|
for (i = 0; i < n_interfaces; i++){
|
@@ -663,7 +663,7 @@ type_children(VALUE self)
|
|
663
663
|
guint n_children;
|
664
664
|
GType* types;
|
665
665
|
VALUE result;
|
666
|
-
|
666
|
+
guint i;
|
667
667
|
|
668
668
|
types = g_type_children(rbgobj_gtype_get(self), &n_children);
|
669
669
|
result = rb_ary_new2(n_children);
|
@@ -680,7 +680,7 @@ type_interfaces(VALUE self)
|
|
680
680
|
guint n_interfaces;
|
681
681
|
GType* types;
|
682
682
|
VALUE result;
|
683
|
-
|
683
|
+
guint i;
|
684
684
|
|
685
685
|
types = g_type_interfaces(rbgobj_gtype_get(self), &n_interfaces);
|
686
686
|
result = rb_ary_new2(n_interfaces);
|
@@ -708,8 +708,8 @@ type_instance_size(VALUE self)
|
|
708
708
|
}
|
709
709
|
|
710
710
|
|
711
|
-
static inline
|
712
|
-
|
711
|
+
static inline void
|
712
|
+
_def_fundamental_type(VALUE ary, GType gtype, const char* name)
|
713
713
|
{
|
714
714
|
VALUE c = rbgobj_gtype_new(gtype);
|
715
715
|
rb_define_const(rbgobj_cType, name, c);
|
@@ -798,7 +798,8 @@ Init_type()
|
|
798
798
|
|
799
799
|
/**********************************************************************/
|
800
800
|
|
801
|
-
void
|
801
|
+
void
|
802
|
+
Init_gobject_gtype()
|
802
803
|
{
|
803
804
|
g_type_init();
|
804
805
|
Init_typemap();
|
@@ -1,145 +1,145 @@
|
|
1
|
-
/* -*- c-file-style: "ruby"; indent-tabs-mode: nil -*- */
|
2
|
-
/**********************************************************************
|
3
|
-
|
4
|
-
rbgobj_typeinterface.c -
|
5
|
-
|
6
|
-
$Author: ggc $
|
7
|
-
$Date: 2007/07/13 16:07:28 $
|
8
|
-
created at: Sat May 27 16:04:13 JST 2006
|
9
|
-
|
10
|
-
Copyright (C) 2002-2006 Ruby-GNOME2 Project Team
|
11
|
-
Copyright (C) 2002,2003 Masahiro Sakai
|
12
|
-
|
13
|
-
**********************************************************************/
|
14
|
-
|
15
|
-
#include "rbgprivate.h"
|
16
|
-
|
17
|
-
VALUE rbgobj_mInterface;
|
18
|
-
VALUE mMetaInterface;
|
19
|
-
|
20
|
-
static VALUE
|
1
|
+
/* -*- c-file-style: "ruby"; indent-tabs-mode: nil -*- */
|
2
|
+
/**********************************************************************
|
3
|
+
|
4
|
+
rbgobj_typeinterface.c -
|
5
|
+
|
6
|
+
$Author: ggc $
|
7
|
+
$Date: 2007/07/13 16:07:28 $
|
8
|
+
created at: Sat May 27 16:04:13 JST 2006
|
9
|
+
|
10
|
+
Copyright (C) 2002-2006 Ruby-GNOME2 Project Team
|
11
|
+
Copyright (C) 2002,2003 Masahiro Sakai
|
12
|
+
|
13
|
+
**********************************************************************/
|
14
|
+
|
15
|
+
#include "rbgprivate.h"
|
16
|
+
|
17
|
+
VALUE rbgobj_mInterface;
|
18
|
+
VALUE mMetaInterface;
|
19
|
+
|
20
|
+
static VALUE
|
21
21
|
interface_s_append_features(VALUE self, VALUE klass)
|
22
|
-
{
|
23
|
-
if (!rb_obj_is_kind_of(klass, cInstantiatable))
|
24
|
-
rb_raise(rb_eTypeError, "Not a subclass of GLib::Instantiatable");
|
25
|
-
return rb_call_super(1, &klass);
|
26
|
-
}
|
27
|
-
|
28
|
-
#if GLIB_CHECK_VERSION(2,4,0)
|
29
|
-
|
30
|
-
static VALUE
|
22
|
+
{
|
23
|
+
if (!rb_obj_is_kind_of(klass, cInstantiatable))
|
24
|
+
rb_raise(rb_eTypeError, "Not a subclass of GLib::Instantiatable");
|
25
|
+
return rb_call_super(1, &klass);
|
26
|
+
}
|
27
|
+
|
28
|
+
#if GLIB_CHECK_VERSION(2,4,0)
|
29
|
+
|
30
|
+
static VALUE
|
31
31
|
interface_s_install_property(VALUE self, VALUE pspec_obj)
|
32
|
-
{
|
33
|
-
const RGObjClassInfo* cinfo = rbgobj_lookup_class(self);
|
34
|
-
gpointer ginterface;
|
35
|
-
GParamSpec* pspec;
|
36
|
-
|
37
|
-
if (cinfo->klass != self)
|
38
|
-
rb_raise(rb_eTypeError, "%s isn't registered class", rb_class2name(self));
|
39
|
-
|
40
|
-
pspec = G_PARAM_SPEC(RVAL2GOBJ(pspec_obj));
|
41
|
-
ginterface = g_type_default_interface_ref(cinfo->gtype);
|
42
|
-
g_object_interface_install_property(ginterface, pspec);
|
43
|
-
g_type_default_interface_unref(ginterface);
|
44
|
-
|
45
|
-
/* FIXME: define accessor methods */
|
46
|
-
return Qnil;
|
47
|
-
}
|
48
|
-
|
49
|
-
static VALUE
|
32
|
+
{
|
33
|
+
const RGObjClassInfo* cinfo = rbgobj_lookup_class(self);
|
34
|
+
gpointer ginterface;
|
35
|
+
GParamSpec* pspec;
|
36
|
+
|
37
|
+
if (cinfo->klass != self)
|
38
|
+
rb_raise(rb_eTypeError, "%s isn't registered class", rb_class2name(self));
|
39
|
+
|
40
|
+
pspec = G_PARAM_SPEC(RVAL2GOBJ(pspec_obj));
|
41
|
+
ginterface = g_type_default_interface_ref(cinfo->gtype);
|
42
|
+
g_object_interface_install_property(ginterface, pspec);
|
43
|
+
g_type_default_interface_unref(ginterface);
|
44
|
+
|
45
|
+
/* FIXME: define accessor methods */
|
46
|
+
return Qnil;
|
47
|
+
}
|
48
|
+
|
49
|
+
static VALUE
|
50
50
|
interface_s_property(VALUE self, VALUE property_name)
|
51
|
-
{
|
52
|
-
gpointer ginterface;
|
53
|
-
const char* name;
|
54
|
-
GParamSpec* prop;
|
55
|
-
VALUE result;
|
56
|
-
GType gtype = CLASS2GTYPE(self);
|
57
|
-
|
58
|
-
if (SYMBOL_P(property_name))
|
59
|
-
name = rb_id2name(SYM2ID(property_name));
|
60
|
-
else
|
61
|
-
name = StringValuePtr(property_name);
|
62
|
-
|
63
|
-
if (!G_TYPE_IS_INTERFACE(gtype))
|
64
|
-
rb_raise(rb_eTypeError, "%s isn't interface module", rb_class2name(self));
|
65
|
-
/* XXX: g_type_default_interface_ref(G_TYPE_INTERFACE) causes SEGV. */
|
66
|
-
if (gtype == G_TYPE_INTERFACE) {
|
67
|
-
rb_raise(rb_const_get(mGLib, rb_intern("NoPropertyError")),
|
68
|
-
"No such property: %s", name);
|
69
|
-
}
|
70
|
-
|
71
|
-
ginterface = g_type_default_interface_ref(gtype);
|
72
|
-
prop = g_object_interface_find_property(ginterface, name);
|
73
|
-
if (!prop){
|
74
|
-
g_type_default_interface_unref(ginterface);
|
75
|
-
rb_raise(rb_const_get(mGLib, rb_intern("NoPropertyError")),
|
76
|
-
"No such property: %s", name);
|
77
|
-
}
|
78
|
-
result = GOBJ2RVAL(prop);
|
79
|
-
g_type_default_interface_unref(ginterface);
|
80
|
-
|
81
|
-
return result;
|
82
|
-
}
|
83
|
-
|
84
|
-
static VALUE
|
85
|
-
interface_s_properties(int argc, VALUE* argv, VALUE self)
|
86
|
-
{
|
87
|
-
guint n_properties;
|
88
|
-
GParamSpec** props;
|
89
|
-
VALUE inherited_too;
|
90
|
-
VALUE ary = rb_ary_new();
|
91
|
-
|
92
|
-
gpointer ginterface;
|
93
|
-
GType gtype = CLASS2GTYPE(self);
|
94
|
-
|
95
|
-
if (rb_scan_args(argc, argv, "01", &inherited_too) == 0)
|
96
|
-
inherited_too = Qtrue;
|
97
|
-
|
98
|
-
if (!G_TYPE_IS_INTERFACE(gtype))
|
99
|
-
rb_raise(rb_eTypeError, "%s isn't interface module", rb_class2name(self));
|
100
|
-
/* XXX: g_type_default_interface_ref(G_TYPE_INTERFACE) causes SEGV. */
|
101
|
-
if (gtype == G_TYPE_INTERFACE) return ary;
|
102
|
-
|
103
|
-
ginterface = g_type_default_interface_ref(gtype);
|
104
|
-
props = g_object_interface_list_properties(ginterface, &n_properties);
|
105
|
-
for (i = 0; i < n_properties; i++){
|
106
|
-
if (RVAL2CBOOL(inherited_too) || GTYPE2CLASS(props[i]->owner_type) == self)
|
107
|
-
rb_ary_push(ary, rb_str_new2(props[i]->name));
|
108
|
-
}
|
109
|
-
g_free(props);
|
110
|
-
g_type_default_interface_unref(ginterface);
|
111
|
-
|
112
|
-
return ary;
|
113
|
-
}
|
114
|
-
|
115
|
-
#endif
|
116
|
-
|
117
|
-
void
|
118
|
-
rbgobj_init_interface(VALUE interf)
|
119
|
-
{
|
120
|
-
static VALUE rb_mGLibInterface = Qnil;
|
121
|
-
|
122
|
-
rb_extend_object(interf, mMetaInterface);
|
123
|
-
if (CLASS2GTYPE(interf) == G_TYPE_INTERFACE) {
|
124
|
-
rb_mGLibInterface = interf;
|
125
|
-
} else {
|
126
|
-
rb_extend_object(interf, rb_mGLibInterface);
|
127
|
-
rb_include_module(interf, rb_mGLibInterface);
|
128
|
-
rbgobj_define_property_accessors(interf);
|
129
|
-
}
|
130
|
-
}
|
131
|
-
|
132
|
-
void
|
133
|
-
Init_gobject_typeinterface()
|
134
|
-
{
|
135
|
-
mMetaInterface = rb_define_module_under(mGLib, "MetaInterface");
|
136
|
-
rb_define_method(mMetaInterface, "gtype", generic_s_gtype, 0);
|
137
|
-
rb_define_method(mMetaInterface, "append_features", interface_s_append_features, 1);
|
138
|
-
#if GLIB_CHECK_VERSION(2,4,0)
|
139
|
-
rb_define_method(mMetaInterface, "install_property", interface_s_install_property, 1);
|
140
|
-
rb_define_method(mMetaInterface, "property", interface_s_property, 1);
|
141
|
-
rb_define_method(mMetaInterface, "properties", interface_s_properties, -1);
|
142
|
-
#endif
|
143
|
-
|
144
|
-
rbgobj_mInterface = G_DEF_INTERFACE(G_TYPE_INTERFACE, "Interface", mGLib);
|
145
|
-
}
|
51
|
+
{
|
52
|
+
gpointer ginterface;
|
53
|
+
const char* name;
|
54
|
+
GParamSpec* prop;
|
55
|
+
VALUE result;
|
56
|
+
GType gtype = CLASS2GTYPE(self);
|
57
|
+
|
58
|
+
if (SYMBOL_P(property_name))
|
59
|
+
name = rb_id2name(SYM2ID(property_name));
|
60
|
+
else
|
61
|
+
name = StringValuePtr(property_name);
|
62
|
+
|
63
|
+
if (!G_TYPE_IS_INTERFACE(gtype))
|
64
|
+
rb_raise(rb_eTypeError, "%s isn't interface module", rb_class2name(self));
|
65
|
+
/* XXX: g_type_default_interface_ref(G_TYPE_INTERFACE) causes SEGV. */
|
66
|
+
if (gtype == G_TYPE_INTERFACE) {
|
67
|
+
rb_raise(rb_const_get(mGLib, rb_intern("NoPropertyError")),
|
68
|
+
"No such property: %s", name);
|
69
|
+
}
|
70
|
+
|
71
|
+
ginterface = g_type_default_interface_ref(gtype);
|
72
|
+
prop = g_object_interface_find_property(ginterface, name);
|
73
|
+
if (!prop){
|
74
|
+
g_type_default_interface_unref(ginterface);
|
75
|
+
rb_raise(rb_const_get(mGLib, rb_intern("NoPropertyError")),
|
76
|
+
"No such property: %s", name);
|
77
|
+
}
|
78
|
+
result = GOBJ2RVAL(prop);
|
79
|
+
g_type_default_interface_unref(ginterface);
|
80
|
+
|
81
|
+
return result;
|
82
|
+
}
|
83
|
+
|
84
|
+
static VALUE
|
85
|
+
interface_s_properties(int argc, VALUE* argv, VALUE self)
|
86
|
+
{
|
87
|
+
guint n_properties;
|
88
|
+
GParamSpec** props;
|
89
|
+
VALUE inherited_too;
|
90
|
+
VALUE ary = rb_ary_new();
|
91
|
+
guint i;
|
92
|
+
gpointer ginterface;
|
93
|
+
GType gtype = CLASS2GTYPE(self);
|
94
|
+
|
95
|
+
if (rb_scan_args(argc, argv, "01", &inherited_too) == 0)
|
96
|
+
inherited_too = Qtrue;
|
97
|
+
|
98
|
+
if (!G_TYPE_IS_INTERFACE(gtype))
|
99
|
+
rb_raise(rb_eTypeError, "%s isn't interface module", rb_class2name(self));
|
100
|
+
/* XXX: g_type_default_interface_ref(G_TYPE_INTERFACE) causes SEGV. */
|
101
|
+
if (gtype == G_TYPE_INTERFACE) return ary;
|
102
|
+
|
103
|
+
ginterface = g_type_default_interface_ref(gtype);
|
104
|
+
props = g_object_interface_list_properties(ginterface, &n_properties);
|
105
|
+
for (i = 0; i < n_properties; i++){
|
106
|
+
if (RVAL2CBOOL(inherited_too) || GTYPE2CLASS(props[i]->owner_type) == self)
|
107
|
+
rb_ary_push(ary, rb_str_new2(props[i]->name));
|
108
|
+
}
|
109
|
+
g_free(props);
|
110
|
+
g_type_default_interface_unref(ginterface);
|
111
|
+
|
112
|
+
return ary;
|
113
|
+
}
|
114
|
+
|
115
|
+
#endif
|
116
|
+
|
117
|
+
void
|
118
|
+
rbgobj_init_interface(VALUE interf)
|
119
|
+
{
|
120
|
+
static VALUE rb_mGLibInterface = Qnil;
|
121
|
+
|
122
|
+
rb_extend_object(interf, mMetaInterface);
|
123
|
+
if (CLASS2GTYPE(interf) == G_TYPE_INTERFACE) {
|
124
|
+
rb_mGLibInterface = interf;
|
125
|
+
} else {
|
126
|
+
rb_extend_object(interf, rb_mGLibInterface);
|
127
|
+
rb_include_module(interf, rb_mGLibInterface);
|
128
|
+
rbgobj_define_property_accessors(interf);
|
129
|
+
}
|
130
|
+
}
|
131
|
+
|
132
|
+
void
|
133
|
+
Init_gobject_typeinterface()
|
134
|
+
{
|
135
|
+
mMetaInterface = rb_define_module_under(mGLib, "MetaInterface");
|
136
|
+
rb_define_method(mMetaInterface, "gtype", generic_s_gtype, 0);
|
137
|
+
rb_define_method(mMetaInterface, "append_features", interface_s_append_features, 1);
|
138
|
+
#if GLIB_CHECK_VERSION(2,4,0)
|
139
|
+
rb_define_method(mMetaInterface, "install_property", interface_s_install_property, 1);
|
140
|
+
rb_define_method(mMetaInterface, "property", interface_s_property, 1);
|
141
|
+
rb_define_method(mMetaInterface, "properties", interface_s_properties, -1);
|
142
|
+
#endif
|
143
|
+
|
144
|
+
rbgobj_mInterface = G_DEF_INTERFACE(G_TYPE_INTERFACE, "Interface", mGLib);
|
145
|
+
}
|