]> Pileus Git - ~andy/gtk/blob - gtk/gtktypeutils.h
Initial revision
[~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 Free
16  * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
17  */
18 #ifndef __GTK_TYPE_UTILS_H__
19 #define __GTK_TYPE_UTILS_H__
20
21
22 #include <gdk/gdk.h>
23
24
25 #ifdef __cplusplus
26 extern "C" {
27 #endif /* __cplusplus */
28
29
30 /* Fundamental Types */
31
32 typedef enum
33 {
34   GTK_TYPE_INVALID,
35   GTK_TYPE_NONE,
36   GTK_TYPE_CHAR,
37   GTK_TYPE_BOOL,
38   GTK_TYPE_INT,
39   GTK_TYPE_UINT,
40   GTK_TYPE_LONG,
41   GTK_TYPE_ULONG,
42   GTK_TYPE_FLOAT,
43   GTK_TYPE_STRING,
44   GTK_TYPE_ENUM,
45   GTK_TYPE_FLAGS,
46   GTK_TYPE_BOXED,
47   GTK_TYPE_FOREIGN,
48   GTK_TYPE_CALLBACK,
49   GTK_TYPE_ARGS,
50
51   GTK_TYPE_POINTER,
52
53   /* it'd be great if the next two could be removed eventually */
54   GTK_TYPE_SIGNAL,
55   GTK_TYPE_C_CALLBACK,
56
57   GTK_TYPE_OBJECT
58
59 } GtkFundamentalType;
60
61 typedef guint GtkType;
62
63 /* Builtin Types */
64
65 extern GtkType gtk_type_builtins[];
66 #include <gtk/gtktypebuiltins.h>
67
68 /* General Types */
69
70 #define GTK_TYPE_MAKE(ft, seqno) (((seqno)<<8)|ft)
71 #define GTK_FUNDAMENTAL_TYPE(t)  ((GtkFundamentalType)((t)&0xFF))
72 #define GTK_TYPE_SEQNO(t)        ((t)>0xFF? (t)>>8:(t))
73
74 typedef struct _GtkArg         GtkArg;
75 typedef struct _GtkObject      GtkObject;   /* forward declaration of object type */
76 typedef struct _GtkTypeInfo    GtkTypeInfo;
77
78 typedef void (*GtkClassInitFunc)  (gpointer klass);
79 typedef void (*GtkObjectInitFunc) (gpointer object);
80 typedef void (*GtkArgFunc) (GtkObject *object, GtkArg *arg);
81 typedef gint (*GtkFunction) (gpointer data);
82 typedef void (*GtkRemoveFunction) (gpointer data);
83 typedef void (*GtkCallbackMarshal) (GtkObject *object,
84                                     gpointer data,
85                                     int n_args,
86                                     GtkArg *args);
87 typedef void (*GtkDestroyNotify) (gpointer data);
88
89 struct _GtkArg
90 {
91   GtkType type;
92   char *name;
93
94   union {
95     gchar char_data;
96     gint int_data;
97     guint uint_data;
98     gint bool_data;
99     glong long_data;
100     gulong ulong_data;
101     gfloat float_data;
102     gchar *string_data;
103     gpointer pointer_data;
104     GtkObject *object_data;
105     struct {
106       GtkCallbackMarshal marshal;
107       gpointer data;
108       GtkDestroyNotify notify;
109     } callback_data;
110     struct {
111       gpointer data;
112       GtkDestroyNotify notify;
113     } foreign_data;
114     struct {
115       gint n_args;
116       GtkArg *args;
117     } args_data;
118     struct {
119       GtkFunction f;
120       gpointer d;
121     } signal_data;
122     struct {
123       GtkFunction func;
124       gpointer func_data;
125     } c_callback_data;
126   } d;
127 };
128
129 #define GTK_VALUE_CHAR(a)       ((a).d.char_data)
130 #define GTK_VALUE_BOOL(a)       ((a).d.bool_data)
131 #define GTK_VALUE_INT(a)        ((a).d.int_data)
132 #define GTK_VALUE_UINT(a)       ((a).d.uint_data)
133 #define GTK_VALUE_LONG(a)       ((a).d.long_data)
134 #define GTK_VALUE_ULONG(a)      ((a).d.ulong_data)
135 #define GTK_VALUE_FLOAT(a)      ((a).d.float_data)
136 #define GTK_VALUE_STRING(a)     ((a).d.string_data)
137 #define GTK_VALUE_ENUM(a)       ((a).d.int_data)
138 #define GTK_VALUE_FLAGS(a)      ((a).d.int_data)
139 #define GTK_VALUE_BOXED(a)      ((a).d.pointer_data)
140 #define GTK_VALUE_FOREIGN(a)    ((a).d.foreign_data)
141 #define GTK_VALUE_CALLBACK(a)   ((a).d.callback_data)
142 #define GTK_VALUE_ARGS(a)       ((a).d.args_data)
143 #define GTK_VALUE_OBJECT(a)     ((a).d.object_data)
144 #define GTK_VALUE_POINTER(a)    ((a).d.pointer_data)
145 #define GTK_VALUE_SIGNAL(a)     ((a).d.signal_data)
146 #define GTK_VALUE_C_CALLBACK(a) ((a).d.c_callback_data)
147
148 #define GTK_RETLOC_CHAR(a)      ((gchar*)(a).d.pointer_data)
149 #define GTK_RETLOC_BOOL(a)      ((gint*)(a).d.pointer_data)
150 #define GTK_RETLOC_INT(a)       ((gint*)(a).d.pointer_data)
151 #define GTK_RETLOC_UINT(a)      ((guint*)(a).d.pointer_data)
152 #define GTK_RETLOC_LONG(a)      ((glong*)(a).d.pointer_data)
153 #define GTK_RETLOC_ULONG(a)     ((gulong*)(a).d.pointer_data)
154 #define GTK_RETLOC_FLOAT(a)     ((gfloat*)(a).d.pointer_data)
155 #define GTK_RETLOC_STRING(a)    ((gchar**)(a).d.pointer_data)
156 #define GTK_RETLOC_ENUM(a)      ((gint*)(a).d.pointer_data)
157 #define GTK_RETLOC_FLAGS(a)     ((gint*)(a).d.pointer_data)
158 #define GTK_RETLOC_BOXED(a)     ((gpointer*)(a).d.pointer_data)
159 #define GTK_RETLOC_OBJECT(a)    ((GtkObject**)(a).d.pointer_data)
160 #define GTK_RETLOC_POINTER(a)   ((gpointer*)(a).d.pointer_data)
161
162 struct _GtkTypeInfo
163 {
164   gchar *type_name;
165   guint object_size;
166   guint class_size;
167   GtkClassInitFunc class_init_func;
168   GtkObjectInitFunc object_init_func;
169   GtkArgFunc arg_func;
170 };
171
172
173 void     gtk_type_init              (void);
174 GtkType  gtk_type_unique            (guint        parent_type,
175                                      GtkTypeInfo *type_info);
176 gchar*   gtk_type_name              (guint        type);
177 GtkType  gtk_type_from_name         (const gchar *name);
178 GtkType  gtk_type_parent            (GtkType      type);
179 gpointer gtk_type_class             (GtkType      type);
180 gpointer gtk_type_new               (GtkType      type);
181 void     gtk_type_describe_heritage (GtkType      type);
182 void     gtk_type_describe_tree     (GtkType      type,
183                                      gint         show_size);
184 gint     gtk_type_is_a              (GtkType      type,
185                                      GtkType      is_a_type);
186 void     gtk_type_set_arg           (GtkObject   *object,
187                                      GtkType      type,
188                                      GtkArg      *arg);
189
190
191 #ifdef __cplusplus
192 }
193 #endif /* __cplusplus */
194
195
196 #endif /* __GTK_TYPE_UTILS_H__ */