[gtk+] Setup monitor rects during screen initialization and re-use data
- From: Kristian Rietveld <kristian src gnome org>
- To: svn-commits-list gnome org
- Cc:
- Subject: [gtk+] Setup monitor rects during screen initialization and re-use data
- Date: Mon, 26 Oct 2009 09:04:43 +0000 (UTC)
commit ce3c861c2a756b62c9c99dd704bd7ab5be732a2e
Author: Kristian Rietveld <kris gtk org>
Date: Mon Oct 12 09:55:45 2009 +0200
Setup monitor rects during screen initialization and re-use data
gdk/quartz/gdkscreen-quartz.c | 144 +++++++++++++++++++++++------------------
1 files changed, 80 insertions(+), 64 deletions(-)
---
diff --git a/gdk/quartz/gdkscreen-quartz.c b/gdk/quartz/gdkscreen-quartz.c
index 6d61975..741e35f 100644
--- a/gdk/quartz/gdkscreen-quartz.c
+++ b/gdk/quartz/gdkscreen-quartz.c
@@ -21,14 +21,74 @@
#include "config.h"
#include "gdk.h"
#include "gdkprivate-quartz.h"
-
+
+/* FIXME: If we want to do it properly, this should be stored
+ * in a proper GdkScreen subclass.
+ */
static GdkColormap *default_colormap = NULL;
+static int n_screens = 0;
+static GdkRectangle *screen_rects = NULL;
+
+
+static void
+screen_rects_init (void)
+{
+ NSArray *array;
+ NSRect largest_rect;
+ int i;
+
+ GDK_QUARTZ_ALLOC_POOL;
+
+ array = [NSScreen screens];
+
+ n_screens = [array count];
+ screen_rects = g_new0 (GdkRectangle, n_screens);
+
+ /* FIXME: as stated above the get_width() and get_height() functions
+ * in this file, we only support horizontal screen layouts for now.
+ */
+
+ /* Find the monitor with the largest height. All monitors should be
+ * offset to this one in the GDK screen space instead of offset to
+ * the screen with the menu bar.
+ */
+ largest_rect = [[array objectAtIndex:0] frame];
+ for (i = 1; i < [array count]; i++)
+ {
+ NSRect rect = [[array objectAtIndex:i] frame];
+
+ if (rect.size.height > largest_rect.size.height)
+ largest_rect = [[array objectAtIndex:i] frame];
+ }
+
+ for (i = 0; i < n_screens; i++)
+ {
+ NSScreen *nsscreen;
+ NSRect rect;
+
+ nsscreen = [array objectAtIndex:i];
+ rect = [nsscreen frame];
+
+ screen_rects[i].x = rect.origin.x;
+ screen_rects[i].width = rect.size.width;
+ screen_rects[i].height = rect.size.height;
+
+ if (largest_rect.size.height - rect.size.height == 0)
+ screen_rects[i].y = 0;
+ else
+ screen_rects[i].y = largest_rect.size.height - rect.size.height + largest_rect.origin.y;
+ }
+
+ GDK_QUARTZ_RELEASE_POOL;
+}
void
_gdk_quartz_screen_init (void)
{
gdk_screen_set_default_colormap (_gdk_screen,
gdk_screen_get_system_colormap (_gdk_screen));
+
+ screen_rects_init ();
}
GdkDisplay *
@@ -214,93 +274,49 @@ gdk_screen_get_height_mm (GdkScreen *screen)
int
gdk_screen_get_n_monitors (GdkScreen *screen)
{
- int n;
-
- GDK_QUARTZ_ALLOC_POOL;
- NSArray *array = [NSScreen screens];
-
- n = [array count];
-
- GDK_QUARTZ_RELEASE_POOL;
+ g_return_val_if_fail (GDK_IS_SCREEN (screen), 0);
- return n;
+ return n_screens;
}
-static void
-screen_get_monitor_geometry (GdkScreen *screen,
- gint monitor_num,
- GdkRectangle *dest,
- gboolean in_mm)
+static NSScreen *
+get_nsscreen_for_monitor (gint monitor_num)
{
NSArray *array;
- NSScreen *nsscreen;
- NSRect rect;
- NSRect largest_rect;
- int i;
+ NSScreen *screen;
GDK_QUARTZ_ALLOC_POOL;
array = [NSScreen screens];
- nsscreen = [array objectAtIndex:monitor_num];
- rect = [nsscreen frame];
-
- dest->x = rect.origin.x;
- dest->width = rect.size.width;
- dest->height = rect.size.height;
-
- /* FIXME: as stated above the get_width() and get_height() functions
- * in this file, we only support horizontal screen layouts for now.
- */
-
- /* Find the monitor with the largest height. All monitors should be
- * offset to this one in the GDK screen space instead of offset to
- * the screen with the menu bar.
- */
- largest_rect = [[array objectAtIndex:0] frame];
- for (i = 1; i < [array count]; i++)
- {
- NSRect rect = [[array objectAtIndex:i] frame];
-
- if (rect.size.height > largest_rect.size.height)
- largest_rect = [[array objectAtIndex:i] frame];
- }
-
- if (largest_rect.size.height - rect.size.height == 0)
- dest->y = 0;
- else
- dest->y = largest_rect.size.height - rect.size.height + largest_rect.origin.y;
-
- if (in_mm)
- {
- dest->x = get_mm_from_pixels (nsscreen, dest->x);
- dest->y = get_mm_from_pixels (nsscreen, dest->y);
- dest->width = get_mm_from_pixels (nsscreen, dest->width);
- dest->height = get_mm_from_pixels (nsscreen, dest->height);
- }
+ screen = [array objectAtIndex:monitor_num];
GDK_QUARTZ_RELEASE_POOL;
+
+ return screen;
}
gint
gdk_screen_get_monitor_width_mm (GdkScreen *screen,
gint monitor_num)
{
- GdkRectangle rect;
-
- screen_get_monitor_geometry (screen, monitor_num, &rect, TRUE);
+ g_return_val_if_fail (GDK_IS_SCREEN (screen), 0);
+ g_return_val_if_fail (monitor_num < gdk_screen_get_n_monitors (screen), 0);
+ g_return_val_if_fail (monitor_num >= 0, 0);
- return rect.width;
+ return get_mm_from_pixels (get_nsscreen_for_monitor (monitor_num),
+ screen_rects[monitor_num].width);
}
gint
gdk_screen_get_monitor_height_mm (GdkScreen *screen,
gint monitor_num)
{
- GdkRectangle rect;
-
- screen_get_monitor_geometry (screen, monitor_num, &rect, TRUE);
+ g_return_val_if_fail (GDK_IS_SCREEN (screen), 0);
+ g_return_val_if_fail (monitor_num < gdk_screen_get_n_monitors (screen), 0);
+ g_return_val_if_fail (monitor_num >= 0, 0);
- return rect.height;
+ return get_mm_from_pixels (get_nsscreen_for_monitor (monitor_num),
+ screen_rects[monitor_num].height);
}
gchar *
@@ -320,7 +336,7 @@ gdk_screen_get_monitor_geometry (GdkScreen *screen,
g_return_if_fail (monitor_num < gdk_screen_get_n_monitors (screen));
g_return_if_fail (monitor_num >= 0);
- screen_get_monitor_geometry (screen, monitor_num, dest, FALSE);
+ *dest = screen_rects[monitor_num];
}
gchar *
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]