]> Pileus Git - ~andy/gtk/blob - gtk/gtktypeutils.h
720fc9ffa7fd397bafe3cd0a688716fc369d71e3
[~andy/gtk] / gtk / gtktypeutils.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
16  * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
17  * Boston, MA 02111-1307, USA.
18  */
19 #ifndef __GTK_TYPE_UTILS_H__
20 #define __GTK_TYPE_UTILS_H__
21
22
23 #include <gdk/gdk.h>
24
25
26 #ifdef __cplusplus
27 extern "C" {
28 #pragma }
29 #endif /* __cplusplus */
30
31
32 /* Fundamental Types
33  */
34 typedef enum
35 {
36   G_SV (GTK_TYPE_INVALID,       invalid),
37   G_SV (GTK_TYPE_NONE,          none),
38   G_SV (GTK_TYPE_CHAR,          char),
39   G_SV (GTK_TYPE_BOOL,          bool),
40   G_SV (GTK_TYPE_INT,           int),
41   G_SV (GTK_TYPE_UINT,          uint),
42   G_SV (GTK_TYPE_LONG,          long),
43   G_SV (GTK_TYPE_ULONG,         ulong),
44   G_SV (GTK_TYPE_FLOAT,         float),
45   G_SV (GTK_TYPE_DOUBLE,        double),
46   G_SV (GTK_TYPE_STRING,        string),
47   G_SV (GTK_TYPE_ENUM,          enum),
48   G_SV (GTK_TYPE_FLAGS,         flags),
49   G_SV (GTK_TYPE_BOXED,         boxed),
50   G_SV (GTK_TYPE_FOREIGN,       foreign),
51   G_SV (GTK_TYPE_CALLBACK,      callback),
52   G_SV (GTK_TYPE_ARGS,          args),
53   
54   G_SV (GTK_TYPE_POINTER,       pointer),
55
56   /* It'd be great if GTK_TYPE_POINTER and GTK_TYPE_C_CALLBACK
57    * could be removed eventually
58    */
59   G_SV (GTK_TYPE_SIGNAL,        signal),
60   G_SV (GTK_TYPE_C_CALLBACK,    c-callback),
61   
62   G_SV (GTK_TYPE_OBJECT,        object)
63   
64 } G_ENUM (GtkFundamentalType);
65
66 typedef guint GtkType;
67
68 /* Builtin Types
69  */
70 #include <gtk/gtktypebuiltins.h>
71
72 /* Macros
73  */
74 #define GTK_TYPE_MAKE(parent_t, seqno)  (((seqno) << 8) | GTK_FUNDAMENTAL_TYPE (parent_t))
75 #define GTK_FUNDAMENTAL_TYPE(type)              ((GtkFundamentalType) ((type) & 0xFF))
76 #define GTK_TYPE_SEQNO(type)            ((type) > 0xFF ? (type) >> 8 : (type))
77
78 typedef struct _GtkArg         GtkArg;
79 typedef struct _GtkObject      GtkObject;   /* forward declaration of object type */
80 typedef struct _GtkTypeInfo    GtkTypeInfo;
81 typedef struct _GtkEnumValue   GtkEnumValue;
82 typedef struct _GtkEnumValue   GtkFlagValue;
83
84 typedef void (*GtkClassInitFunc)  (gpointer klass);
85 typedef void (*GtkObjectInitFunc) (gpointer object);
86 typedef void (*GtkArgGetFunc) (GtkObject *object, GtkArg *arg, guint arg_id);
87 typedef void (*GtkArgSetFunc) (GtkObject *object, GtkArg *arg, guint arg_id);
88 typedef gint (*GtkFunction) (gpointer data);
89 typedef void (*GtkCallbackMarshal) (GtkObject *object,
90                                     gpointer data,
91                                     guint n_args,
92                                     GtkArg *args);
93 typedef void (*GtkDestroyNotify) (gpointer data);
94
95 struct _GtkArg
96 {
97   GtkType type;
98   gchar *name;
99
100   union {
101     gchar char_data;
102     gint int_data;
103     guint uint_data;
104     gint bool_data;
105     glong long_data;
106     gulong ulong_data;
107     gfloat float_data;
108     gdouble double_data;
109     gchar *string_data;
110     gpointer pointer_data;
111     GtkObject *object_data;
112     struct {
113       GtkCallbackMarshal marshal;
114       gpointer data;
115       GtkDestroyNotify notify;
116     } callback_data;
117     struct {
118       gpointer data;
119       GtkDestroyNotify notify;
120     } foreign_data;
121     struct {
122       gint n_args;
123       GtkArg *args;
124     } args_data;
125     struct {
126       GtkFunction f;
127       gpointer d;
128     } signal_data;
129     struct {
130       GtkFunction func;
131       gpointer func_data;
132     } c_callback_data;
133   } d;
134 };
135
136 #define GTK_VALUE_CHAR(a)       ((a).d.char_data)
137 #define GTK_VALUE_BOOL(a)       ((a).d.bool_data)
138 #define GTK_VALUE_INT(a)        ((a).d.int_data)
139 #define GTK_VALUE_UINT(a)       ((a).d.uint_data)
140 #define GTK_VALUE_LONG(a)       ((a).d.long_data)
141 #define GTK_VALUE_ULONG(a)      ((a).d.ulong_data)
142 #define GTK_VALUE_FLOAT(a)      ((a).d.float_data)
143 #define GTK_VALUE_DOUBLE(a)     ((a).d.double_data)
144 #define GTK_VALUE_STRING(a)     ((a).d.string_data)
145 #define GTK_VALUE_ENUM(a)       ((a).d.int_data)
146 #define GTK_VALUE_FLAGS(a)      ((a).d.int_data)
147 #define GTK_VALUE_BOXED(a)      ((a).d.pointer_data)
148 #define GTK_VALUE_FOREIGN(a)    ((a).d.foreign_data)
149 #define GTK_VALUE_CALLBACK(a)   ((a).d.callback_data)
150 #define GTK_VALUE_ARGS(a)       ((a).d.args_data)
151 #define GTK_VALUE_OBJECT(a)     ((a).d.object_data)
152 #define GTK_VALUE_POINTER(a)    ((a).d.pointer_data)
153 #define GTK_VALUE_SIGNAL(a)     ((a).d.signal_data)
154 #define GTK_VALUE_C_CALLBACK(a) ((a).d.c_callback_data)
155
156 #define GTK_RETLOC_CHAR(a)      ((gchar*)(a).d.pointer_data)
157 #define GTK_RETLOC_BOOL(a)      ((gint*)(a).d.pointer_data)
158 #define GTK_RETLOC_INT(a)       ((gint*)(a).d.pointer_data)
159 #define GTK_RETLOC_UINT(a)      ((guint*)(a).d.pointer_data)
160 #define GTK_RETLOC_LONG(a)      ((glong*)(a).d.pointer_data)
161 #define GTK_RETLOC_ULONG(a)     ((gulong*)(a).d.pointer_data)
162 #define GTK_RETLOC_FLOAT(a)     ((gfloat*)(a).d.pointer_data)
163 #define GTK_RETLOC_DOUBLE(a)    ((gdouble*)(a).d.pointer_data)
164 #define GTK_RETLOC_STRING(a)    ((gchar**)(a).d.pointer_data)
165 #define GTK_RETLOC_ENUM(a)      ((gint*)(a).d.pointer_data)
166 #define GTK_RETLOC_FLAGS(a)     ((gint*)(a).d.pointer_data)
167 #define GTK_RETLOC_BOXED(a)     ((gpointer*)(a).d.pointer_data)
168 #define GTK_RETLOC_OBJECT(a)    ((GtkObject**)(a).d.pointer_data)
169 #define GTK_RETLOC_POINTER(a)   ((gpointer*)(a).d.pointer_data)
170
171 struct _GtkTypeInfo
172 {
173   gchar *type_name;
174   guint object_size;
175   guint class_size;
176   GtkClassInitFunc class_init_func;
177   GtkObjectInitFunc object_init_func;
178   GtkArgSetFunc arg_set_func;
179   GtkArgGetFunc arg_get_func;
180 };
181
182 struct _GtkEnumValue
183 {
184   guint  value;
185   gchar *value_name;
186   gchar *value_nick;
187 };
188
189
190 void            gtk_type_init                   (void);
191 GtkType         gtk_type_unique                 (GtkType         parent_type,
192                                                  GtkTypeInfo    *type_info);
193 void            gtk_type_set_chunk_alloc        (GtkType         type,
194                                                  guint           n_chunks);
195 gchar*          gtk_type_name                   (guint           type);
196 GtkType         gtk_type_from_name              (const gchar    *name);
197 GtkType         gtk_type_parent                 (GtkType         type);
198 gpointer        gtk_type_class                  (GtkType         type);
199 gpointer        gtk_type_parent_class           (GtkType         type);
200 gpointer        gtk_type_new                    (GtkType         type);
201 void            gtk_type_free                   (GtkType         type,
202                                                  gpointer        mem);
203 void            gtk_type_describe_heritage      (GtkType         type);
204 void            gtk_type_describe_tree          (GtkType         type,
205                                                  gboolean        show_size);
206 gint            gtk_type_is_a                   (GtkType         type,
207                                                  GtkType         is_a_type);
208 void            gtk_type_get_arg                (GtkObject      *object,
209                                                  GtkType         type,
210                                                  GtkArg         *arg,
211                                                  guint           arg_id);
212 void            gtk_type_set_arg                (GtkObject      *object,
213                                                  GtkType         type,
214                                                  GtkArg         *arg,
215                                                  guint           arg_id);
216 GtkArg*         gtk_arg_copy                    (GtkArg         *src_arg,
217                                                  GtkArg         *dest_arg);
218 GtkType         gtk_type_register_enum          (const gchar    *type_name,
219                                                  GtkEnumValue   *values);
220 GtkType         gtk_type_register_flags         (const gchar    *type_name,
221                                                  GtkFlagValue   *values);
222 GtkEnumValue*   gtk_type_enum_get_values        (GtkType        enum_type);
223 GtkFlagValue*   gtk_type_flags_get_values       (GtkType        flags_type);
224
225
226 #ifdef __cplusplus
227 }
228 #endif /* __cplusplus */
229
230
231 #endif /* __GTK_TYPE_UTILS_H__ */