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