]> Pileus Git - ~andy/gtk/blob - gdk/broadway/gdkvisual-broadway.c
Change FSF Address
[~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, see <http://www.gnu.org/licenses/>.
16  */
17
18 /*
19  * Modified by the GTK+ Team and others 1997-2000.  See the AUTHORS
20  * file for a list of people on the GTK+ Team.  See the ChangeLog
21  * files for a list of changes.  These files are distributed with
22  * GTK+ at ftp://ftp.gtk.org/pub/gtk/.
23  */
24
25 #include "config.h"
26
27 #include "gdkvisualprivate.h"
28
29 #include "gdkprivate-broadway.h"
30 #include "gdkscreen-broadway.h"
31 #include "gdkinternals.h"
32
33 struct _GdkBroadwayVisual
34 {
35   GdkVisual visual;
36 };
37
38 struct _GdkBroadwayVisualClass
39 {
40   GObjectClass parent_class;
41 };
42
43 static void     gdk_visual_decompose_mask (gulong     mask,
44                                            gint      *shift,
45                                            gint      *prec);
46
47
48 G_DEFINE_TYPE (GdkBroadwayVisual, gdk_broadway_visual, GDK_TYPE_VISUAL)
49
50 static void
51 gdk_broadway_visual_finalize (GObject *object)
52 {
53   G_OBJECT_CLASS (gdk_broadway_visual_parent_class)->finalize (object);
54 }
55
56 static void
57 gdk_broadway_visual_class_init (GdkBroadwayVisualClass *visual_class)
58 {
59   GObjectClass *object_class = G_OBJECT_CLASS (visual_class);
60
61   object_class->finalize = gdk_broadway_visual_finalize;
62 }
63
64 static void
65 gdk_broadway_visual_init (GdkBroadwayVisual *visual)
66 {
67 }
68
69 void
70 _gdk_broadway_screen_init_visuals (GdkScreen *screen)
71 {
72   GdkBroadwayScreen *broadway_screen;
73   GdkVisual **visuals;
74   int nvisuals;
75
76   g_return_if_fail (GDK_IS_SCREEN (screen));
77   broadway_screen = GDK_BROADWAY_SCREEN (screen);
78
79   nvisuals = 2;
80   visuals = g_new (GdkVisual *, nvisuals);
81
82   visuals[0] = g_object_new (GDK_TYPE_BROADWAY_VISUAL, NULL);
83   visuals[0]->screen = screen;
84   visuals[0]->type = GDK_VISUAL_TRUE_COLOR;
85   visuals[0]->depth = 32;
86   visuals[0]->byte_order = (G_BYTE_ORDER == G_LITTLE_ENDIAN) ? GDK_LSB_FIRST : GDK_MSB_FIRST;
87   visuals[0]->red_mask = 0xff0000;
88   visuals[0]->green_mask = 0xff00;
89   visuals[0]->blue_mask = 0xff;
90   visuals[0]->colormap_size = 256;
91   visuals[0]->bits_per_rgb = 8;
92   gdk_visual_decompose_mask (visuals[0]->red_mask,
93                              &visuals[0]->red_shift,
94                              &visuals[0]->red_prec);
95   gdk_visual_decompose_mask (visuals[0]->green_mask,
96                              &visuals[0]->green_shift,
97                              &visuals[0]->green_prec);
98   gdk_visual_decompose_mask (visuals[0]->blue_mask,
99                              &visuals[0]->blue_shift,
100                              &visuals[0]->blue_prec);
101
102   visuals[1] = g_object_new (GDK_TYPE_BROADWAY_VISUAL, NULL);
103   visuals[1]->screen = screen;
104   visuals[1]->type = GDK_VISUAL_TRUE_COLOR;
105   visuals[1]->depth = 24;
106   visuals[1]->byte_order = (G_BYTE_ORDER == G_LITTLE_ENDIAN) ? GDK_LSB_FIRST : GDK_MSB_FIRST;
107   visuals[1]->red_mask = 0xff0000;
108   visuals[1]->green_mask = 0xff00;
109   visuals[1]->blue_mask = 0xff;
110   visuals[1]->colormap_size = 256;
111   visuals[1]->bits_per_rgb = 8;
112   gdk_visual_decompose_mask (visuals[1]->red_mask,
113                              &visuals[1]->red_shift,
114                              &visuals[1]->red_prec);
115   gdk_visual_decompose_mask (visuals[1]->green_mask,
116                              &visuals[1]->green_shift,
117                              &visuals[1]->green_prec);
118   gdk_visual_decompose_mask (visuals[1]->blue_mask,
119                              &visuals[1]->blue_shift,
120                              &visuals[1]->blue_prec);
121
122   broadway_screen->system_visual = visuals[1];
123   broadway_screen->rgba_visual = visuals[0];
124
125   broadway_screen->navailable_depths = 2;
126   broadway_screen->available_depths[0] = 32;
127   broadway_screen->available_depths[1] = 24;
128
129   broadway_screen->navailable_types = 1;
130   broadway_screen->available_types[0] = GDK_VISUAL_TRUE_COLOR;
131
132   broadway_screen->visuals = visuals;
133   broadway_screen->nvisuals = nvisuals;
134 }
135
136 gint
137 _gdk_broadway_screen_visual_get_best_depth (GdkScreen * screen)
138 {
139   return GDK_BROADWAY_SCREEN (screen)->available_depths[0];
140 }
141
142 GdkVisualType
143 _gdk_broadway_screen_visual_get_best_type (GdkScreen * screen)
144 {
145   return GDK_BROADWAY_SCREEN (screen)->available_types[0];
146 }
147
148 GdkVisual *
149 _gdk_broadway_screen_get_system_visual (GdkScreen * screen)
150 {
151   g_return_val_if_fail (GDK_IS_SCREEN (screen), NULL);
152
153   return ((GdkVisual *) GDK_BROADWAY_SCREEN (screen)->system_visual);
154 }
155
156 GdkVisual*
157 _gdk_broadway_screen_visual_get_best (GdkScreen * screen)
158 {
159   GdkBroadwayScreen *broadway_screen = GDK_BROADWAY_SCREEN (screen);
160
161   return (GdkVisual *)broadway_screen->visuals[0];
162 }
163
164 GdkVisual*
165 _gdk_broadway_screen_visual_get_best_with_depth (GdkScreen * screen,
166                                                  gint depth)
167 {
168   GdkBroadwayScreen *broadway_screen = GDK_BROADWAY_SCREEN (screen);
169   GdkVisual *return_val;
170   int i;
171
172   return_val = NULL;
173   for (i = 0; i < broadway_screen->nvisuals; i++)
174     if (depth == broadway_screen->visuals[i]->depth)
175       {
176         return_val = (GdkVisual *) broadway_screen->visuals[i];
177         break;
178       }
179
180   return return_val;
181 }
182
183 GdkVisual*
184 _gdk_broadway_screen_visual_get_best_with_type (GdkScreen * screen,
185                                                 GdkVisualType visual_type)
186 {
187   GdkBroadwayScreen *broadway_screen = GDK_BROADWAY_SCREEN (screen);
188   GdkVisual *return_val;
189   int i;
190
191   return_val = NULL;
192   for (i = 0; i < broadway_screen->nvisuals; i++)
193     if (visual_type == broadway_screen->visuals[i]->type)
194       {
195         return_val = (GdkVisual *) broadway_screen->visuals[i];
196         break;
197       }
198
199   return return_val;
200 }
201
202 GdkVisual*
203 _gdk_broadway_screen_visual_get_best_with_both (GdkScreen * screen,
204                                                 gint          depth,
205                                                 GdkVisualType visual_type)
206 {
207   GdkBroadwayScreen *broadway_screen = GDK_BROADWAY_SCREEN (screen);
208   GdkVisual *return_val;
209   int i;
210
211   return_val = NULL;
212   for (i = 0; i < broadway_screen->nvisuals; i++)
213     if ((depth == broadway_screen->visuals[i]->depth) &&
214         (visual_type == broadway_screen->visuals[i]->type))
215       {
216         return_val = (GdkVisual *) broadway_screen->visuals[i];
217         break;
218       }
219
220   return return_val;
221 }
222
223 void
224 _gdk_broadway_screen_query_depths  (GdkScreen * screen,
225                                     gint **depths,
226                                     gint  *count)
227 {
228   GdkBroadwayScreen *broadway_screen = GDK_BROADWAY_SCREEN (screen);
229
230   *count = broadway_screen->navailable_depths;
231   *depths = broadway_screen->available_depths;
232 }
233
234 void
235 _gdk_broadway_screen_query_visual_types (GdkScreen * screen,
236                                          GdkVisualType **visual_types,
237                                          gint           *count)
238 {
239   GdkBroadwayScreen *broadway_screen = GDK_BROADWAY_SCREEN (screen);
240
241   *count = broadway_screen->navailable_types;
242   *visual_types = broadway_screen->available_types;
243 }
244
245 GList *
246 _gdk_broadway_screen_list_visuals (GdkScreen *screen)
247 {
248   GList *list;
249   GdkBroadwayScreen *broadway_screen;
250   guint i;
251
252   g_return_val_if_fail (GDK_IS_SCREEN (screen), NULL);
253   broadway_screen = GDK_BROADWAY_SCREEN (screen);
254
255   list = NULL;
256
257   for (i = 0; i < broadway_screen->nvisuals; ++i)
258     list = g_list_append (list, broadway_screen->visuals[i]);
259
260   return list;
261 }
262
263 static void
264 gdk_visual_decompose_mask (gulong  mask,
265                            gint   *shift,
266                            gint   *prec)
267 {
268   *shift = 0;
269   *prec = 0;
270
271   if (mask == 0)
272     {
273       g_warning ("Mask is 0 in visual. Server bug ?");
274       return;
275     }
276
277   while (!(mask & 0x1))
278     {
279       (*shift)++;
280       mask >>= 1;
281     }
282
283   while (mask & 0x1)
284     {
285       (*prec)++;
286       mask >>= 1;
287     }
288 }