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.
20 #include "gsourceclosure.h"
25 #include "gvaluetypes.h"
26 #include "gobjectalias.h"
29 g_io_channel_get_type (void)
31 static GType our_type
= 0;
34 our_type
= g_boxed_type_register_static ("GIOChannel",
35 (GBoxedCopyFunc
) g_io_channel_ref
,
36 (GBoxedFreeFunc
) g_io_channel_unref
);
42 g_io_condition_get_type (void)
44 static GType etype
= 0;
47 static const GFlagsValue values
[] = {
48 { G_IO_IN
, "G_IO_IN", "in" },
49 { G_IO_OUT
, "G_IO_OUT", "out" },
50 { G_IO_PRI
, "G_IO_PRI", "pri" },
51 { G_IO_ERR
, "G_IO_ERR", "err" },
52 { G_IO_HUP
, "G_IO_HUP", "hup" },
53 { G_IO_NVAL
, "G_IO_NVAL", "nval" },
56 etype
= g_flags_register_static ("GIOCondition", values
);
61 /* We need to hand-write this marshaler, since it doesn't have an
65 source_closure_marshal_BOOLEAN__VOID (GClosure
*closure
,
68 const GValue
*param_values
,
69 gpointer invocation_hint
,
70 gpointer marshal_data
)
73 GCClosure
*cc
= (GCClosure
*) closure
;
76 g_return_if_fail (return_value
!= NULL
);
77 g_return_if_fail (n_param_values
== 0);
79 callback
= (GSourceFunc
) (marshal_data
? marshal_data
: cc
->callback
);
81 v_return
= callback (closure
->data
);
83 g_value_set_boolean (return_value
, v_return
);
87 io_watch_closure_callback (GIOChannel
*channel
,
88 GIOCondition condition
,
91 GClosure
*closure
= data
;
93 GValue params
[2] = { { 0, }, { 0, } };
94 GValue result_value
= { 0, };
97 g_value_init (&result_value
, G_TYPE_BOOLEAN
);
98 g_value_init (¶ms
[0], G_TYPE_IO_CHANNEL
);
99 g_value_set_boxed (¶ms
[0], channel
);
101 g_value_init (¶ms
[1], G_TYPE_IO_CONDITION
);
102 g_value_set_flags (¶ms
[1], condition
);
104 g_closure_invoke (closure
, &result_value
, 2, params
, NULL
);
106 result
= g_value_get_boolean (&result_value
);
107 g_value_unset (&result_value
);
108 g_value_unset (¶ms
[0]);
109 g_value_unset (¶ms
[1]);
115 source_closure_callback (gpointer data
)
117 GClosure
*closure
= data
;
118 GValue result_value
= { 0, };
121 g_value_init (&result_value
, G_TYPE_BOOLEAN
);
123 g_closure_invoke (closure
, &result_value
, 0, NULL
, NULL
);
125 result
= g_value_get_boolean (&result_value
);
126 g_value_unset (&result_value
);
132 closure_callback_get (gpointer cb_data
,
137 GSourceFunc closure_callback
= source
->source_funcs
->closure_callback
;
139 if (!closure_callback
)
141 if (source
->source_funcs
== &g_io_watch_funcs
)
142 closure_callback
= (GSourceFunc
)io_watch_closure_callback
;
143 else if (source
->source_funcs
== &g_timeout_funcs
||
144 source
->source_funcs
== &g_idle_funcs
)
145 closure_callback
= source_closure_callback
;
148 *func
= closure_callback
;
152 static GSourceCallbackFuncs closure_callback_funcs
= {
153 (void (*) (gpointer
)) g_closure_ref
,
154 (void (*) (gpointer
)) g_closure_unref
,
159 g_source_set_closure (GSource
*source
,
162 g_return_if_fail (source
!= NULL
);
163 g_return_if_fail (closure
!= NULL
);
165 if (!source
->source_funcs
->closure_callback
&&
166 source
->source_funcs
!= &g_io_watch_funcs
&&
167 source
->source_funcs
!= &g_timeout_funcs
&&
168 source
->source_funcs
!= &g_idle_funcs
)
170 g_critical (G_STRLOC
"closure can not be set on closure without GSourceFuncs::closure_callback\n");
174 g_closure_ref (closure
);
175 g_closure_sink (closure
);
176 g_source_set_callback_indirect (source
, closure
, &closure_callback_funcs
);
178 if (G_CLOSURE_NEEDS_MARSHAL (closure
))
180 GClosureMarshal marshal
= (GClosureMarshal
)source
->source_funcs
->closure_marshal
;
183 if (source
->source_funcs
== &g_idle_funcs
||
184 source
->source_funcs
== &g_timeout_funcs
)
185 marshal
= source_closure_marshal_BOOLEAN__VOID
;
186 else if (source
->source_funcs
== &g_io_watch_funcs
)
187 marshal
= g_cclosure_marshal_BOOLEAN__FLAGS
;
190 g_closure_set_marshal (closure
, marshal
);
194 #define __G_SOURCECLOSURE_C__
195 #include "gobjectaliasdef.c"