1 From 13bba88188cc3880d4eba9a93f9109154308d51a Mon Sep 17 00:00:00 2001
2 From: Michael Natterer <mitch@gimp.org>
3 Date: Fri, 18 Jan 2013 15:47:29 +0100
4 Subject: [PATCH 54/68] quartz: add gdk_screen_ and
5 gdk_window_get_scale_factor()
7 which return 1.0 normally and 2.0 on retina displays.
10 gdk/gdkwindow.c | 24 ++++++++++++++++++++++++
12 gdk/gdkwindowimpl.h | 3 +++
13 gdk/quartz/gdkscreen-quartz.c | 33 +++++++++++++++++++++++++++++++++
14 gdk/quartz/gdkwindow-quartz.c | 22 ++++++++++++++++++++++
15 gdk/x11/gdkscreen-x11.c | 7 +++++++
16 7 files changed, 92 insertions(+)
18 diff --git a/gdk/gdkscreen.h b/gdk/gdkscreen.h
19 index d3d4fe9..0c1e895 100644
22 @@ -109,6 +109,8 @@ gint gdk_screen_get_monitor_height_mm (GdkScreen *screen,
24 gchar * gdk_screen_get_monitor_plug_name (GdkScreen *screen,
26 +gdouble gdk_screen_get_monitor_scale_factor (GdkScreen *screen,
29 void gdk_screen_broadcast_client_message (GdkScreen *screen,
31 diff --git a/gdk/gdkwindow.c b/gdk/gdkwindow.c
32 index 3040321..29b96e2 100644
35 @@ -11475,6 +11475,30 @@ gdk_window_get_height (GdkWindow *window)
40 +gdk_window_get_scale_factor (GdkWindow *window)
42 + GdkWindowObject *private;
43 + GdkWindowImplIface *impl_iface;
45 + g_return_val_if_fail (GDK_IS_WINDOW (window), 1.0);
47 + private = (GdkWindowObject *) window;
48 + if (private->destroyed)
51 + window = gdk_window_get_toplevel (window);
53 + if (gdk_window_has_impl (private))
55 + impl_iface = GDK_WINDOW_IMPL_GET_IFACE (private->impl);
57 + if (impl_iface->get_scale_factor)
58 + return impl_iface->get_scale_factor (window);
64 #define __GDK_WINDOW_C__
65 #include "gdkaliasdef.c"
66 diff --git a/gdk/gdkwindow.h b/gdk/gdkwindow.h
67 index 572797b..95a3665 100644
70 @@ -341,6 +341,7 @@ GdkDisplay* gdk_window_get_display (GdkWindow *window);
71 GdkVisual* gdk_window_get_visual (GdkWindow *window);
72 int gdk_window_get_width (GdkWindow *window);
73 int gdk_window_get_height (GdkWindow *window);
74 +gdouble gdk_window_get_scale_factor (GdkWindow *window);
76 GdkWindow* gdk_window_at_pointer (gint *win_x,
78 diff --git a/gdk/gdkwindowimpl.h b/gdk/gdkwindowimpl.h
79 index 3a5029b..d6a0c89 100644
80 --- a/gdk/gdkwindowimpl.h
81 +++ b/gdk/gdkwindowimpl.h
82 @@ -146,6 +146,9 @@ struct _GdkWindowImplIface
83 void (* input_window_destroy) (GdkWindow *window);
84 void (* input_window_crossing)(GdkWindow *window,
87 + gdouble (* get_scale_factor) (GdkWindow *window);
89 gboolean supports_native_bg;
92 diff --git a/gdk/quartz/gdkscreen-quartz.c b/gdk/quartz/gdkscreen-quartz.c
93 index 4bb573b..e6f0c44 100644
94 --- a/gdk/quartz/gdkscreen-quartz.c
95 +++ b/gdk/quartz/gdkscreen-quartz.c
96 @@ -494,6 +494,39 @@ gdk_screen_get_monitor_workarea (GdkScreen *screen,
97 GDK_QUARTZ_RELEASE_POOL;
100 +/* Protocol to build cleanly for OSX < 10.7 */
101 +@protocol ScaleFactor
102 +- (CGFloat) backingScaleFactor;
106 +gdk_screen_get_monitor_scale_factor (GdkScreen *screen,
109 + GdkScreenQuartz *quartz_screen;
111 + NSScreen *nsscreen;
112 + gdouble scale_factor = 1.0;
114 + g_return_val_if_fail (GDK_IS_SCREEN (screen), 1.0);
115 + g_return_val_if_fail (monitor_num < gdk_screen_get_n_monitors (screen), 1.0);
116 + g_return_val_if_fail (monitor_num >= 0, 1.0);
118 + quartz_screen = GDK_SCREEN_QUARTZ (screen);
120 + GDK_QUARTZ_ALLOC_POOL;
122 + array = [NSScreen screens];
123 + nsscreen = [array objectAtIndex:monitor_num];
125 + if (gdk_quartz_osx_version() >= GDK_OSX_LION)
126 + scale_factor = [(id <ScaleFactor>) nsscreen backingScaleFactor];
128 + GDK_QUARTZ_RELEASE_POOL;
130 + return scale_factor;
134 gdk_screen_make_display_name (GdkScreen *screen)
136 diff --git a/gdk/quartz/gdkwindow-quartz.c b/gdk/quartz/gdkwindow-quartz.c
137 index 500776d..5b9ceef 100644
138 --- a/gdk/quartz/gdkwindow-quartz.c
139 +++ b/gdk/quartz/gdkwindow-quartz.c
140 @@ -3201,6 +3201,27 @@ _gdk_windowing_window_get_input_shape (GdkWindow *window)
144 +/* Protocol to build cleanly for OSX < 10.7 */
145 +@protocol ScaleFactor
146 +- (CGFloat) backingScaleFactor;
150 +gdk_window_quartz_get_scale_factor (GdkWindow *window)
152 + GdkWindowImplQuartz *impl;
154 + if (GDK_WINDOW_DESTROYED (window))
157 + impl = GDK_WINDOW_IMPL_QUARTZ (GDK_WINDOW_OBJECT (window)->impl);
159 + if (gdk_quartz_osx_version() >= GDK_OSX_LION)
160 + return [(id <ScaleFactor>) impl->toplevel backingScaleFactor];
166 gdk_window_impl_iface_init (GdkWindowImplIface *iface)
168 @@ -3229,4 +3250,5 @@ gdk_window_impl_iface_init (GdkWindowImplIface *iface)
169 iface->destroy = _gdk_quartz_window_destroy;
170 iface->input_window_destroy = _gdk_input_window_destroy;
171 iface->input_window_crossing = _gdk_input_window_crossing;
172 + iface->get_scale_factor = gdk_window_quartz_get_scale_factor;
174 diff --git a/gdk/x11/gdkscreen-x11.c b/gdk/x11/gdkscreen-x11.c
175 index 66a0d96..d09d0b6 100644
176 --- a/gdk/x11/gdkscreen-x11.c
177 +++ b/gdk/x11/gdkscreen-x11.c
178 @@ -454,6 +454,13 @@ gdk_screen_get_monitor_plug_name (GdkScreen *screen,
179 return g_strdup (screen_x11->monitors[monitor_num].output_name);
183 +gdk_screen_get_monitor_scale_factor (GdkScreen *screen,
190 * gdk_x11_screen_get_monitor_output:
191 * @screen: a #GdkScreen
193 1.7.10.2 (Apple Git-33)