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