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_assert (g_signal_get_invocation_hint (self)->signal_id == foo_signal_id);
104 g_signal_chain_from_overridden (args, NULL);
106 g_value_unset (&args[0]);
110 test_a_bar (TestA *self)
112 g_print("TestA::bar called.\n");
116 test_a_class_init (TestAClass *class)
118 class->bar = test_a_bar;
120 bar_signal_id = g_signal_new("bar",
123 G_STRUCT_OFFSET (TestAClass, bar),
125 g_cclosure_marshal_VOID__VOID,
130 test_a_interface_init (TestIClass *iface)
132 g_signal_override_class_closure (foo_signal_id,
134 g_cclosure_new (G_CALLBACK (test_a_foo),
139 test_a_get_type (void)
141 static GType type = 0;
144 static const GTypeInfo type_info = {
146 (GBaseInitFunc) NULL,
147 (GBaseFinalizeFunc) NULL,
148 (GClassInitFunc) test_a_class_init,
149 NULL, /* class_finalize */
150 NULL, /* class_data */
153 (GInstanceInitFunc) NULL,
155 static const GInterfaceInfo interface_info = {
156 (GInterfaceInitFunc) test_a_interface_init,
161 type = g_type_register_static (G_TYPE_OBJECT, "TestA",
163 g_type_add_interface_static (type, TEST_TYPE_I, &interface_info);
170 #define TEST_TYPE_B (test_b_get_type())
171 #define TEST_B(object) (G_TYPE_CHECK_INSTANCE_CAST((object), TEST_TYPE_B, TestB))
172 #define TEST_B_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass), TEST_TYPE_B, TestBClass))
173 #define TEST_IS_B(object) (G_TYPE_CHECK_INSTANCE_TYPE((object), TEST_TYPE_B))
174 #define TEST_IS_B_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass), TEST_TYPE_B))
175 #define TEST_B_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), TEST_TYPE_B, TestBClass))
177 typedef struct _TestB TestB;
178 typedef struct _TestBClass TestBClass;
184 TestAClass parent_class;
188 test_b_foo (TestA *self)
190 GValue args[1] = { { 0, } };
192 g_print("TestB::foo called. Chaining up.\n");
194 g_value_init (&args[0], TEST_TYPE_A);
195 g_value_set_object (&args[0], self);
197 g_assert (g_signal_get_invocation_hint (self)->signal_id == foo_signal_id);
198 g_signal_chain_from_overridden (args, NULL);
200 g_value_unset (&args[0]);
204 test_b_bar (TestI *self)
206 GValue args[1] = { { 0, } };
208 g_print("TestB::bar called. Chaining up.\n");
210 g_value_init (&args[0], TEST_TYPE_A);
211 g_value_set_object (&args[0], self);
213 g_assert (g_signal_get_invocation_hint (self)->signal_id == bar_signal_id);
214 g_signal_chain_from_overridden (args, NULL);
216 g_value_unset (&args[0]);
220 test_b_class_init (TestBClass *class)
222 g_signal_override_class_closure (foo_signal_id,
224 g_cclosure_new (G_CALLBACK (test_b_foo),
226 g_signal_override_class_closure (bar_signal_id,
228 g_cclosure_new (G_CALLBACK (test_b_bar),
233 test_b_get_type (void)
235 static GType type = 0;
238 static const GTypeInfo type_info = {
240 (GBaseInitFunc) NULL,
241 (GBaseFinalizeFunc) NULL,
242 (GClassInitFunc) test_b_class_init,
243 NULL, /* class_finalize */
244 NULL, /* class_data */
247 (GInstanceInitFunc) NULL,
250 type = g_type_register_static (TEST_TYPE_A, "TestB",
258 #define TEST_TYPE_C (test_c_get_type())
259 #define TEST_C(object) (G_TYPE_CHECK_INSTANCE_CAST((object), TEST_TYPE_C, TestC))
260 #define TEST_C_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass), TEST_TYPE_C, TestCClass))
261 #define TEST_IS_C(object) (G_TYPE_CHECK_INSTANCE_TYPE((object), TEST_TYPE_C))
262 #define TEST_IS_C_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass), TEST_TYPE_C))
263 #define TEST_C_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), TEST_TYPE_C, TestCClass))
265 typedef struct _TestC TestC;
266 typedef struct _TestCClass TestCClass;
272 TestBClass parent_class;
276 test_c_foo (TestA *self)
278 GValue args[1] = { { 0, } };
280 g_print("TestC::foo called. Chaining up.\n");
282 g_value_init (&args[0], TEST_TYPE_A);
283 g_value_set_object (&args[0], self);
285 g_assert (g_signal_get_invocation_hint (self)->signal_id == foo_signal_id);
286 g_signal_chain_from_overridden (args, NULL);
288 g_value_unset (&args[0]);
292 test_c_bar (TestI *self)
294 GValue args[1] = { { 0, } };
296 g_print("TestC::bar called. Chaining up.\n");
298 g_value_init (&args[0], TEST_TYPE_A);
299 g_value_set_object (&args[0], self);
301 g_assert (g_signal_get_invocation_hint (self)->signal_id == bar_signal_id);
302 g_signal_chain_from_overridden (args, NULL);
304 g_value_unset (&args[0]);
308 test_c_class_init (TestBClass *class)
310 g_signal_override_class_closure (foo_signal_id,
312 g_cclosure_new (G_CALLBACK (test_c_foo),
314 g_signal_override_class_closure (bar_signal_id,
316 g_cclosure_new (G_CALLBACK (test_c_bar),
321 test_c_get_type (void)
323 static GType type = 0;
326 static const GTypeInfo type_info = {
328 (GBaseInitFunc) NULL,
329 (GBaseFinalizeFunc) NULL,
330 (GClassInitFunc) test_c_class_init,
331 NULL, /* class_finalize */
332 NULL, /* class_data */
335 (GInstanceInitFunc) NULL,
338 type = g_type_register_static (TEST_TYPE_B, "TestC",
347 main (int argc, char **argv)
353 self = g_object_new(TEST_TYPE_A, NULL);
354 g_print("*** emiting foo on a TestA instance (expect chain A->I)\n");
355 g_signal_emit(self, foo_signal_id, 0);
356 g_print("*** emiting bar on a TestA instance\n");
357 g_signal_emit(self, bar_signal_id, 0);
358 g_object_unref(self);
362 self = g_object_new(TEST_TYPE_B, NULL);
363 g_print("*** emiting foo on a TestB instance (expect chain B->A->I)\n");
364 g_signal_emit(self, foo_signal_id, 0);
365 g_print("*** emiting bar on a TestB instance (expect chain B->A)\n");
366 g_signal_emit(self, bar_signal_id, 0);
367 g_object_unref(self);
371 self = g_object_new(TEST_TYPE_C, NULL);
372 g_print("*** emiting foo on a TestC instance (expect chain C->B->A->I)\n");
373 g_signal_emit(self, foo_signal_id, 0);
374 g_print("*** emiting bar on a TestC instance (expect chain C->B->A)\n");
375 g_signal_emit(self, bar_signal_id, 0);
376 g_object_unref(self);