]> Pileus Git - ~andy/gtk/blob - gdk/broadway/gdkvisual-broadway.c
[broadway] Fix up nvisuals handling
[~andy/gtk] / gdk / broadway / gdkvisual-broadway.c
1 /* GDK - The GIMP Drawing Kit
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 #include "config.h"
28
29 #include "gdkvisual.h"
30
31 #include "gdkprivate-broadway.h"
32 #include "gdkscreen-broadway.h"
33 #include "gdkinternals.h"
34
35 struct _GdkVisualPrivate
36 {
37   GdkScreen *screen;
38 };
39
40 struct _GdkVisualClass
41 {
42   GObjectClass parent_class;
43 };
44
45 static void     gdk_visual_decompose_mask (gulong     mask,
46                                            gint      *shift,
47                                            gint      *prec);
48
49
50 G_DEFINE_TYPE (GdkVisual, gdk_visual, G_TYPE_OBJECT)
51
52 static void
53 gdk_visual_finalize (GObject *object)
54 {
55   G_OBJECT_CLASS (gdk_visual_parent_class)->finalize (object);
56 }
57
58 static void
59 gdk_visual_class_init (GdkVisualClass *visual_class)
60 {
61   GObjectClass *object_class = G_OBJECT_CLASS (visual_class);
62
63   g_type_class_add_private (object_class, sizeof (GdkVisualPrivate));
64
65   object_class->finalize = gdk_visual_finalize;
66 }
67
68 static void
69 gdk_visual_init (GdkVisual *visual)
70 {
71   visual->priv = G_TYPE_INSTANCE_GET_PRIVATE (visual,
72                                               GDK_TYPE_VISUAL,
73                                               GdkVisualPrivate);
74
75 }
76
77 void
78 _gdk_visual_init (GdkScreen *screen)
79 {
80   GdkScreenBroadway *screen_broadway;
81   GdkVisual **visuals;
82   int nvisuals;
83
84   g_return_if_fail (GDK_IS_SCREEN (screen));
85   screen_broadway = GDK_SCREEN_BROADWAY (screen);
86
87   nvisuals = 2;
88   visuals = g_new (GdkVisual *, nvisuals);
89
90   visuals[0] = g_object_new (GDK_TYPE_VISUAL, NULL);
91   visuals[0]->priv->screen = screen;
92   visuals[0]->type = GDK_VISUAL_TRUE_COLOR;
93   visuals[0]->depth = 32;
94   visuals[0]->byte_order = (G_BYTE_ORDER == G_LITTLE_ENDIAN) ? GDK_LSB_FIRST : GDK_MSB_FIRST;
95   visuals[0]->red_mask = 0xff0000;
96   visuals[0]->green_mask = 0xff00;
97   visuals[0]->blue_mask = 0xff;
98   visuals[0]->colormap_size = 256;
99   visuals[0]->bits_per_rgb = 8;
100   gdk_visual_decompose_mask (visuals[0]->red_mask,
101                              &visuals[0]->red_shift,
102                              &visuals[0]->red_prec);
103   gdk_visual_decompose_mask (visuals[0]->green_mask,
104                              &visuals[0]->green_shift,
105                              &visuals[0]->green_prec);
106   gdk_visual_decompose_mask (visuals[0]->blue_mask,
107                              &visuals[0]->blue_shift,
108                              &visuals[0]->blue_prec);
109
110   visuals[1] = g_object_new (GDK_TYPE_VISUAL, NULL);
111   visuals[1]->priv->screen = screen;
112   visuals[1]->type = GDK_VISUAL_TRUE_COLOR;
113   visuals[1]->depth = 24;
114   visuals[1]->byte_order = (G_BYTE_ORDER == G_LITTLE_ENDIAN) ? GDK_LSB_FIRST : GDK_MSB_FIRST;
115   visuals[1]->red_mask = 0xff0000;
116   visuals[1]->green_mask = 0xff00;
117   visuals[1]->blue_mask = 0xff;
118   visuals[1]->colormap_size = 256;
119   visuals[1]->bits_per_rgb = 8;
120   gdk_visual_decompose_mask (visuals[1]->red_mask,
121                              &visuals[1]->red_shift,
122                              &visuals[1]->red_prec);
123   gdk_visual_decompose_mask (visuals[1]->green_mask,
124                              &visuals[1]->green_shift,
125                              &visuals[1]->green_prec);
126   gdk_visual_decompose_mask (visuals[1]->blue_mask,
127                              &visuals[1]->blue_shift,
128                              &visuals[1]->blue_prec);
129
130   screen_broadway->system_visual = visuals[1];
131   screen_broadway->rgba_visual = visuals[0];
132
133   screen_broadway->navailable_depths = 2;
134   screen_broadway->available_depths[0] = 32;
135   screen_broadway->available_depths[1] = 24;
136
137   screen_broadway->navailable_types = 1;
138   screen_broadway->available_types[0] = GDK_VISUAL_TRUE_COLOR;
139
140   screen_broadway->visuals = visuals;
141   screen_broadway->nvisuals = nvisuals;
142 }
143
144 gint
145 gdk_visual_get_best_depth (void)
146 {
147   GdkScreen *screen = gdk_screen_get_default();
148
149   return GDK_SCREEN_BROADWAY (screen)->available_depths[0];
150 }
151
152 GdkVisualType
153 gdk_visual_get_best_type (void)
154 {
155   GdkScreen *screen = gdk_screen_get_default();
156
157   return GDK_SCREEN_BROADWAY (screen)->available_types[0];
158 }
159
160 GdkVisual *
161 gdk_screen_get_system_visual (GdkScreen * screen)
162 {
163   g_return_val_if_fail (GDK_IS_SCREEN (screen), NULL);
164
165   return ((GdkVisual *) GDK_SCREEN_BROADWAY (screen)->system_visual);
166 }
167
168 GdkVisual*
169 gdk_visual_get_best (void)
170 {
171   GdkScreenBroadway *screen_broadway = GDK_SCREEN_BROADWAY (gdk_screen_get_default());
172
173   return (GdkVisual *)screen_broadway->visuals[0];
174 }
175
176 GdkVisual*
177 gdk_visual_get_best_with_depth (gint depth)
178 {
179   GdkScreenBroadway *screen_broadway = GDK_SCREEN_BROADWAY (gdk_screen_get_default ());
180   GdkVisual *return_val;
181   int i;
182
183   return_val = NULL;
184   for (i = 0; i < screen_broadway->nvisuals; i++)
185     if (depth == screen_broadway->visuals[i]->depth)
186       {
187         return_val = (GdkVisual *) screen_broadway->visuals[i];
188         break;
189       }
190
191   return return_val;
192 }
193
194 GdkVisual*
195 gdk_visual_get_best_with_type (GdkVisualType visual_type)
196 {
197   GdkScreenBroadway *screen_broadway = GDK_SCREEN_BROADWAY (gdk_screen_get_default ());
198   GdkVisual *return_val;
199   int i;
200
201   return_val = NULL;
202   for (i = 0; i < screen_broadway->nvisuals; i++)
203     if (visual_type == screen_broadway->visuals[i]->type)
204       {
205         return_val = (GdkVisual *) screen_broadway->visuals[i];
206         break;
207       }
208
209   return return_val;
210 }
211
212 GdkVisual*
213 gdk_visual_get_best_with_both (gint          depth,
214                                GdkVisualType visual_type)
215 {
216   GdkScreenBroadway *screen_broadway = GDK_SCREEN_BROADWAY (gdk_screen_get_default ());
217   GdkVisual *return_val;
218   int i;
219
220   return_val = NULL;
221   for (i = 0; i < screen_broadway->nvisuals; i++)
222     if ((depth == screen_broadway->visuals[i]->depth) &&
223         (visual_type == screen_broadway->visuals[i]->type))
224       {
225         return_val = (GdkVisual *) screen_broadway->visuals[i];
226         break;
227       }
228
229   return return_val;
230 }
231
232 void
233 gdk_query_depths  (gint **depths,
234                    gint  *count)
235 {
236   GdkScreenBroadway *screen_broadway = GDK_SCREEN_BROADWAY (gdk_screen_get_default ());
237
238   *count = screen_broadway->navailable_depths;
239   *depths = screen_broadway->available_depths;
240 }
241
242 void
243 gdk_query_visual_types (GdkVisualType **visual_types,
244                         gint           *count)
245 {
246   GdkScreenBroadway *screen_broadway = GDK_SCREEN_BROADWAY (gdk_screen_get_default ());
247
248   *count = screen_broadway->navailable_types;
249   *visual_types = screen_broadway->available_types;
250 }
251
252 GList *
253 gdk_screen_list_visuals (GdkScreen *screen)
254 {
255   GList *list;
256   GdkScreenBroadway *screen_broadway;
257   guint i;
258
259   g_return_val_if_fail (GDK_IS_SCREEN (screen), NULL);
260   screen_broadway = GDK_SCREEN_BROADWAY (screen);
261
262   list = NULL;
263
264   for (i = 0; i < screen_broadway->nvisuals; ++i)
265     list = g_list_append (list, screen_broadway->visuals[i]);
266
267   return list;
268 }
269
270 static void
271 gdk_visual_decompose_mask (gulong  mask,
272                            gint   *shift,
273                            gint   *prec)
274 {
275   *shift = 0;
276   *prec = 0;
277
278   if (mask == 0)
279     {
280       g_warning ("Mask is 0 in visual. Server bug ?");
281       return;
282     }
283
284   while (!(mask & 0x1))
285     {
286       (*shift)++;
287       mask >>= 1;
288     }
289
290   while (mask & 0x1)
291     {
292       (*prec)++;
293       mask >>= 1;
294     }
295 }
296
297 GdkScreen *
298 gdk_visual_get_screen (GdkVisual *visual)
299 {
300   g_return_val_if_fail (GDK_IS_VISUAL (visual), NULL);
301
302   return visual->priv->screen;
303 }