/* Copyright (C) 2007-2008 The Android Open Source Project ** ** This software is licensed under the terms of the GNU General Public ** License version 2, as published by the Free Software Foundation, and ** may be copied, distributed, and modified under those terms. ** ** This program is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** GNU General Public License for more details. */ /* this is the Quartz-specific implementation of * */ #include "android/utils/display.h" #include "android/utils/debug.h" #define D(...) VERBOSE_PRINT(init,__VA_ARGS__) #include #include #include #include int get_monitor_resolution( int *px_dpi, int *py_dpi ) { fprintf(stderr, "emulator: FIXME: implement get_monitor_resolution on OS X\n" ); return -1; } int get_nearest_monitor_rect( int *x, int *y, int *width, int *height ) { SDL_SysWMinfo info; NSWindow* window; SDL_VERSION(&info.version); if ( SDL_GetWMInfo(&info) < 0 ) { D( "%s: SDL_GetWMInfo() failed: %s", __FUNCTION__, SDL_GetError()); return -1; } window = info.nsWindowPtr; if (window == NULL) { D( "%s: SDL_GetWMInfo() returned NULL NSWindow ptr", __FUNCTION__ ); return -1; } else { NSRect frame = [ window frame ]; int fx1 = frame.origin.x; int fy1 = frame.origin.y; int fx2 = frame.size.width + fx1; int fy2 = frame.size.height + fy1; NSArray* screens = [ NSScreen screens ]; unsigned int count = [ screens count ]; int bestScreen = -1; int bestArea = 0; unsigned int n; printf( "window frame (%d,%d) (%d,%d)\n", fx1, fy1, fx2, fy2 ); /* we need to compute which screen has the most window pixels */ for (n = 0; n < count; n++) { NSScreen* screen = [ screens objectAtIndex: n ]; NSRect vis = [ screen visibleFrame ]; int vx1 = vis.origin.x; int vy1 = vis.origin.y; int vx2 = vis.size.width + vx1; int vy2 = vis.size.height + vy1; int cx1, cx2, cy1, cy2, cArea; //printf( "screen %d/%d frame (%d,%d) (%d,%d)\n", n+1, count, // vx1, vy1, vx2, vy2 ); if (fx1 >= vx2 || vx1 >= fx2 || fy1 >= vy2 || vy1 >= fy2) continue; cx1 = (fx1 < vx1) ? vx1 : fx1; cx2 = (fx2 > vx2) ? vx2 : fx2; cy1 = (fy1 < vy1) ? vy1 : fy1; cy2 = (fy2 > vy2) ? vy2 : fy2; if (cx1 >= cx2 || cy1 >= cy2) continue; cArea = (cx2-cx1)*(cy2-cy1); if (bestScreen < 0 || cArea > bestArea) { bestScreen = n; bestArea = cArea; } } if (bestScreen < 0) bestScreen = 0; { NSScreen* screen = [ screens objectAtIndex: bestScreen ]; NSRect vis = [ screen visibleFrame ]; *x = vis.origin.x; *y = vis.origin.y; *width = vis.size.width; *height = vis.size.height; } return 0; } };