1 /* GObject - GLib Type, Object, Parameter and Signal Library
2 * testmarshallergeneric.c: Generic CClosure marshaller
3 * Copyright (C) 2007 Johan Dahlin
5 * This library is free software; you can redistribute it and/or
6 * modify it under the terms of the GNU Lesser General Public
7 * License as published by the Free Software Foundation; either
8 * version 2 of the License, or (at your option) any later version.
10 * This library is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 * Lesser General Public License for more details.
15 * You should have received a copy of the GNU Lesser General Public
16 * License along with this library; if not, write to the
17 * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
18 * Boston, MA 02111-1307, USA.
22 #include <glib-object.h>
23 #include "girepository.h"
30 GObjectClass parent_class;
31 void (* test1) (TestObject *object);
32 void (* test2) (TestObject *object, char *str);
33 int (* test3) (TestObject *object, int i);
34 void (* test4) (TestObject *object,
35 gboolean b, long l, float f, double d,
36 guint uint, gulong ulong);
39 #define TEST_TYPE_OBJECT (test_object_get_type())
40 #define TEST_OBJECT(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), TEST_TYPE_OBJECT, TestObject))
41 #define TEST_OBJECT_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), TEST_TYPE_OBJECT, TestObjectClass))
42 #define TEST_IS_OBJECT(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), TEST_TYPE_OBJECT))
43 #define TEST_IS_OBJECT_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((obj), TEST_TYPE_OBJECT))
44 #define TEST_OBJECT_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), TEST_TYPE_OBJECT, TestObjectClass))
46 GType test_object_get_type (void);
56 static guint object_signals[LAST_SIGNAL] = { 0 };
58 G_DEFINE_TYPE (TestObject, test_object, G_TYPE_OBJECT);
60 static void test_object_init (TestObject *self)
64 static void test_object_class_init (TestObjectClass *klass)
66 GObjectClass *gobject_class = (GObjectClass*) klass;
68 object_signals[TEST1] =
69 g_signal_new ("test1",
70 G_TYPE_FROM_CLASS (gobject_class),
72 G_STRUCT_OFFSET (TestObjectClass, test1),
74 gi_cclosure_marshal_generic,
76 object_signals[TEST2] =
77 g_signal_new ("test2",
78 G_TYPE_FROM_CLASS (gobject_class),
80 G_STRUCT_OFFSET (TestObjectClass, test2),
82 gi_cclosure_marshal_generic,
85 object_signals[TEST3] =
86 g_signal_new ("test3",
87 G_TYPE_FROM_CLASS (gobject_class),
89 G_STRUCT_OFFSET (TestObjectClass, test3),
91 gi_cclosure_marshal_generic,
94 object_signals[TEST4] =
95 g_signal_new ("test4",
96 G_TYPE_FROM_CLASS (gobject_class),
98 G_STRUCT_OFFSET (TestObjectClass, test3),
100 gi_cclosure_marshal_generic,
111 test1_callback (TestObject *object, char *data)
113 g_return_if_fail (TEST_IS_OBJECT (object));
114 g_return_if_fail (!strcmp (data, "user-data"));
118 test1_callback_swapped (char *data, TestObject *object)
120 g_return_if_fail (TEST_IS_OBJECT (object));
121 g_return_if_fail (!strcmp (data, "user-data"));
125 test2_callback (TestObject *object, char *string)
127 g_return_if_fail (TEST_IS_OBJECT (object));
128 g_return_if_fail (!strcmp (string, "string"));
132 test3_callback (TestObject *object, double f)
134 g_return_val_if_fail (TEST_IS_OBJECT (object), -1);
135 g_return_val_if_fail (f == 42.0, -1);
141 test4_callback (TestObject *object,
142 gboolean b, long l, float f, double d, guint uint, gulong ulong,
145 g_return_if_fail (b == TRUE);
146 g_return_if_fail (l == 10L);
147 g_return_if_fail (f <= 3.14001 && f >= 3.13999);
148 g_return_if_fail (d == 1.78);
149 g_return_if_fail (uint == 20);
150 g_return_if_fail (ulong == 30L);
153 /* this callback has no "this" */
155 test5_callback (gpointer user_data)
157 g_return_if_fail (!strcmp (user_data, "user-data"));
161 test_cclosure_marshal (void)
164 gchar *data = "user-data";
170 object = g_object_new (TEST_TYPE_OBJECT, NULL);
171 g_signal_connect (G_OBJECT (object),
173 G_CALLBACK (test1_callback),
175 g_signal_connect_swapped (G_OBJECT (object),
177 G_CALLBACK (test1_callback_swapped),
179 g_signal_connect (G_OBJECT (object),
181 G_CALLBACK (test2_callback),
183 g_signal_connect (G_OBJECT (object),
185 G_CALLBACK (test3_callback),
187 g_signal_connect (G_OBJECT (object),
189 G_CALLBACK (test4_callback),
192 g_signal_emit (G_OBJECT (object), object_signals[TEST1], 0);
193 g_signal_emit (G_OBJECT (object), object_signals[TEST2], 0, "string");
194 g_signal_emit (G_OBJECT (object), object_signals[TEST3], 0, 42.0, &i);
195 g_signal_emit (G_OBJECT (object), object_signals[TEST4], 0,
196 TRUE, 10L, 3.14, 1.78, 20, 30L);
199 g_object_unref (object);
201 closure = g_cclosure_new (G_CALLBACK (test5_callback),
204 g_closure_ref (closure);
205 g_closure_sink (closure);
206 g_closure_set_marshal (closure, gi_cclosure_marshal_generic);
207 g_closure_invoke (closure, NULL, 0, NULL, NULL);
208 g_closure_unref (closure);
214 test_cclosure_marshal ();