source: trunk/third/glib2/gobject/gclosure.h @ 18159

Revision 18159, 5.8 KB checked in by ghudson, 22 years ago (diff)
This commit was generated by cvs2svn to compensate for changes in r18158, which included commits to RCS files with non-trunk default branches.
Line 
1/* GObject - GLib Type, Object, Parameter and Signal Library
2 * Copyright (C) 2000-2001 Red Hat, Inc.
3 *
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.
8 *
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.
13 *
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.
18 */
19#if !defined (__GLIB_GOBJECT_H_INSIDE__) && !defined (GOBJECT_COMPILATION)
20#error "Only <glib-object.h> can be included directly."
21#endif
22
23#ifndef __G_CLOSURE_H__
24#define __G_CLOSURE_H__
25
26#include        <gobject/gtype.h>
27
28G_BEGIN_DECLS
29
30/* --- defines --- */
31#define G_CLOSURE_NEEDS_MARSHAL(closure) (((GClosure*) (closure))->marshal == NULL)
32#define G_CLOSURE_N_NOTIFIERS(cl)        ((cl)->meta_marshal + ((cl)->n_guards << 1L) + \
33                                          (cl)->n_fnotifiers + (cl)->n_inotifiers)
34#define G_CCLOSURE_SWAP_DATA(cclosure)   (((GClosure*) (closure))->derivative_flag)
35#define G_CALLBACK(f)                    ((GCallback) (f))
36
37
38/* -- typedefs --- */
39typedef struct _GClosure                 GClosure;
40typedef struct _GClosureNotifyData       GClosureNotifyData;
41typedef void  (*GCallback)              (void);
42typedef void  (*GClosureNotify)         (gpointer        data,
43                                         GClosure       *closure);
44typedef void  (*GClosureMarshal)        (GClosure       *closure,
45                                         GValue         *return_value,
46                                         guint           n_param_values,
47                                         const GValue   *param_values,
48                                         gpointer        invocation_hint,
49                                         gpointer        marshal_data);
50typedef struct _GCClosure                GCClosure;
51
52
53/* --- structures --- */
54struct _GClosureNotifyData
55{
56  gpointer       data;
57  GClosureNotify notify;
58};
59struct _GClosure
60{
61  /*< private >*/       guint    ref_count : 15;
62  /*< private >*/       guint    meta_marshal : 1;
63  /*< private >*/       guint    n_guards : 1;
64  /*< private >*/       guint    n_fnotifiers : 2;      /* finalization notifiers */
65  /*< private >*/       guint    n_inotifiers : 8;      /* invalidation notifiers */
66  /*< private >*/       guint    in_inotify : 1;
67  /*< private >*/       guint    floating : 1;
68  /*< protected >*/     guint    derivative_flag : 1;
69  /*< public >*/        guint    in_marshal : 1;
70  /*< public >*/        guint    is_invalid : 1;
71
72  /*< private >*/       void   (*marshal)  (GClosure       *closure,
73                                            GValue /*out*/ *return_value,
74                                            guint           n_param_values,
75                                            const GValue   *param_values,
76                                            gpointer        invocation_hint,
77                                            gpointer        marshal_data);
78  /*< protected >*/     gpointer data;
79
80  /*< private >*/       GClosureNotifyData *notifiers;
81
82  /* invariants/constrains:
83   * - ->marshal and ->data are _invalid_ as soon as ->is_invalid==TRUE
84   * - invocation of all inotifiers occours prior to fnotifiers
85   * - order of inotifiers is random
86   *   inotifiers may _not_ free/invalidate parameter values (e.g. ->data)
87   * - order of fnotifiers is random
88   * - each notifier may only be removed before or during its invocation
89   * - reference counting may only happen prior to fnotify invocation
90   *   (in that sense, fnotifiers are really finalization handlers)
91   */
92};
93/* closure for C function calls, callback() is the user function
94 */
95struct _GCClosure
96{
97  GClosure      closure;
98  gpointer      callback;
99};
100
101
102/* --- prototypes --- */
103GClosure* g_cclosure_new                        (GCallback      callback_func,
104                                                 gpointer       user_data,
105                                                 GClosureNotify destroy_data);
106GClosure* g_cclosure_new_swap                   (GCallback      callback_func,
107                                                 gpointer       user_data,
108                                                 GClosureNotify destroy_data);
109GClosure* g_signal_type_cclosure_new            (GType          itype,
110                                                 guint          struct_offset);
111
112
113/* --- prototypes --- */
114GClosure* g_closure_ref                         (GClosure       *closure);
115void      g_closure_sink                        (GClosure       *closure);
116void      g_closure_unref                       (GClosure       *closure);
117/* intimidating */
118GClosure* g_closure_new_simple                  (guint           sizeof_closure,
119                                                 gpointer        data);
120void      g_closure_add_finalize_notifier       (GClosure       *closure,
121                                                 gpointer        notify_data,
122                                                 GClosureNotify  notify_func);
123void      g_closure_remove_finalize_notifier    (GClosure       *closure,
124                                                 gpointer        notify_data,
125                                                 GClosureNotify  notify_func);
126void      g_closure_add_invalidate_notifier     (GClosure       *closure,
127                                                 gpointer        notify_data,
128                                                 GClosureNotify  notify_func);
129void      g_closure_remove_invalidate_notifier  (GClosure       *closure,
130                                                 gpointer        notify_data,
131                                                 GClosureNotify  notify_func);
132void      g_closure_add_marshal_guards          (GClosure       *closure,
133                                                 gpointer        pre_marshal_data,
134                                                 GClosureNotify  pre_marshal_notify,
135                                                 gpointer        post_marshal_data,
136                                                 GClosureNotify  post_marshal_notify);
137void      g_closure_set_marshal                 (GClosure       *closure,
138                                                 GClosureMarshal marshal);
139void      g_closure_set_meta_marshal            (GClosure       *closure,
140                                                 gpointer        marshal_data,
141                                                 GClosureMarshal meta_marshal);
142void      g_closure_invalidate                  (GClosure       *closure);
143void      g_closure_invoke                      (GClosure       *closure,
144                                                 GValue /*out*/ *return_value,
145                                                 guint           n_param_values,
146                                                 const GValue   *param_values,
147                                                 gpointer        invocation_hint);
148
149/* FIXME:
150   OK:  data_object::destroy            -> closure_invalidate();
151   MIS: closure_invalidate()            -> disconnect(closure);
152   MIS: disconnect(closure)             -> (unlink) closure_unref();
153   OK:  closure_finalize()              -> g_free (data_string);
154
155   random remarks:
156   - need marshaller repo with decent aliasing to base types
157   - provide marshaller collection, virtually covering anything out there
158*/
159
160G_END_DECLS
161
162#endif /* __G_CLOSURE_H__ */
Note: See TracBrowser for help on using the repository browser.