]> Pileus Git - ~andy/gtk/blob - gtk/gtkobject.h
more debugging fixes.
[~andy/gtk] / gtk / gtkobject.h
1 /* GTK - The GIMP Toolkit
2  * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald
3  *
4  * This library is free software; you can redistribute it and/or
5  * modify it under the terms of the GNU Library 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  * Library General Public License for more details.
13  *
14  * You should have received a copy of the GNU Library General Public
15  * License along with this library; if not, write to the Free
16  * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
17  */
18 #ifndef __GTK_OBJECT_H__
19 #define __GTK_OBJECT_H__
20
21
22 #include <gtk/gtkenums.h>
23 #include <gtk/gtktypeutils.h>
24 #include <gtk/gtkdebug.h>
25
26
27 #ifdef __cplusplus
28 extern "C" {
29 #endif /* __cplusplus */
30
31
32
33 /* The debugging versions of the casting macros make sure the cast is "ok"
34  *  before proceeding, but they are definately slower than their less
35  *  careful counterparts as they involve no less than 3 function calls.
36  */
37 #ifdef GTK_NO_CHECK_CASTS
38
39 #define GTK_CHECK_CAST(obj,cast_type,cast)         ((cast*) (obj))
40 #define GTK_CHECK_CLASS_CAST(klass,cast_type,cast) ((cast*) (klass))
41
42 #else /* !GTK_NO_CHECK_CASTS */
43
44 #define GTK_CHECK_CAST(obj,cast_type,cast) \
45   ((cast*) gtk_object_check_cast ((GtkObject*) (obj), cast_type))
46
47 #define GTK_CHECK_CLASS_CAST(klass,cast_type,cast) \
48   ((cast*) gtk_object_check_class_cast ((GtkObjectClass*) (klass), cast_type))
49
50 #endif /* GTK_NO_CHECK_CASTS */
51
52
53 /* Determines whether 'obj' is a type of 'otype'.
54  */
55 #define GTK_CHECK_TYPE(obj,otype)  (gtk_type_is_a (((GtkObject*) (obj))->klass->type, otype))
56
57
58 /* Macro for casting a pointer to a GtkObject pointer.
59  */
60 #define GTK_OBJECT(obj)                   GTK_CHECK_CAST ((obj), gtk_object_get_type (), GtkObject)
61
62 /* Macros for extracting various fields from GtkObject and GtkObjectClass.
63  */
64 #define GTK_OBJECT_CLASS(klass)           (GTK_CHECK_CLASS_CAST ((klass), gtk_object_get_type (), GtkObjectClass))
65 #define GTK_OBJECT_TYPE(obj)              (GTK_OBJECT (obj)->klass->type)
66 #define GTK_OBJECT_SIGNALS(obj)           (GTK_OBJECT (obj)->klass->signals)
67 #define GTK_OBJECT_NSIGNALS(obj)          (GTK_OBJECT (obj)->klass->nsignals)
68     
69 /* GtkObject only uses the first 4 bits of the flags field.
70  * GtkWidget uses the remaining bits. Though this is a kinda nasty
71  * break up, it does make the size of GtkWidget smaller.
72  */
73 enum
74 {
75   GTK_DESTROYED         = 1 << 0,
76   GTK_FLOATING          = 1 << 1,
77   GTK_RESERVED_1        = 1 << 2,
78   GTK_RESERVED_2        = 1 << 3
79 };
80   
81 /* GtkArg access bits for gtk_object_add_arg_type
82  */
83 enum
84 {
85   GTK_ARG_READABLE      = 1 << 0,
86   GTK_ARG_WRITABLE      = 1 << 1,
87 };
88 #define GTK_ARG_READWRITE       (GTK_ARG_READABLE | GTK_ARG_WRITABLE)
89
90
91 /* Macros for extracting the object_flags from GtkObject.
92  */
93 #define GTK_OBJECT_FLAGS(obj)             (GTK_OBJECT (obj)->flags)
94 #define GTK_OBJECT_DESTROYED(obj)         (GTK_OBJECT_FLAGS (obj) & GTK_DESTROYED)
95 #define GTK_OBJECT_FLOATING(obj)          (GTK_OBJECT_FLAGS (obj) & GTK_FLOATING)
96
97 /* Macros for setting and clearing bits in the object_flags field of GtkObject.
98  */
99 #define GTK_OBJECT_SET_FLAGS(obj,flag)    G_STMT_START{ (GTK_OBJECT_FLAGS (obj) |= (flag)); }G_STMT_END
100 #define GTK_OBJECT_UNSET_FLAGS(obj,flag)  G_STMT_START{ (GTK_OBJECT_FLAGS (obj) &= ~(flag)); }G_STMT_END
101
102 /* Macro for testing whether "obj" is of type GtkObject.
103  */
104 #define GTK_IS_OBJECT(obj)                (GTK_CHECK_TYPE ((obj), gtk_object_get_type ()))
105
106
107 typedef struct _GtkObjectClass  GtkObjectClass;
108
109
110 /* GtkObject is the base of the object hierarchy. It defines
111  *  the few basic items that all derived classes contain.
112  */
113 struct _GtkObject
114 {
115   /* A pointer to the objects class. This will actually point to
116    *  the derived objects class struct (which will be derived from
117    *  GtkObjectClass).
118    */
119   GtkObjectClass *klass;
120
121   /* 32 bits of flags. GtkObject only uses 4 of these bits and
122    *  GtkWidget uses the rest. This is done because structs are
123    *  aligned on 4 or 8 byte boundaries. If a new bitfield were
124    *  used in GtkWidget much space would be wasted.
125    */
126   guint32 flags;
127
128   /* reference count.
129    * refer to the file REFCOUNTING on this issue.
130    */
131   guint ref_count;
132
133   /* The list of signal handlers and other data
134    *  fields for this object.
135    */
136   gpointer object_data;
137 };
138
139 /* GtkObjectClass is the base of the class hierarchy. It defines
140  *  the basic necessities for the class mechanism to work. Namely,
141  *  the "type", "signals" and "nsignals" fields.
142  */
143 struct _GtkObjectClass
144 {
145   /* The type identifier for the objects class. There is
146    *  one unique identifier per class.
147    */
148   GtkType type;
149
150   /* The signals this object class handles. "signals" is an
151    *  array of signal ID's.
152    */
153   gint *signals;
154
155   /* The number of signals listed in "signals".
156    */
157   gint nsignals;
158
159   /* The number of arguments per class.
160    */
161   guint n_args;
162
163   /* The destroy function for objects. In one way ore another
164    *  this is defined for all objects. If an object class overrides
165    *  this method in order to perform class specific destruction
166    *  then it should still call it after it is finished with its
167    *  own cleanup. (See the destroy function for GtkWidget for
168    *  an example of how to do this).
169    */
170   void (* destroy) (GtkObject *object);
171
172   void (* finalize) (GtkObject *object);
173 };
174
175
176 /* For the purpose of user signals we need the signal function
177  * and signal marshaller signatures already in this place.
178  */
179 #define GTK_SIGNAL_FUNC(f)  ((GtkSignalFunc) f)
180
181 typedef void (*GtkSignalFunc)       (void);
182 typedef void (*GtkSignalMarshaller) (GtkObject      *object,
183                                      GtkSignalFunc   func,
184                                      gpointer        func_data,
185                                      GtkArg         *args);
186
187
188 /* Get the type identifier for GtkObject's.
189  */
190 guint   gtk_object_get_type             (void);
191
192 /* Append "signals" to those already defined in "class".
193  */
194 void    gtk_object_class_add_signals    (GtkObjectClass *klass,
195                                          gint           *signals,
196                                          gint            nsignals);
197
198 /* Append a user defined signal without default handler to a class.
199  */
200 gint    gtk_object_class_add_user_signal (GtkObjectClass     *klass,
201                                           const gchar        *name,
202                                           GtkSignalMarshaller marshaller,
203                                           GtkType             return_val,
204                                           gint                nparams,
205                                           ...);
206
207 GtkObject*      gtk_object_new          (guint          type,
208                                          ...);
209
210 GtkObject*      gtk_object_newv         (guint          type,
211                                          guint          nargs,
212                                          GtkArg         *args);
213 void gtk_object_sink      (GtkObject        *object);
214 void gtk_object_ref       (GtkObject        *object);
215 void gtk_object_unref     (GtkObject        *object);
216
217 void gtk_object_weakref   (GtkObject        *object,
218                            GtkDestroyNotify  notify,
219                            gpointer          data);
220 void gtk_object_weakunref (GtkObject        *object,
221                            GtkDestroyNotify  notify,
222                            gpointer          data);
223
224 void gtk_object_destroy   (GtkObject *object);
225
226 /* gtk_object_getv() sets an arguments type and value, or just
227  * its type to GTK_TYPE_INVALID.
228  * if arg->type == GTK_TYPE_STRING, it's the callers response to
229  * do a g_free (GTK_VALUE_STRING (arg));
230  */
231 void    gtk_object_getv         (GtkObject      *object,
232                                  guint          nargs,
233                                  GtkArg         *args);
234
235 /* gtk_object_set() takes a variable argument list of the form:
236  * (..., gchar *arg_name, ARG_VALUES, [repeatedly name/value pairs,] NULL)
237  * where ARG_VALUES type depend on the argument and can consist of
238  * more than one c-function argument.
239  */
240 void    gtk_object_set          (GtkObject      *object,
241                                  ...);
242
243 void    gtk_object_setv         (GtkObject      *object,
244                                  guint          nargs,
245                                  GtkArg         *args);
246
247 /* Allocate a GtkArg array of size nargs that hold the
248  * names and types of the args that can be used with
249  * gtk_object_set/gtk_object_get. if (acess_masks!=NULL),
250  * (*access_mask) will be set to point to a newly allocated
251  * guint array that holds the access masks of the args.
252  * It is the callers response to do a
253  * g_free (returned_args); g_free (*acess_masks).
254  */
255 GtkArg* gtk_object_query_args   (GtkType        class_type,
256                                  guint          **acess_masks,
257                                  guint          *nargs);
258
259 void    gtk_object_add_arg_type (const gchar    *arg_name,
260                                  GtkType        arg_type,
261                                  guint          access_mask,
262                                  guint          arg_id);
263
264 GtkType gtk_object_get_arg_type (const gchar    *arg_name);
265
266 /* Set 'data' to the "object_data" field of the object. The
267  *  data is indexed by the "key". If there is already data
268  *  associated with "key" then the new data will replace it.
269  *  If 'data' is NULL then this call is equivalent to
270  *  'gtk_object_remove_data'.
271  */
272 void gtk_object_set_data (GtkObject   *object,
273                           const gchar *key,
274                           gpointer     data);
275
276 /* Like gtk_object_set_data, but takes an additional argument
277  * which is a function to be called when the data is removed
278  */
279 void gtk_object_set_data_full (GtkObject   *object,
280                                const gchar *key,
281                                gpointer     data,
282                                GtkDestroyNotify destroy);
283
284 /* Get the data associated with "key".
285  */
286 gpointer gtk_object_get_data (GtkObject   *object,
287                               const gchar *key);
288
289 /* Remove the data associated with "key". This call is
290  *  equivalent to 'gtk_object_set_data' where 'data' is NULL.
291  */
292 void gtk_object_remove_data (GtkObject   *object,
293                              const gchar *key);
294
295 /* Set the "user_data" object data field of "object". It should
296  *  be noted that this is no different than calling 'gtk_object_data_add'
297  *  with a key of "user_data". It is merely provided as a convenience.
298  */
299 void gtk_object_set_user_data (GtkObject *object,
300                                gpointer   data);
301
302 /* Get the "user_data" object data field of "object". It should
303  *  be noted that this is no different than calling 'gtk_object_get_data'
304  *  with a key of "user_data". It is merely provided as a convenience.
305  */
306 gpointer gtk_object_get_user_data (GtkObject *object);
307
308 GtkObject* gtk_object_check_cast (GtkObject *obj,
309                                   GtkType    cast_type);
310
311 GtkObjectClass* gtk_object_check_class_cast (GtkObjectClass *klass,
312                                              GtkType         cast_type);
313
314 void    gtk_trace_referencing   (gpointer    *object,
315                                  const gchar *func,
316                                  guint        local_frame,
317                                  guint        line,
318                                  gboolean     do_ref);
319      
320 #if G_ENABLE_DEBUG && defined (__GNUC__)
321 #  define gtk_object_ref(o)   G_STMT_START{static guint f=0;gtk_trace_referencing((gpointer)o,__PRETTY_FUNCTION__,++f,__LINE__, 1);f--;}G_STMT_END
322 #  define gtk_object_unref(o) G_STMT_START{static guint f=0;gtk_trace_referencing((gpointer)o,__PRETTY_FUNCTION__,++f,__LINE__, 0);f--;}G_STMT_END
323 #endif  /* G_ENABLE_DEBUG && __GNUC__ */
324
325
326
327 #ifdef __cplusplus
328 }
329 #endif /* __cplusplus */
330
331
332 #endif /* __GTK_OBJECT_H__ */