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, see <http://www.gnu.org/licenses/>.
17 */
18
19 #include "config.h"
20
21 #include "gdkvisualprivate.h"
22 #include "gdkquartzvisual.h"
23 #include "gdkprivate-quartz.h"
24
25
26 struct _GdkQuartzVisual
27 {
28 GdkVisual visual;
29 };
30
31 struct _GdkQuartzVisualClass
32 {
33 GdkVisualClass visual_class;
34 };
35
36
37 static GdkVisual *system_visual;
38 static GdkVisual *rgba_visual;
39 static GdkVisual *gray_visual;
40
41 static GdkVisual *
create_standard_visual(GdkScreen * screen,gint depth)42 create_standard_visual (GdkScreen *screen,
43 gint depth)
44 {
45 GdkVisual *visual = g_object_new (GDK_TYPE_QUARTZ_VISUAL, NULL);
46
47 visual->screen = screen;
48
49 visual->depth = depth;
50 visual->byte_order = GDK_MSB_FIRST; /* FIXME: Should this be different on intel macs? */
51 visual->colormap_size = 0;
52
53 visual->type = GDK_VISUAL_TRUE_COLOR;
54
55 visual->red_mask = 0xff0000;
56 visual->green_mask = 0xff00;
57 visual->blue_mask = 0xff;
58
59 return visual;
60 }
61
62 static GdkVisual *
create_gray_visual(GdkScreen * screen)63 create_gray_visual (GdkScreen *screen)
64 {
65 GdkVisual *visual = g_object_new (GDK_TYPE_QUARTZ_VISUAL, NULL);
66
67 visual->screen = screen;
68
69 visual->depth = 1;
70 visual->byte_order = GDK_MSB_FIRST;
71 visual->colormap_size = 0;
72
73 visual->type = GDK_VISUAL_STATIC_GRAY;
74
75 return visual;
76 }
77
78
G_DEFINE_TYPE(GdkQuartzVisual,gdk_quartz_visual,GDK_TYPE_VISUAL)79 G_DEFINE_TYPE (GdkQuartzVisual, gdk_quartz_visual, GDK_TYPE_VISUAL)
80
81 static void
82 gdk_quartz_visual_init (GdkQuartzVisual *quartz_visual)
83 {
84 }
85
86 static void
gdk_quartz_visual_class_init(GdkQuartzVisualClass * class)87 gdk_quartz_visual_class_init (GdkQuartzVisualClass *class)
88 {
89 }
90
91 /* We prefer the system visual for now ... */
92 gint
_gdk_quartz_screen_visual_get_best_depth(GdkScreen * screen)93 _gdk_quartz_screen_visual_get_best_depth (GdkScreen *screen)
94 {
95 return system_visual->depth;
96 }
97
98 GdkVisualType
_gdk_quartz_screen_visual_get_best_type(GdkScreen * screen)99 _gdk_quartz_screen_visual_get_best_type (GdkScreen *screen)
100 {
101 return system_visual->type;
102 }
103
104 GdkVisual *
_gdk_quartz_screen_get_rgba_visual(GdkScreen * screen)105 _gdk_quartz_screen_get_rgba_visual (GdkScreen *screen)
106 {
107 return rgba_visual;
108 }
109
110 GdkVisual*
_gdk_quartz_screen_get_system_visual(GdkScreen * screen)111 _gdk_quartz_screen_get_system_visual (GdkScreen *screen)
112 {
113 return system_visual;
114 }
115
116 GdkVisual*
_gdk_quartz_screen_visual_get_best(GdkScreen * screen)117 _gdk_quartz_screen_visual_get_best (GdkScreen *screen)
118 {
119 return system_visual;
120 }
121
122 GdkVisual*
_gdk_quartz_screen_visual_get_best_with_depth(GdkScreen * screen,gint depth)123 _gdk_quartz_screen_visual_get_best_with_depth (GdkScreen *screen,
124 gint depth)
125 {
126 GdkVisual *visual = NULL;
127
128 switch (depth)
129 {
130 case 32:
131 visual = rgba_visual;
132 break;
133
134 case 24:
135 visual = system_visual;
136 break;
137
138 case 1:
139 visual = gray_visual;
140 break;
141
142 default:
143 visual = NULL;
144 }
145
146 return visual;
147 }
148
149 GdkVisual*
_gdk_quartz_screen_visual_get_best_with_type(GdkScreen * screen,GdkVisualType visual_type)150 _gdk_quartz_screen_visual_get_best_with_type (GdkScreen *screen,
151 GdkVisualType visual_type)
152 {
153 if (system_visual->type == visual_type)
154 return system_visual;
155 else if (gray_visual->type == visual_type)
156 return gray_visual;
157
158 return NULL;
159 }
160
161 GdkVisual*
_gdk_quartz_screen_visual_get_best_with_both(GdkScreen * screen,gint depth,GdkVisualType visual_type)162 _gdk_quartz_screen_visual_get_best_with_both (GdkScreen *screen,
163 gint depth,
164 GdkVisualType visual_type)
165 {
166 if (system_visual->depth == depth
167 && system_visual->type == visual_type)
168 return system_visual;
169 else if (rgba_visual->depth == depth
170 && rgba_visual->type == visual_type)
171 return rgba_visual;
172 else if (gray_visual->depth == depth
173 && gray_visual->type == visual_type)
174 return gray_visual;
175
176 return NULL;
177 }
178
179 /* For these, we also prefer the system visual */
180 void
_gdk_quartz_screen_query_depths(GdkScreen * screen,gint ** depths,gint * count)181 _gdk_quartz_screen_query_depths (GdkScreen *screen,
182 gint **depths,
183 gint *count)
184 {
185 *count = 1;
186 *depths = &system_visual->depth;
187 }
188
189 void
_gdk_quartz_screen_query_visual_types(GdkScreen * screen,GdkVisualType ** visual_types,gint * count)190 _gdk_quartz_screen_query_visual_types (GdkScreen *screen,
191 GdkVisualType **visual_types,
192 gint *count)
193 {
194 *count = 1;
195 *visual_types = &system_visual->type;
196 }
197
198 void
_gdk_quartz_screen_init_visuals(GdkScreen * screen)199 _gdk_quartz_screen_init_visuals (GdkScreen *screen)
200 {
201 system_visual = create_standard_visual (screen, 24);
202 rgba_visual = create_standard_visual (screen, 32);
203 gray_visual = create_gray_visual (screen);
204 }
205
206 GList*
_gdk_quartz_screen_list_visuals(GdkScreen * screen)207 _gdk_quartz_screen_list_visuals (GdkScreen *screen)
208 {
209 GList *visuals = NULL;
210
211 visuals = g_list_append (visuals, system_visual);
212 visuals = g_list_append (visuals, rgba_visual);
213 visuals = g_list_append (visuals, gray_visual);
214
215 return visuals;
216 }
217