]> Pileus Git - ~andy/gtk/blob - gtk/gtktypeutils.c
The render vfunc takes a GdkDrawable* instead of a GdkWindow*, because
[~andy/gtk] / gtk / gtktypeutils.c
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 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 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
20 /*
21  * Modified by the GTK+ Team and others 1997-2000.  See the AUTHORS
22  * file for a list of people on the GTK+ Team.  See the ChangeLog
23  * files for a list of changes.  These files are distributed with
24  * GTK+ at ftp://ftp.gtk.org/pub/gtk/. 
25  */
26
27 #undef GTK_DISABLE_DEPRECATED
28
29 #include <string.h> /* strcmp */
30
31 #include "gtktypeutils.h"
32 #include "gtkobject.h"
33
34
35 /* --- functions --- */
36 GtkType
37 gtk_type_unique (GtkType            parent_type,
38                  const GtkTypeInfo *gtkinfo)
39 {
40   GTypeInfo tinfo = { 0, };
41
42   g_return_val_if_fail (GTK_TYPE_IS_OBJECT (parent_type), 0);
43   g_return_val_if_fail (gtkinfo != NULL, 0);
44   g_return_val_if_fail (gtkinfo->type_name != NULL, 0);
45   g_return_val_if_fail (g_type_from_name (gtkinfo->type_name) == 0, 0);
46
47   tinfo.class_size = gtkinfo->class_size;
48   tinfo.base_init = gtkinfo->base_class_init_func;
49   tinfo.base_finalize = NULL;
50   tinfo.class_init = (GClassInitFunc) gtkinfo->class_init_func;
51   tinfo.class_finalize = NULL;
52   tinfo.class_data = NULL;
53   tinfo.instance_size = gtkinfo->object_size;
54   tinfo.n_preallocs = 0;
55   tinfo.instance_init = gtkinfo->object_init_func;
56
57   return g_type_register_static (parent_type, gtkinfo->type_name, &tinfo, 0);
58 }
59
60 gpointer
61 gtk_type_class (GtkType type)
62 {
63   static GQuark quark_static_class = 0;
64   gpointer class;
65
66   if (!G_TYPE_IS_ENUM (type) && !G_TYPE_IS_FLAGS (type))
67     g_return_val_if_fail (G_TYPE_IS_OBJECT (type), NULL);
68
69   /* ok, this is a bit ugly, GLib reference counts classes,
70    * and gtk_type_class() used to always return static classes.
71    * while we coud be faster with just peeking the glib class
72    * for the normal code path, we can't be sure that that
73    * class stays around (someone else might be holding the
74    * reference count and is going to drop it later). so to
75    * ensure that Gtk actually holds a static reference count
76    * on the class, we use GType qdata to store referenced
77    * classes, and only return those.
78    */
79
80   class = g_type_get_qdata (type, quark_static_class);
81   if (!class)
82     {
83       if (!quark_static_class)
84         quark_static_class = g_quark_from_static_string ("GtkStaticTypeClass");
85
86       class = g_type_class_ref (type);
87       g_assert (class != NULL);
88       g_type_set_qdata (type, quark_static_class, class);
89     }
90
91   return class;
92 }
93
94 gpointer
95 gtk_type_new (GtkType type)
96 {
97   gpointer object;
98
99   g_return_val_if_fail (GTK_TYPE_IS_OBJECT (type), NULL);
100
101   object = g_object_new (type, NULL);
102
103   return object;
104 }
105
106 void
107 gtk_type_init (GTypeDebugFlags debug_flags)
108 {
109   static gboolean initialized = FALSE;
110   
111   if (!initialized)
112     {
113       initialized = TRUE;
114
115       /* initialize GLib type system
116        */
117       g_type_init_with_debug_flags (debug_flags);
118       
119       /* GTK_TYPE_OBJECT
120        */
121       gtk_object_get_type ();
122     }
123 }
124
125 GType
126 gtk_identifier_get_type (void)
127 {
128   static GType our_type = 0;
129   
130   if (our_type == 0)
131     {
132       GTypeInfo tinfo = { 0, };
133       our_type = g_type_register_static (G_TYPE_STRING, "GtkIdentifier", &tinfo, 0);
134     }
135
136   return our_type;
137 }
138
139 GtkEnumValue*
140 gtk_type_enum_get_values (GtkType enum_type)
141 {
142   GEnumClass *class;
143
144   g_return_val_if_fail (G_TYPE_IS_ENUM (enum_type), NULL);
145   
146   class = gtk_type_class (enum_type);
147   
148   return class->values;
149 }
150
151 GtkFlagValue*
152 gtk_type_flags_get_values (GtkType flags_type)
153 {
154   GFlagsClass *class;
155
156   g_return_val_if_fail (G_TYPE_IS_FLAGS (flags_type), NULL);
157
158   class = gtk_type_class (flags_type);
159
160   return class->values;
161 }
162
163 GtkEnumValue*
164 gtk_type_enum_find_value (GtkType      enum_type,
165                           const gchar *value_name)
166 {
167   GtkEnumValue *value;
168   GEnumClass *class;
169
170   g_return_val_if_fail (G_TYPE_IS_ENUM (enum_type), NULL);
171   g_return_val_if_fail (value_name != NULL, NULL);
172
173   class = gtk_type_class (enum_type);
174   value = g_enum_get_value_by_name (class, value_name);
175   if (!value)
176     value = g_enum_get_value_by_nick (class, value_name);
177
178   return value;
179 }
180
181 GtkFlagValue*
182 gtk_type_flags_find_value (GtkType      flags_type,
183                            const gchar *value_name)
184 {
185   GtkFlagValue *value;
186   GFlagsClass *class;
187
188   g_return_val_if_fail (G_TYPE_IS_FLAGS (flags_type), NULL);
189   g_return_val_if_fail (value_name != NULL, NULL);
190
191   class = gtk_type_class (flags_type);
192   value = g_flags_get_value_by_name (class, value_name);
193   if (!value)
194     value = g_flags_get_value_by_nick (class, value_name);
195
196   return value;
197 }
198