1 /* -*- mode: C; c-basic-offset: 4 -*- */
3 #include <glib-object.h>
5 static guint foo_signal_id = 0;
6 static guint bar_signal_id = 0;
9 static GType test_i_get_type (void);
10 static GType test_a_get_type (void);
11 static GType test_b_get_type (void);
12 static GType test_c_get_type (void);
14 #define TEST_TYPE_I (test_i_get_type ())
15 #define TEST_I(object) (G_TYPE_CHECK_INSTANCE_CAST((object), TEST_TYPE_I, TestI))
16 #define TEST_I_CLASS(vtable) (G_TYPE_CHECK_CLASS_CAST((vtable), TEST_TYPE_I, TestIClass))
17 #define TEST_IS_I(object) (G_TYPE_CHECK_INSTANCE_TYPE((object), TEST_TYPE_I))
18 #define TEST_IS_I_CLASS(vtable) (G_TYPE_CHECK_CLASS_TYPE((vtable), TEST_TYPE_I))
19 #define TEST_I_GET_CLASS(object) (G_TYPE_INSTANCE_GET_INTERFACE((object), TEST_TYPE_I, TestIClass))
21 typedef struct _TestI TestI;
22 typedef struct _TestIClass TestIClass;
25 GTypeInterface base_iface;
29 test_i_foo (TestI *self)
31 g_print("TestI::foo called.\n");
36 test_i_base_init (gpointer g_class)
38 static gboolean initialised = FALSE;
41 foo_signal_id = g_signal_newv("foo",
44 g_cclosure_new(G_CALLBACK(test_i_foo),
47 g_cclosure_marshal_VOID__VOID,
48 G_TYPE_NONE, 0, NULL);
54 test_i_get_type (void)
56 static GType type = 0;
59 static const GTypeInfo type_info = {
61 (GBaseInitFunc) test_i_base_init, /* base_init */
62 NULL, /* base_finalize */
65 type = g_type_register_static (G_TYPE_INTERFACE, "TestI",
74 #define TEST_TYPE_A (test_a_get_type())
75 #define TEST_A(object) (G_TYPE_CHECK_INSTANCE_CAST((object), TEST_TYPE_A, TestA))
76 #define TEST_A_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass), TEST_TYPE_A, TestAClass))
77 #define TEST_IS_A(object) (G_TYPE_CHECK_INSTANCE_TYPE((object), TEST_TYPE_A))
78 #define TEST_IS_A_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass), TEST_TYPE_A))
79 #define TEST_A_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), TEST_TYPE_A, TestAClass))
81 typedef struct _TestA TestA;
82 typedef struct _TestAClass TestAClass;
88 GObjectClass parent_class;
90 void (* bar) (TestA *self);
94 test_a_foo (TestI *self)
96 GValue args[1] = { { 0, } };
98 g_print("TestA::foo called. Chaining up.\n");
100 g_value_init (&args[0], TEST_TYPE_A);
101 g_value_set_object (&args[0], self);
103 g_signal_chain_from_overridden (args, foo_signal_id, NULL);
105 g_value_unset (&args[0]);
109 test_a_bar (TestA *self)
111 g_print("TestA::bar called.\n");
115 test_a_class_init (TestAClass *class)
117 class->bar = test_a_bar;
119 bar_signal_id = g_signal_new("bar",
122 G_STRUCT_OFFSET (TestAClass, bar),
124 g_cclosure_marshal_VOID__VOID,
129 test_a_interface_init (TestIClass *iface)
131 g_signal_override_class_closure (foo_signal_id,
133 g_cclosure_new (G_CALLBACK (test_a_foo),
138 test_a_get_type (void)
140 static GType type = 0;
143 static const GTypeInfo type_info = {
145 (GBaseInitFunc) NULL,
146 (GBaseFinalizeFunc) NULL,
147 (GClassInitFunc) test_a_class_init,
148 NULL, /* class_finalize */
149 NULL, /* class_data */
152 (GInstanceInitFunc) NULL,
154 static const GInterfaceInfo interface_info = {
155 (GInterfaceInitFunc) test_a_interface_init,
160 type = g_type_register_static (G_TYPE_OBJECT, "TestA",
162 g_type_add_interface_static (type, TEST_TYPE_I, &interface_info);
169 #define TEST_TYPE_B (test_b_get_type())
170 #define TEST_B(object) (G_TYPE_CHECK_INSTANCE_CAST((object), TEST_TYPE_B, TestB))
171 #define TEST_B_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass), TEST_TYPE_B, TestBClass))
172 #define TEST_IS_B(object) (G_TYPE_CHECK_INSTANCE_TYPE((object), TEST_TYPE_B))
173 #define TEST_IS_B_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass), TEST_TYPE_B))
174 #define TEST_B_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), TEST_TYPE_B, TestBClass))
176 typedef struct _TestB TestB;
177 typedef struct _TestBClass TestBClass;
183 TestAClass parent_class;
187 test_b_foo (TestA *self)
189 GValue args[1] = { { 0, } };
191 g_print("TestB::foo called. Chaining up.\n");
193 g_value_init (&args[0], TEST_TYPE_A);
194 g_value_set_object (&args[0], self);
196 g_signal_chain_from_overridden (args, foo_signal_id, NULL);
198 g_value_unset (&args[0]);
202 test_b_bar (TestI *self)
204 GValue args[1] = { { 0, } };
206 g_print("TestB::bar called. Chaining up.\n");
208 g_value_init (&args[0], TEST_TYPE_A);
209 g_value_set_object (&args[0], self);
211 g_signal_chain_from_overridden (args, bar_signal_id, NULL);
213 g_value_unset (&args[0]);
217 test_b_class_init (TestBClass *class)
219 g_signal_override_class_closure (foo_signal_id,
221 g_cclosure_new (G_CALLBACK (test_b_foo),
223 g_signal_override_class_closure (bar_signal_id,
225 g_cclosure_new (G_CALLBACK (test_b_bar),
230 test_b_get_type (void)
232 static GType type = 0;
235 static const GTypeInfo type_info = {
237 (GBaseInitFunc) NULL,
238 (GBaseFinalizeFunc) NULL,
239 (GClassInitFunc) test_b_class_init,
240 NULL, /* class_finalize */
241 NULL, /* class_data */
244 (GInstanceInitFunc) NULL,
247 type = g_type_register_static (TEST_TYPE_A, "TestB",
255 #define TEST_TYPE_C (test_c_get_type())
256 #define TEST_C(object) (G_TYPE_CHECK_INSTANCE_CAST((object), TEST_TYPE_C, TestC))
257 #define TEST_C_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass), TEST_TYPE_C, TestCClass))
258 #define TEST_IS_C(object) (G_TYPE_CHECK_INSTANCE_TYPE((object), TEST_TYPE_C))
259 #define TEST_IS_C_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass), TEST_TYPE_C))
260 #define TEST_C_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), TEST_TYPE_C, TestCClass))
262 typedef struct _TestC TestC;
263 typedef struct _TestCClass TestCClass;
269 TestBClass parent_class;
273 test_c_foo (TestA *self)
275 GValue args[1] = { { 0, } };
277 g_print("TestC::foo called. Chaining up.\n");
279 g_value_init (&args[0], TEST_TYPE_A);
280 g_value_set_object (&args[0], self);
282 g_signal_chain_from_overridden (args, foo_signal_id, NULL);
284 g_value_unset (&args[0]);
288 test_c_bar (TestI *self)
290 GValue args[1] = { { 0, } };
292 g_print("TestC::bar called. Chaining up.\n");
294 g_value_init (&args[0], TEST_TYPE_A);
295 g_value_set_object (&args[0], self);
297 g_signal_chain_from_overridden (args, bar_signal_id, NULL);
299 g_value_unset (&args[0]);
303 test_c_class_init (TestBClass *class)
305 g_signal_override_class_closure (foo_signal_id,
307 g_cclosure_new (G_CALLBACK (test_c_foo),
309 g_signal_override_class_closure (bar_signal_id,
311 g_cclosure_new (G_CALLBACK (test_c_bar),
316 test_c_get_type (void)
318 static GType type = 0;
321 static const GTypeInfo type_info = {
323 (GBaseInitFunc) NULL,
324 (GBaseFinalizeFunc) NULL,
325 (GClassInitFunc) test_c_class_init,
326 NULL, /* class_finalize */
327 NULL, /* class_data */
330 (GInstanceInitFunc) NULL,
333 type = g_type_register_static (TEST_TYPE_B, "TestC",
342 main (int argc, char **argv)
348 self = g_object_new(TEST_TYPE_A, NULL);
349 g_print("*** emiting foo on a TestA instance (expect chain A->I)\n");
350 g_signal_emit(self, foo_signal_id, 0);
351 g_print("*** emiting bar on a TestA instance\n");
352 g_signal_emit(self, bar_signal_id, 0);
353 g_object_unref(self);
357 self = g_object_new(TEST_TYPE_B, NULL);
358 g_print("*** emiting foo on a TestB instance (expect chain B->A->I)\n");
359 g_signal_emit(self, foo_signal_id, 0);
360 g_print("*** emiting bar on a TestB instance (expect chain B->A)\n");
361 g_signal_emit(self, bar_signal_id, 0);
362 g_object_unref(self);
366 self = g_object_new(TEST_TYPE_C, NULL);
367 g_print("*** emiting foo on a TestC instance (expect chain C->B->A->I)\n");
368 g_signal_emit(self, foo_signal_id, 0);
369 g_print("*** emiting bar on a TestC instance (expect chain C->B->A)\n");
370 g_signal_emit(self, bar_signal_id, 0);
371 g_object_unref(self);