1 /* gdkvisual-quartz.c
2  *
3  * Copyright (C) 2005 Imendio AB
4  *
5  * This library is free software; you can redistribute it and/or
6  * modify it under the terms of the GNU Lesser General Public
7  * License as published by the Free Software Foundation; either
8  * version 2 of the License, or (at your option) any later version.
9  *
10  * This library is distributed in the hope that it will be useful,
11  * but WITHOUT ANY WARRANTY; without even the implied warranty of
12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
13  * Lesser General Public License for more details.
14  *
15  * You should have received a copy of the GNU Lesser General Public
16  * License along with this library; if not, write to the
17  * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
18  * Boston, MA 02111-1307, USA.
19  */
20 
21 #include "config.h"
22 
23 #include "gdkvisual.h"
24 #include "gdkprivate-quartz.h"
25 
26 static GdkVisual *system_visual;
27 static GdkVisual *rgba_visual;
28 static GdkVisual *gray_visual;
29 
30 static void
gdk_visual_finalize(GObject * object)31 gdk_visual_finalize (GObject *object)
32 {
33   g_error ("A GdkVisual object was finalized. This should not happen");
34 }
35 
36 static void
gdk_visual_class_init(GObjectClass * class)37 gdk_visual_class_init (GObjectClass *class)
38 {
39   class->finalize = gdk_visual_finalize;
40 }
41 
42 GType
gdk_visual_get_type(void)43 gdk_visual_get_type (void)
44 {
45   static GType object_type = 0;
46 
47   if (!object_type)
48     {
49       const GTypeInfo object_info =
50       {
51         sizeof (GdkVisualClass),
52         (GBaseInitFunc) NULL,
53         (GBaseFinalizeFunc) NULL,
54         (GClassInitFunc) gdk_visual_class_init,
55         NULL,           /* class_finalize */
56         NULL,           /* class_data */
57         sizeof (GdkVisual),
58         0,              /* n_preallocs */
59         (GInstanceInitFunc) NULL,
60       };
61 
62       object_type = g_type_register_static (G_TYPE_OBJECT,
63                                             "GdkVisual",
64                                             &object_info, 0);
65     }
66 
67   return object_type;
68 }
69 
70 static void
gdk_visual_decompose_mask(gulong mask,gint * shift,gint * prec)71 gdk_visual_decompose_mask (gulong  mask,
72 			   gint   *shift,
73 			   gint   *prec)
74 {
75   *shift = 0;
76   *prec = 0;
77 
78   while (!(mask & 0x1))
79     {
80       (*shift)++;
81       mask >>= 1;
82     }
83 
84   while (mask & 0x1)
85     {
86       (*prec)++;
87       mask >>= 1;
88     }
89 }
90 
91 static GdkVisual *
create_standard_visual(gint depth)92 create_standard_visual (gint depth)
93 {
94   GdkVisual *visual = g_object_new (GDK_TYPE_VISUAL, NULL);
95 
96   visual->depth = depth;
97   visual->byte_order = GDK_MSB_FIRST; /* FIXME: Should this be different on intel macs? */
98   visual->colormap_size = 0;
99 
100   visual->type = GDK_VISUAL_TRUE_COLOR;
101 
102   visual->red_mask = 0xff0000;
103   visual->green_mask = 0xff00;
104   visual->blue_mask = 0xff;
105 
106   gdk_visual_decompose_mask (visual->red_mask,
107 			     &visual->red_shift,
108 			     &visual->red_prec);
109   gdk_visual_decompose_mask (visual->green_mask,
110 			     &visual->green_shift,
111 			     &visual->green_prec);
112   gdk_visual_decompose_mask (visual->blue_mask,
113 			     &visual->blue_shift,
114 			     &visual->blue_prec);
115 
116   return visual;
117 }
118 
119 static GdkVisual *
create_gray_visual(void)120 create_gray_visual (void)
121 {
122   GdkVisual *visual = g_object_new (GDK_TYPE_VISUAL, NULL);
123 
124   visual->depth = 1;
125   visual->byte_order = GDK_MSB_FIRST;
126   visual->colormap_size = 0;
127 
128   visual->type = GDK_VISUAL_STATIC_GRAY;
129 
130   return visual;
131 }
132 
133 void
_gdk_visual_init(void)134 _gdk_visual_init (void)
135 {
136   system_visual = create_standard_visual (24);
137   rgba_visual = create_standard_visual (32);
138   gray_visual = create_gray_visual ();
139 }
140 
141 /* We prefer the system visual for now ... */
142 gint
gdk_visual_get_best_depth(void)143 gdk_visual_get_best_depth (void)
144 {
145   return system_visual->depth;
146 }
147 
148 GdkVisualType
gdk_visual_get_best_type(void)149 gdk_visual_get_best_type (void)
150 {
151   return system_visual->type;
152 }
153 
154 GdkVisual *
gdk_screen_get_rgba_visual(GdkScreen * screen)155 gdk_screen_get_rgba_visual (GdkScreen *screen)
156 {
157   g_return_val_if_fail (GDK_IS_SCREEN (screen), NULL);
158 
159   return rgba_visual;
160 }
161 
162 GdkVisual*
gdk_screen_get_system_visual(GdkScreen * screen)163 gdk_screen_get_system_visual (GdkScreen *screen)
164 {
165   return system_visual;
166 }
167 
168 GdkVisual*
gdk_visual_get_best(void)169 gdk_visual_get_best (void)
170 {
171   return system_visual;
172 }
173 
174 GdkVisual*
gdk_visual_get_best_with_depth(gint depth)175 gdk_visual_get_best_with_depth (gint depth)
176 {
177   GdkVisual *visual = NULL;
178 
179   switch (depth)
180     {
181       case 32:
182         visual = rgba_visual;
183         break;
184 
185       case 24:
186         visual = system_visual;
187         break;
188 
189       case 1:
190         visual = gray_visual;
191         break;
192 
193       default:
194         visual = NULL;
195     }
196 
197   return visual;
198 }
199 
200 GdkVisual*
gdk_visual_get_best_with_type(GdkVisualType visual_type)201 gdk_visual_get_best_with_type (GdkVisualType visual_type)
202 {
203   if (system_visual->type == visual_type)
204     return system_visual;
205   else if (gray_visual->type == visual_type)
206     return gray_visual;
207 
208   return NULL;
209 }
210 
211 GdkVisual*
gdk_visual_get_best_with_both(gint depth,GdkVisualType visual_type)212 gdk_visual_get_best_with_both (gint          depth,
213 			       GdkVisualType visual_type)
214 {
215   if (system_visual->depth == depth
216       && system_visual->type == visual_type)
217     return system_visual;
218   else if (rgba_visual->depth == depth
219            && rgba_visual->type == visual_type)
220     return rgba_visual;
221   else if (gray_visual->depth == depth
222            && gray_visual->type == visual_type)
223     return gray_visual;
224 
225   return NULL;
226 }
227 
228 /* For these, we also prefer the system visual */
229 void
gdk_query_depths(gint ** depths,gint * count)230 gdk_query_depths  (gint **depths,
231 		   gint  *count)
232 {
233   *count = 1;
234   *depths = &system_visual->depth;
235 }
236 
237 void
gdk_query_visual_types(GdkVisualType ** visual_types,gint * count)238 gdk_query_visual_types (GdkVisualType **visual_types,
239 			gint           *count)
240 {
241   *count = 1;
242   *visual_types = &system_visual->type;
243 }
244 
245 GList*
gdk_screen_list_visuals(GdkScreen * screen)246 gdk_screen_list_visuals (GdkScreen *screen)
247 {
248   GList *visuals = NULL;
249 
250   visuals = g_list_append (visuals, system_visual);
251   visuals = g_list_append (visuals, rgba_visual);
252   visuals = g_list_append (visuals, gray_visual);
253 
254   return visuals;
255 }
256 
257 GdkScreen *
gdk_visual_get_screen(GdkVisual * visual)258 gdk_visual_get_screen (GdkVisual *visual)
259 {
260   g_return_val_if_fail (GDK_IS_VISUAL (visual), NULL);
261 
262   return gdk_screen_get_default ();
263 }
264 
265