Setup monitor rects during screen initialization and re-use data
This commit is contained in:
@ -22,13 +22,73 @@
|
|||||||
#include "gdk.h"
|
#include "gdk.h"
|
||||||
#include "gdkprivate-quartz.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 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
|
void
|
||||||
_gdk_quartz_screen_init (void)
|
_gdk_quartz_screen_init (void)
|
||||||
{
|
{
|
||||||
gdk_screen_set_default_colormap (_gdk_screen,
|
gdk_screen_set_default_colormap (_gdk_screen,
|
||||||
gdk_screen_get_system_colormap (_gdk_screen));
|
gdk_screen_get_system_colormap (_gdk_screen));
|
||||||
|
|
||||||
|
screen_rects_init ();
|
||||||
}
|
}
|
||||||
|
|
||||||
GdkDisplay *
|
GdkDisplay *
|
||||||
@ -214,93 +274,49 @@ gdk_screen_get_height_mm (GdkScreen *screen)
|
|||||||
int
|
int
|
||||||
gdk_screen_get_n_monitors (GdkScreen *screen)
|
gdk_screen_get_n_monitors (GdkScreen *screen)
|
||||||
{
|
{
|
||||||
int n;
|
g_return_val_if_fail (GDK_IS_SCREEN (screen), 0);
|
||||||
|
|
||||||
GDK_QUARTZ_ALLOC_POOL;
|
return n_screens;
|
||||||
NSArray *array = [NSScreen screens];
|
|
||||||
|
|
||||||
n = [array count];
|
|
||||||
|
|
||||||
GDK_QUARTZ_RELEASE_POOL;
|
|
||||||
|
|
||||||
return n;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static NSScreen *
|
||||||
screen_get_monitor_geometry (GdkScreen *screen,
|
get_nsscreen_for_monitor (gint monitor_num)
|
||||||
gint monitor_num,
|
|
||||||
GdkRectangle *dest,
|
|
||||||
gboolean in_mm)
|
|
||||||
{
|
{
|
||||||
NSArray *array;
|
NSArray *array;
|
||||||
NSScreen *nsscreen;
|
NSScreen *screen;
|
||||||
NSRect rect;
|
|
||||||
NSRect largest_rect;
|
|
||||||
int i;
|
|
||||||
|
|
||||||
GDK_QUARTZ_ALLOC_POOL;
|
GDK_QUARTZ_ALLOC_POOL;
|
||||||
|
|
||||||
array = [NSScreen screens];
|
array = [NSScreen screens];
|
||||||
nsscreen = [array objectAtIndex:monitor_num];
|
screen = [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);
|
|
||||||
}
|
|
||||||
|
|
||||||
GDK_QUARTZ_RELEASE_POOL;
|
GDK_QUARTZ_RELEASE_POOL;
|
||||||
|
|
||||||
|
return screen;
|
||||||
}
|
}
|
||||||
|
|
||||||
gint
|
gint
|
||||||
gdk_screen_get_monitor_width_mm (GdkScreen *screen,
|
gdk_screen_get_monitor_width_mm (GdkScreen *screen,
|
||||||
gint monitor_num)
|
gint monitor_num)
|
||||||
{
|
{
|
||||||
GdkRectangle rect;
|
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);
|
||||||
|
|
||||||
screen_get_monitor_geometry (screen, monitor_num, &rect, TRUE);
|
return get_mm_from_pixels (get_nsscreen_for_monitor (monitor_num),
|
||||||
|
screen_rects[monitor_num].width);
|
||||||
return rect.width;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
gint
|
gint
|
||||||
gdk_screen_get_monitor_height_mm (GdkScreen *screen,
|
gdk_screen_get_monitor_height_mm (GdkScreen *screen,
|
||||||
gint monitor_num)
|
gint monitor_num)
|
||||||
{
|
{
|
||||||
GdkRectangle rect;
|
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);
|
||||||
|
|
||||||
screen_get_monitor_geometry (screen, monitor_num, &rect, TRUE);
|
return get_mm_from_pixels (get_nsscreen_for_monitor (monitor_num),
|
||||||
|
screen_rects[monitor_num].height);
|
||||||
return rect.height;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
gchar *
|
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 < gdk_screen_get_n_monitors (screen));
|
||||||
g_return_if_fail (monitor_num >= 0);
|
g_return_if_fail (monitor_num >= 0);
|
||||||
|
|
||||||
screen_get_monitor_geometry (screen, monitor_num, dest, FALSE);
|
*dest = screen_rects[monitor_num];
|
||||||
}
|
}
|
||||||
|
|
||||||
gchar *
|
gchar *
|
||||||
|
Reference in New Issue
Block a user