]> Pileus Git - ~andy/gtk/blob - gdk/quartz/gdkscreen-quartz.c
Import AppKit.h instead of Quartz.h. Don't use userSpaceScaleFactor for
[~andy/gtk] / gdk / quartz / gdkscreen-quartz.c
1 /* gdkscreen-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 #include "gdk.h"
23 #include "gdkprivate-quartz.h"
24
25 static GdkColormap *default_colormap = NULL;
26
27 GdkDisplay *
28 gdk_screen_get_display (GdkScreen *screen)
29 {
30   g_return_val_if_fail (GDK_IS_SCREEN (screen), NULL);
31
32   return _gdk_display;
33 }
34
35
36 GdkWindow *
37 gdk_screen_get_root_window (GdkScreen *screen)
38 {
39   g_return_val_if_fail (GDK_IS_SCREEN (screen), NULL);
40
41   return _gdk_root;
42 }
43
44 gint
45 gdk_screen_get_number (GdkScreen *screen)
46 {
47   g_return_val_if_fail (GDK_IS_SCREEN (screen), 0);
48
49   return 0;
50 }
51
52 gchar * 
53 _gdk_windowing_substitute_screen_number (const gchar *display_name,
54                                          int          screen_number)
55 {
56   if (screen_number != 0)
57     return NULL;
58
59   return g_strdup (display_name);
60 }
61
62 GdkColormap*
63 gdk_screen_get_default_colormap (GdkScreen *screen)
64 {
65   return default_colormap;
66 }
67
68 void
69 gdk_screen_set_default_colormap (GdkScreen   *screen,
70                                  GdkColormap *colormap)
71 {
72   GdkColormap *old_colormap;
73   
74   g_return_if_fail (GDK_IS_SCREEN (screen));
75   g_return_if_fail (GDK_IS_COLORMAP (colormap));
76
77   old_colormap = default_colormap;
78
79   default_colormap = g_object_ref (colormap);
80   
81   if (old_colormap)
82     g_object_unref (old_colormap);
83 }
84
85 gint
86 gdk_screen_get_width (GdkScreen *screen)
87 {
88   int i;
89   int width;
90   NSArray *array;
91   NSAutoreleasePool *pool;
92
93   g_return_val_if_fail (GDK_IS_SCREEN (screen), 0);
94
95   pool = [[NSAutoreleasePool alloc] init];
96   array = [NSScreen screens];
97
98   width = 0;
99   for (i = 0; i < [array count]; i++) 
100     {
101       NSRect rect = [[array objectAtIndex:i] frame];
102       width += rect.size.width;
103     }
104
105   [pool release];
106
107   return width;
108 }
109
110 gint
111 gdk_screen_get_height (GdkScreen *screen)
112 {
113   int i;
114   int height;
115   NSArray *array;
116   NSAutoreleasePool *pool;
117
118   g_return_val_if_fail (GDK_IS_SCREEN (screen), 0);
119
120   pool = [[NSAutoreleasePool alloc] init];
121   array = [NSScreen screens];
122
123   height = 0;
124   for (i = 0; i < [array count]; i++) 
125     {
126       NSRect rect = [[array objectAtIndex:i] frame];
127       height = MAX (height, rect.size.height);
128     }
129
130   [pool release];
131
132   return height;
133 }
134
135 static gint
136 get_mm_from_pixels (NSScreen *screen, int pixels)
137 {
138   /* userSpaceScaleFactor is in "pixels per point", 
139    * 72 is the number of points per inch, 
140    * and 25.4 is the number of millimeters per inch.
141    */
142 #if MAC_OS_X_VERSION_MAX_ALLOWED > MAC_OS_X_VERSION_10_3
143   float dpi = [screen userSpaceScaleFactor] * 72.0;
144 #else
145   float dpi = 96.0 / 72.0;
146 #endif
147
148   return (pixels / dpi) * 25.4;
149 }
150
151 gint
152 gdk_screen_get_width_mm (GdkScreen *screen)
153 {
154   int i;
155   gint width;
156   NSArray *array;
157   NSAutoreleasePool *pool;
158
159   g_return_val_if_fail (GDK_IS_SCREEN (screen), 0);
160
161   pool = [[NSAutoreleasePool alloc] init];
162   array = [NSScreen screens];
163
164   width = 0;
165   for (i = 0; i < [array count]; i++)
166     {
167       NSScreen *screen = [array objectAtIndex:i];
168       NSRect rect = [screen frame];
169       width += get_mm_from_pixels (screen, rect.size.width);
170     }
171
172   [pool release];
173
174   return width;
175 }
176
177 gint
178 gdk_screen_get_height_mm (GdkScreen *screen)
179 {
180   int i;
181   gint height;
182   NSArray *array;
183   NSAutoreleasePool *pool;
184
185   g_return_val_if_fail (GDK_IS_SCREEN (screen), 0);
186
187   pool = [[NSAutoreleasePool alloc] init];
188   array = [NSScreen screens];
189
190   height = 0;
191   for (i = 0; i < [array count]; i++)
192     {
193       NSScreen *screen = [array objectAtIndex:i];
194       NSRect rect = [screen frame];
195       gint h = get_mm_from_pixels (screen, rect.size.height);
196       height = MAX (height, h);
197     }
198
199   [pool release];
200
201   return height;
202 }
203
204 int
205 gdk_screen_get_n_monitors (GdkScreen *screen)
206 {
207   int n;
208   GDK_QUARTZ_ALLOC_POOL;
209   NSArray *array = [NSScreen screens];
210
211   n = [array count];
212
213   GDK_QUARTZ_RELEASE_POOL;
214
215   return n;
216 }
217
218 void
219 gdk_screen_get_monitor_geometry (GdkScreen    *screen, 
220                                  gint          monitor_num,
221                                  GdkRectangle *dest)
222 {
223   NSArray *array;
224   NSRect rect;
225   NSAutoreleasePool *pool;
226
227   g_return_if_fail (GDK_IS_SCREEN (screen));
228   g_return_if_fail (monitor_num < gdk_screen_get_n_monitors (screen));
229   g_return_if_fail (monitor_num >= 0);
230
231   pool = [[NSAutoreleasePool alloc] init];
232   array = [NSScreen screens];
233   rect = [[array objectAtIndex:monitor_num] frame];
234   
235   dest->x = rect.origin.x;
236   dest->y = rect.origin.y;
237   dest->width = rect.size.width;
238   dest->height = rect.size.height;
239
240   [pool release];
241 }
242
243 gchar *
244 gdk_screen_make_display_name (GdkScreen *screen)
245 {
246   return g_strdup (gdk_display_get_name (_gdk_display));
247 }
248
249 GdkWindow *
250 gdk_screen_get_active_window (GdkScreen *screen)
251 {
252   g_return_val_if_fail (GDK_IS_SCREEN (screen), NULL);
253
254   return NULL;
255 }
256
257 GList *
258 gdk_screen_get_window_stack (GdkScreen *screen)
259 {
260   g_return_val_if_fail (GDK_IS_SCREEN (screen), NULL);
261
262   return NULL;
263 }
264
265 gboolean
266 gdk_screen_is_composited (GdkScreen *screen)
267 {
268   g_return_val_if_fail (GDK_IS_SCREEN (screen), FALSE);
269
270   return TRUE;
271 }