]> Pileus Git - ~andy/gtk/blob - gtk/gtktypeutils.h
7b3bac5022cb5827a2aca63e9afbb620797e8199
[~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   GTK_TYPE_INVALID,
37   GTK_TYPE_NONE,
38   GTK_TYPE_CHAR,
39   GTK_TYPE_BOOL,
40   GTK_TYPE_INT,
41   GTK_TYPE_UINT,
42   GTK_TYPE_LONG,
43   GTK_TYPE_ULONG,
44   GTK_TYPE_FLOAT,
45   GTK_TYPE_DOUBLE,
46   GTK_TYPE_STRING,
47   GTK_TYPE_ENUM,
48   GTK_TYPE_FLAGS,
49   GTK_TYPE_BOXED,
50   GTK_TYPE_FOREIGN,
51   GTK_TYPE_CALLBACK,
52   GTK_TYPE_ARGS,
53   
54   GTK_TYPE_POINTER,
55   
56   /* It'd be great if the next two could be removed eventually
57    */
58   GTK_TYPE_SIGNAL,
59   GTK_TYPE_C_CALLBACK,
60   
61   GTK_TYPE_OBJECT
62   
63 } GtkFundamentalType;
64
65 typedef guint GtkType;
66
67 /* Builtin Types
68  */
69 extern GtkType gtk_type_builtins[];
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 /* deprecated
79  */
80 #define GTK_TYPE_IS_A                   gtk_type_is_a
81
82 typedef struct _GtkArg         GtkArg;
83 typedef struct _GtkObject      GtkObject;   /* forward declaration of object type */
84 typedef struct _GtkTypeInfo    GtkTypeInfo;
85
86 typedef void (*GtkClassInitFunc)  (gpointer klass);
87 typedef void (*GtkObjectInitFunc) (gpointer object);
88 typedef void (*GtkArgGetFunc) (GtkObject *object, GtkArg *arg, guint arg_id);
89 typedef void (*GtkArgSetFunc) (GtkObject *object, GtkArg *arg, guint arg_id);
90 typedef gint (*GtkFunction) (gpointer data);
91 typedef void (*GtkCallbackMarshal) (GtkObject *object,
92                                     gpointer data,
93                                     guint n_args,
94                                     GtkArg *args);
95 typedef void (*GtkDestroyNotify) (gpointer data);
96
97 struct _GtkArg
98 {
99   GtkType type;
100   gchar *name;
101
102   union {
103     gchar char_data;
104     gint int_data;
105     guint uint_data;
106     gint bool_data;
107     glong long_data;
108     gulong ulong_data;
109     gfloat float_data;
110     gdouble double_data;
111     gchar *string_data;
112     gpointer pointer_data;
113     GtkObject *object_data;
114     struct {
115       GtkCallbackMarshal marshal;
116       gpointer data;
117       GtkDestroyNotify notify;
118     } callback_data;
119     struct {
120       gpointer data;
121       GtkDestroyNotify notify;
122     } foreign_data;
123     struct {
124       gint n_args;
125       GtkArg *args;
126     } args_data;
127     struct {
128       GtkFunction f;
129       gpointer d;
130     } signal_data;
131     struct {
132       GtkFunction func;
133       gpointer func_data;
134     } c_callback_data;
135   } d;
136 };
137
138 #define GTK_VALUE_CHAR(a)       ((a).d.char_data)
139 #define GTK_VALUE_BOOL(a)       ((a).d.bool_data)
140 #define GTK_VALUE_INT(a)        ((a).d.int_data)
141 #define GTK_VALUE_UINT(a)       ((a).d.uint_data)
142 #define GTK_VALUE_LONG(a)       ((a).d.long_data)
143 #define GTK_VALUE_ULONG(a)      ((a).d.ulong_data)
144 #define GTK_VALUE_FLOAT(a)      ((a).d.float_data)
145 #define GTK_VALUE_DOUBLE(a)     ((a).d.double_data)
146 #define GTK_VALUE_STRING(a)     ((a).d.string_data)
147 #define GTK_VALUE_ENUM(a)       ((a).d.int_data)
148 #define GTK_VALUE_FLAGS(a)      ((a).d.int_data)
149 #define GTK_VALUE_BOXED(a)      ((a).d.pointer_data)
150 #define GTK_VALUE_FOREIGN(a)    ((a).d.foreign_data)
151 #define GTK_VALUE_CALLBACK(a)   ((a).d.callback_data)
152 #define GTK_VALUE_ARGS(a)       ((a).d.args_data)
153 #define GTK_VALUE_OBJECT(a)     ((a).d.object_data)
154 #define GTK_VALUE_POINTER(a)    ((a).d.pointer_data)
155 #define GTK_VALUE_SIGNAL(a)     ((a).d.signal_data)
156 #define GTK_VALUE_C_CALLBACK(a) ((a).d.c_callback_data)
157
158 #define GTK_RETLOC_CHAR(a)      ((gchar*)(a).d.pointer_data)
159 #define GTK_RETLOC_BOOL(a)      ((gint*)(a).d.pointer_data)
160 #define GTK_RETLOC_INT(a)       ((gint*)(a).d.pointer_data)
161 #define GTK_RETLOC_UINT(a)      ((guint*)(a).d.pointer_data)
162 #define GTK_RETLOC_LONG(a)      ((glong*)(a).d.pointer_data)
163 #define GTK_RETLOC_ULONG(a)     ((gulong*)(a).d.pointer_data)
164 #define GTK_RETLOC_FLOAT(a)     ((gfloat*)(a).d.pointer_data)
165 #define GTK_RETLOC_DOUBLE(a)    ((gdouble*)(a).d.pointer_data)
166 #define GTK_RETLOC_STRING(a)    ((gchar**)(a).d.pointer_data)
167 #define GTK_RETLOC_ENUM(a)      ((gint*)(a).d.pointer_data)
168 #define GTK_RETLOC_FLAGS(a)     ((gint*)(a).d.pointer_data)
169 #define GTK_RETLOC_BOXED(a)     ((gpointer*)(a).d.pointer_data)
170 #define GTK_RETLOC_OBJECT(a)    ((GtkObject**)(a).d.pointer_data)
171 #define GTK_RETLOC_POINTER(a)   ((gpointer*)(a).d.pointer_data)
172
173 struct _GtkTypeInfo
174 {
175   gchar *type_name;
176   guint object_size;
177   guint class_size;
178   GtkClassInitFunc class_init_func;
179   GtkObjectInitFunc object_init_func;
180   GtkArgSetFunc arg_set_func;
181   GtkArgGetFunc arg_get_func;
182 };
183
184
185 void     gtk_type_init              (void);
186 GtkType  gtk_type_unique            (guint        parent_type,
187                                      GtkTypeInfo *type_info);
188 gchar*   gtk_type_name              (guint        type);
189 GtkType  gtk_type_from_name         (const gchar *name);
190 GtkType  gtk_type_parent            (GtkType      type);
191 gpointer gtk_type_class             (GtkType      type);
192 gpointer gtk_type_parent_class      (GtkType      type);
193 gpointer gtk_type_new               (GtkType      type);
194 void     gtk_type_describe_heritage (GtkType      type);
195 void     gtk_type_describe_tree     (GtkType      type,
196                                      gint         show_size);
197 gint     gtk_type_is_a              (GtkType      type,
198                                      GtkType      is_a_type);
199 void     gtk_type_get_arg           (GtkObject   *object,
200                                      GtkType      type,
201                                      GtkArg      *arg,
202                                      guint        arg_id);
203 void     gtk_type_set_arg           (GtkObject   *object,
204                                      GtkType      type,
205                                      GtkArg      *arg,
206                                      guint        arg_id);
207 GtkArg*  gtk_arg_copy               (GtkArg      *src_arg,
208                                      GtkArg      *dest_arg);
209
210
211
212 #ifdef __cplusplus
213 }
214 #endif /* __cplusplus */
215
216
217 #endif /* __GTK_TYPE_UTILS_H__ */