Commit 10bd98ff authored by Sam Lantinga's avatar Sam Lantinga

Added support for placing windows on different displays

--HG--
extra : convert_revision : svn%3Ac70aab31-4412-0410-b14c-859654838e24/trunk%404247
parent eceb2d3d
...@@ -72,6 +72,7 @@ struct SDL_WindowData ...@@ -72,6 +72,7 @@ struct SDL_WindowData
SDL_WindowID windowID; SDL_WindowID windowID;
NSWindow *window; NSWindow *window;
SDL_bool created; SDL_bool created;
CGDirectDisplayID display;
Cocoa_WindowListener *listener; Cocoa_WindowListener *listener;
struct SDL_VideoData *videodata; struct SDL_VideoData *videodata;
}; };
......
...@@ -31,7 +31,6 @@ ...@@ -31,7 +31,6 @@
static __inline__ void ConvertNSRect(NSRect *r) static __inline__ void ConvertNSRect(NSRect *r)
{ {
/* FIXME: Cache the display used for this window */
r->origin.y = CGDisplayPixelsHigh(kCGDirectMainDisplay) - r->origin.y - r->size.height; r->origin.y = CGDisplayPixelsHigh(kCGDirectMainDisplay) - r->origin.y - r->size.height;
} }
...@@ -99,10 +98,11 @@ static __inline__ void ConvertNSRect(NSRect *r) ...@@ -99,10 +98,11 @@ static __inline__ void ConvertNSRect(NSRect *r)
- (void)windowDidMove:(NSNotification *)aNotification - (void)windowDidMove:(NSNotification *)aNotification
{ {
int x, y; int x, y;
NSRect disp = CGDisplayBounds(_data->display);
NSRect rect = [_data->window contentRectForFrameRect:[_data->window frame]]; NSRect rect = [_data->window contentRectForFrameRect:[_data->window frame]];
ConvertNSRect(&rect); ConvertNSRect(&rect);
x = (int)rect.origin.x; x = (int)rect.origin.x - disp.origin.x;
y = (int)rect.origin.y; y = (int)rect.origin.y - disp.origin.y;
SDL_SendWindowEvent(_data->windowID, SDL_WINDOWEVENT_MOVED, x, y); SDL_SendWindowEvent(_data->windowID, SDL_WINDOWEVENT_MOVED, x, y);
} }
...@@ -309,6 +309,7 @@ SetupWindowData(_THIS, SDL_Window * window, NSWindow *nswindow, SDL_bool created ...@@ -309,6 +309,7 @@ SetupWindowData(_THIS, SDL_Window * window, NSWindow *nswindow, SDL_bool created
{ {
NSAutoreleasePool *pool; NSAutoreleasePool *pool;
SDL_VideoData *videodata = (SDL_VideoData *) _this->driverdata; SDL_VideoData *videodata = (SDL_VideoData *) _this->driverdata;
SDL_DisplayData *displaydata = (SDL_DisplayData *) SDL_GetDisplayFromWindow(window)->driverdata;
SDL_WindowData *data; SDL_WindowData *data;
/* Allocate the window data */ /* Allocate the window data */
...@@ -320,6 +321,7 @@ SetupWindowData(_THIS, SDL_Window * window, NSWindow *nswindow, SDL_bool created ...@@ -320,6 +321,7 @@ SetupWindowData(_THIS, SDL_Window * window, NSWindow *nswindow, SDL_bool created
data->windowID = window->id; data->windowID = window->id;
data->window = nswindow; data->window = nswindow;
data->created = created; data->created = created;
data->display = displaydata->display;
data->videodata = videodata; data->videodata = videodata;
pool = [[NSAutoreleasePool alloc] init]; pool = [[NSAutoreleasePool alloc] init];
...@@ -330,10 +332,11 @@ SetupWindowData(_THIS, SDL_Window * window, NSWindow *nswindow, SDL_bool created ...@@ -330,10 +332,11 @@ SetupWindowData(_THIS, SDL_Window * window, NSWindow *nswindow, SDL_bool created
/* Fill in the SDL window with the window data */ /* Fill in the SDL window with the window data */
{ {
NSRect disp = CGDisplayBounds(data->display);
NSRect rect = [nswindow contentRectForFrameRect:[nswindow frame]]; NSRect rect = [nswindow contentRectForFrameRect:[nswindow frame]];
ConvertNSRect(&rect); ConvertNSRect(&rect);
window->x = (int)rect.origin.x; window->x = (int)rect.origin.x - disp.origin.x;
window->y = (int)rect.origin.y; window->y = (int)rect.origin.y - disp.origin.y;
window->w = (int)rect.size.width; window->w = (int)rect.size.width;
window->h = (int)rect.size.height; window->h = (int)rect.size.height;
} }
...@@ -385,30 +388,26 @@ SetupWindowData(_THIS, SDL_Window * window, NSWindow *nswindow, SDL_bool created ...@@ -385,30 +388,26 @@ SetupWindowData(_THIS, SDL_Window * window, NSWindow *nswindow, SDL_bool created
int int
Cocoa_CreateWindow(_THIS, SDL_Window * window) Cocoa_CreateWindow(_THIS, SDL_Window * window)
{ {
NSAutoreleasePool *pool; NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
NSWindow *nswindow; NSWindow *nswindow;
SDL_DisplayData *displaydata = (SDL_DisplayData *) SDL_GetDisplayFromWindow(window)->driverdata;
NSRect rect; NSRect rect;
unsigned int style; unsigned int style;
NSString *title; NSString *title;
int status; int status;
pool = [[NSAutoreleasePool alloc] init]; rect = CGDisplayBounds(displaydata->display);
if ((window->flags & SDL_WINDOW_FULLSCREEN) if ((window->flags & SDL_WINDOW_FULLSCREEN)
|| window->x == SDL_WINDOWPOS_CENTERED) { || window->x == SDL_WINDOWPOS_CENTERED) {
rect.origin.x = (CGDisplayPixelsWide(kCGDirectMainDisplay) - window->w) / 2; rect.origin.x += (rect.size.width - window->w) / 2;
} else if (window->x == SDL_WINDOWPOS_UNDEFINED) { } else if (window->x != SDL_WINDOWPOS_UNDEFINED) {
rect.origin.x = 0; rect.origin.x += window->x;
} else {
rect.origin.x = window->x;
} }
if ((window->flags & SDL_WINDOW_FULLSCREEN) if ((window->flags & SDL_WINDOW_FULLSCREEN)
|| window->y == SDL_WINDOWPOS_CENTERED) { || window->y == SDL_WINDOWPOS_CENTERED) {
rect.origin.y = (CGDisplayPixelsHigh(kCGDirectMainDisplay) - window->h) / 2; rect.origin.y += (rect.size.height - window->h) / 2;
} else if (window->y == SDL_WINDOWPOS_UNDEFINED) { } else if (window->x != SDL_WINDOWPOS_UNDEFINED) {
rect.origin.y = 0; rect.origin.y += window->y;
} else {
rect.origin.y = window->y;
} }
rect.size.width = window->w; rect.size.width = window->w;
rect.size.height = window->h; rect.size.height = window->h;
...@@ -423,7 +422,22 @@ Cocoa_CreateWindow(_THIS, SDL_Window * window) ...@@ -423,7 +422,22 @@ Cocoa_CreateWindow(_THIS, SDL_Window * window)
style |= NSResizableWindowMask; style |= NSResizableWindowMask;
} }
nswindow = [[SDLWindow alloc] initWithContentRect:rect styleMask:style backing:NSBackingStoreBuffered defer:FALSE]; /* Figure out which screen to place this window */
NSArray *screens = [NSScreen screens];
NSScreen *screen = nil;
NSScreen *candidate;
for (candidate in screens) {
NSRect screenRect = [candidate frame];
if (rect.origin.x >= screenRect.origin.x &&
rect.origin.x < screenRect.origin.x + screenRect.size.width &&
rect.origin.y >= screenRect.origin.y &&
rect.origin.y < screenRect.origin.y + screenRect.size.height) {
screen = candidate;
rect.origin.x -= screenRect.origin.x;
rect.origin.y -= screenRect.origin.y;
}
}
nswindow = [[SDLWindow alloc] initWithContentRect:rect styleMask:style backing:NSBackingStoreBuffered defer:FALSE screen:screen];
[pool release]; [pool release];
...@@ -478,19 +492,21 @@ Cocoa_SetWindowPosition(_THIS, SDL_Window * window) ...@@ -478,19 +492,21 @@ Cocoa_SetWindowPosition(_THIS, SDL_Window * window)
{ {
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
NSWindow *nswindow = ((SDL_WindowData *) window->driverdata)->window; NSWindow *nswindow = ((SDL_WindowData *) window->driverdata)->window;
SDL_DisplayData *displaydata = (SDL_DisplayData *) SDL_GetDisplayFromWindow(window)->driverdata;
NSRect rect; NSRect rect;
rect = CGDisplayBounds(displaydata->display);
if ((window->flags & SDL_WINDOW_FULLSCREEN) if ((window->flags & SDL_WINDOW_FULLSCREEN)
|| window->x == SDL_WINDOWPOS_CENTERED) { || window->x == SDL_WINDOWPOS_CENTERED) {
rect.origin.x = (CGDisplayPixelsWide(kCGDirectMainDisplay) - window->w) / 2; rect.origin.x += (rect.size.width - window->w) / 2;
} else { } else {
rect.origin.x = window->x; rect.origin.x += window->x;
} }
if ((window->flags & SDL_WINDOW_FULLSCREEN) if ((window->flags & SDL_WINDOW_FULLSCREEN)
|| window->y == SDL_WINDOWPOS_CENTERED) { || window->y == SDL_WINDOWPOS_CENTERED) {
rect.origin.y = (CGDisplayPixelsHigh(kCGDirectMainDisplay) - window->h) / 2; rect.origin.y += (rect.size.height - window->h) / 2;
} else { } else {
rect.origin.y = window->y; rect.origin.y += window->y;
} }
rect.size.width = window->w; rect.size.width = window->w;
rect.size.height = window->h; rect.size.height = window->h;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment