1 /* GObject - GLib Type, Object, Parameter and Signal Library
2 * Copyright (C) 2001 Red Hat, Inc.
4 * This library is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU Lesser General Public
6 * License as published by the Free Software Foundation; either
7 * version 2 of the License, or (at your option) any later version.
9 * This library is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 * Lesser General Public License for more details.
14 * You should have received a copy of the GNU Lesser General
15 * Public License along with this library; if not, write to the
16 * Free Software Foundation, Inc., 59 Temple Place, Suite 330,
17 * Boston, MA 02111-1307, USA.
22 #include "gsourceclosure.h"
27 #include "gvaluetypes.h"
31 g_io_channel_get_type (void)
33 static GType our_type
= 0;
36 our_type
= g_boxed_type_register_static ("GIOChannel",
37 (GBoxedCopyFunc
) g_io_channel_ref
,
38 (GBoxedFreeFunc
) g_io_channel_unref
);
44 g_io_condition_get_type (void)
46 static GType etype
= 0;
49 static const GFlagsValue values
[] = {
50 { G_IO_IN
, "G_IO_IN", "in" },
51 { G_IO_OUT
, "G_IO_OUT", "out" },
52 { G_IO_PRI
, "G_IO_PRI", "pri" },
53 { G_IO_ERR
, "G_IO_ERR", "err" },
54 { G_IO_HUP
, "G_IO_HUP", "hup" },
55 { G_IO_NVAL
, "G_IO_NVAL", "nval" },
58 etype
= g_flags_register_static ("GIOCondition", values
);
63 /* We need to hand-write this marshaler, since it doesn't have an
67 source_closure_marshal_BOOLEAN__VOID (GClosure
*closure
,
70 const GValue
*param_values
,
71 gpointer invocation_hint
,
72 gpointer marshal_data
)
75 GCClosure
*cc
= (GCClosure
*) closure
;
78 g_return_if_fail (return_value
!= NULL
);
79 g_return_if_fail (n_param_values
== 0);
81 callback
= (GSourceFunc
) (marshal_data
? marshal_data
: cc
->callback
);
83 v_return
= callback (closure
->data
);
85 g_value_set_boolean (return_value
, v_return
);
89 io_watch_closure_callback (GIOChannel
*channel
,
90 GIOCondition condition
,
93 GClosure
*closure
= data
;
95 GValue params
[2] = { { 0, }, { 0, } };
96 GValue result_value
= { 0, };
99 g_value_init (&result_value
, G_TYPE_BOOLEAN
);
100 g_value_init (¶ms
[0], G_TYPE_IO_CHANNEL
);
101 g_value_set_boxed (¶ms
[0], channel
);
103 g_value_init (¶ms
[1], G_TYPE_IO_CONDITION
);
104 g_value_set_flags (¶ms
[1], condition
);
106 g_closure_invoke (closure
, &result_value
, 2, params
, NULL
);
108 result
= g_value_get_boolean (&result_value
);
109 g_value_unset (&result_value
);
110 g_value_unset (¶ms
[0]);
111 g_value_unset (¶ms
[1]);
117 source_closure_callback (gpointer data
)
119 GClosure
*closure
= data
;
120 GValue result_value
= { 0, };
123 g_value_init (&result_value
, G_TYPE_BOOLEAN
);
125 g_closure_invoke (closure
, &result_value
, 0, NULL
, NULL
);
127 result
= g_value_get_boolean (&result_value
);
128 g_value_unset (&result_value
);
134 closure_callback_get (gpointer cb_data
,
139 GSourceFunc closure_callback
= source
->source_funcs
->closure_callback
;
141 if (!closure_callback
)
143 if (source
->source_funcs
== &g_io_watch_funcs
)
144 closure_callback
= (GSourceFunc
)io_watch_closure_callback
;
145 else if (source
->source_funcs
== &g_timeout_funcs
||
146 source
->source_funcs
== &g_idle_funcs
)
147 closure_callback
= source_closure_callback
;
150 *func
= closure_callback
;
154 static GSourceCallbackFuncs closure_callback_funcs
= {
155 (void (*) (gpointer
)) g_closure_ref
,
156 (void (*) (gpointer
)) g_closure_unref
,
161 * g_source_set_closure:
162 * @source: the source
163 * @closure: a #GClosure
165 * Set the callback for a source as a #GClosure.
167 * If the source is not one of the standard GLib types, the @closure_callback
168 * and @closure_marshal fields of the #GSourceFuncs structure must have been
169 * filled in with pointers to appropriate functions.
172 g_source_set_closure (GSource
*source
,
175 g_return_if_fail (source
!= NULL
);
176 g_return_if_fail (closure
!= NULL
);
178 if (!source
->source_funcs
->closure_callback
&&
179 source
->source_funcs
!= &g_io_watch_funcs
&&
180 source
->source_funcs
!= &g_timeout_funcs
&&
181 source
->source_funcs
!= &g_idle_funcs
)
183 g_critical (G_STRLOC
"closure can not be set on closure without GSourceFuncs::closure_callback\n");
187 g_closure_ref (closure
);
188 g_closure_sink (closure
);
189 g_source_set_callback_indirect (source
, closure
, &closure_callback_funcs
);
191 if (G_CLOSURE_NEEDS_MARSHAL (closure
))
193 GClosureMarshal marshal
= (GClosureMarshal
)source
->source_funcs
->closure_marshal
;
196 if (source
->source_funcs
== &g_idle_funcs
||
197 source
->source_funcs
== &g_timeout_funcs
)
198 marshal
= source_closure_marshal_BOOLEAN__VOID
;
199 else if (source
->source_funcs
== &g_io_watch_funcs
)
200 marshal
= g_cclosure_marshal_BOOLEAN__FLAGS
;
203 g_closure_set_marshal (closure
, marshal
);