[gtk+] Setup monitor rects during screen initialization and re-use data



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]