Skip to content
This repository has been archived by the owner on Feb 11, 2021. It is now read-only.

Latest commit

 

History

History
701 lines (601 loc) · 20.1 KB

SDL_cocoawindow.m

File metadata and controls

701 lines (601 loc) · 20.1 KB
 
Jul 24, 2006
Jul 24, 2006
1
2
/*
SDL - Simple DirectMedia Layer
Jul 8, 2010
Jul 8, 2010
3
Copyright (C) 1997-2010 Sam Lantinga
Jul 24, 2006
Jul 24, 2006
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version.
This library 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
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with this library; if not, write to the Free Software
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
Sam Lantinga
slouken@libsdl.org
*/
#include "SDL_config.h"
#include "SDL_syswm.h"
#include "../SDL_sysvideo.h"
#include "../../events/SDL_keyboard_c.h"
#include "../../events/SDL_mouse_c.h"
Jul 29, 2010
Jul 29, 2010
28
#include "../../events/SDL_touch_c.h"
Jul 24, 2006
Jul 24, 2006
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
#include "../../events/SDL_windowevents_c.h"
#include "SDL_cocoavideo.h"
static __inline__ void ConvertNSRect(NSRect *r)
{
r->origin.y = CGDisplayPixelsHigh(kCGDirectMainDisplay) - r->origin.y - r->size.height;
}
@implementation Cocoa_WindowListener
- (void)listen:(SDL_WindowData *)data
{
NSNotificationCenter *center;
_data = data;
center = [NSNotificationCenter defaultCenter];
Jan 21, 2010
Jan 21, 2010
48
49
50
51
52
53
54
55
56
[_data->nswindow setNextResponder:self];
if ([_data->nswindow delegate] != nil) {
[center addObserver:self selector:@selector(windowDisExpose:) name:NSWindowDidExposeNotification object:_data->nswindow];
[center addObserver:self selector:@selector(windowDidMove:) name:NSWindowDidMoveNotification object:_data->nswindow];
[center addObserver:self selector:@selector(windowDidResize:) name:NSWindowDidResizeNotification object:_data->nswindow];
[center addObserver:self selector:@selector(windowDidMiniaturize:) name:NSWindowDidMiniaturizeNotification object:_data->nswindow];
[center addObserver:self selector:@selector(windowDidDeminiaturize:) name:NSWindowDidDeminiaturizeNotification object:_data->nswindow];
[center addObserver:self selector:@selector(windowDidBecomeKey:) name:NSWindowDidBecomeKeyNotification object:_data->nswindow];
[center addObserver:self selector:@selector(windowDidResignKey:) name:NSWindowDidResignKeyNotification object:_data->nswindow];
Jul 24, 2006
Jul 24, 2006
57
} else {
Jan 21, 2010
Jan 21, 2010
58
[_data->nswindow setDelegate:self];
Jul 24, 2006
Jul 24, 2006
59
60
61
62
}
[center addObserver:self selector:@selector(windowDidHide:) name:NSApplicationDidHideNotification object:NSApp];
[center addObserver:self selector:@selector(windowDidUnhide:) name:NSApplicationDidUnhideNotification object:NSApp];
Jan 21, 2010
Jan 21, 2010
63
[_data->nswindow setAcceptsMouseMovedEvents:YES];
Jul 29, 2010
Jul 29, 2010
64
[[_data->nswindow contentView] setAcceptsTouchEvents:YES];
Jul 24, 2006
Jul 24, 2006
65
66
67
68
69
70
71
72
}
- (void)close
{
NSNotificationCenter *center;
center = [NSNotificationCenter defaultCenter];
Jan 21, 2010
Jan 21, 2010
73
74
75
76
77
78
79
80
81
[_data->nswindow setNextResponder:nil];
if ([_data->nswindow delegate] != self) {
[center removeObserver:self name:NSWindowDidExposeNotification object:_data->nswindow];
[center removeObserver:self name:NSWindowDidMoveNotification object:_data->nswindow];
[center removeObserver:self name:NSWindowDidResizeNotification object:_data->nswindow];
[center removeObserver:self name:NSWindowDidMiniaturizeNotification object:_data->nswindow];
[center removeObserver:self name:NSWindowDidDeminiaturizeNotification object:_data->nswindow];
[center removeObserver:self name:NSWindowDidBecomeKeyNotification object:_data->nswindow];
[center removeObserver:self name:NSWindowDidResignKeyNotification object:_data->nswindow];
Jul 24, 2006
Jul 24, 2006
82
} else {
Jan 21, 2010
Jan 21, 2010
83
[_data->nswindow setDelegate:nil];
Jul 24, 2006
Jul 24, 2006
84
85
86
87
88
89
90
}
[center removeObserver:self name:NSApplicationDidHideNotification object:NSApp];
[center removeObserver:self name:NSApplicationDidUnhideNotification object:NSApp];
}
- (BOOL)windowShouldClose:(id)sender
{
Jan 21, 2010
Jan 21, 2010
91
SDL_SendWindowEvent(_data->window, SDL_WINDOWEVENT_CLOSE, 0, 0);
Jul 24, 2006
Jul 24, 2006
92
93
94
95
96
return NO;
}
- (void)windowDidExpose:(NSNotification *)aNotification
{
Jan 21, 2010
Jan 21, 2010
97
SDL_SendWindowEvent(_data->window, SDL_WINDOWEVENT_EXPOSED, 0, 0);
Jul 24, 2006
Jul 24, 2006
98
99
100
101
102
}
- (void)windowDidMove:(NSNotification *)aNotification
{
int x, y;
Jan 21, 2010
Jan 21, 2010
103
NSRect rect = [_data->nswindow contentRectForFrameRect:[_data->nswindow frame]];
Jul 24, 2006
Jul 24, 2006
104
ConvertNSRect(&rect);
Dec 1, 2009
Dec 1, 2009
105
106
x = (int)rect.origin.x;
y = (int)rect.origin.y;
Jan 21, 2010
Jan 21, 2010
107
SDL_SendWindowEvent(_data->window, SDL_WINDOWEVENT_MOVED, x, y);
Jul 24, 2006
Jul 24, 2006
108
109
110
111
112
}
- (void)windowDidResize:(NSNotification *)aNotification
{
int w, h;
Jan 21, 2010
Jan 21, 2010
113
NSRect rect = [_data->nswindow contentRectForFrameRect:[_data->nswindow frame]];
Jul 24, 2006
Jul 24, 2006
114
115
w = (int)rect.size.width;
h = (int)rect.size.height;
Jan 21, 2010
Jan 21, 2010
116
SDL_SendWindowEvent(_data->window, SDL_WINDOWEVENT_RESIZED, w, h);
Jul 24, 2006
Jul 24, 2006
117
118
119
120
}
- (void)windowDidMiniaturize:(NSNotification *)aNotification
{
Jan 21, 2010
Jan 21, 2010
121
SDL_SendWindowEvent(_data->window, SDL_WINDOWEVENT_MINIMIZED, 0, 0);
Jul 24, 2006
Jul 24, 2006
122
123
124
125
}
- (void)windowDidDeminiaturize:(NSNotification *)aNotification
{
Jan 21, 2010
Jan 21, 2010
126
SDL_SendWindowEvent(_data->window, SDL_WINDOWEVENT_RESTORED, 0, 0);
Jul 24, 2006
Jul 24, 2006
127
128
129
130
}
- (void)windowDidBecomeKey:(NSNotification *)aNotification
{
Oct 28, 2006
Oct 28, 2006
131
/* We're going to get keyboard events, since we're key. */
May 10, 2010
May 10, 2010
132
SDL_SetKeyboardFocus(_data->window);
Jul 9, 2010
Jul 9, 2010
133
134
135
/* Check to see if someone updated the clipboard */
Cocoa_CheckClipboardUpdate(_data->videodata);
Jul 24, 2006
Jul 24, 2006
136
137
138
139
}
- (void)windowDidResignKey:(NSNotification *)aNotification
{
Oct 28, 2006
Oct 28, 2006
140
/* Some other window will get mouse events, since we're not key. */
May 10, 2010
May 10, 2010
141
142
if (SDL_GetMouseFocus() == _data->window) {
SDL_SetMouseFocus(NULL);
Oct 28, 2006
Oct 28, 2006
143
}
Jul 30, 2006
Jul 30, 2006
144
Oct 28, 2006
Oct 28, 2006
145
/* Some other window will get keyboard events, since we're not key. */
May 10, 2010
May 10, 2010
146
147
148
if (SDL_GetKeyboardFocus() == _data->window) {
SDL_SetKeyboardFocus(NULL);
}
Jul 24, 2006
Jul 24, 2006
149
150
151
152
}
- (void)windowDidHide:(NSNotification *)aNotification
{
Jan 21, 2010
Jan 21, 2010
153
SDL_SendWindowEvent(_data->window, SDL_WINDOWEVENT_HIDDEN, 0, 0);
Jul 24, 2006
Jul 24, 2006
154
155
156
157
}
- (void)windowDidUnhide:(NSNotification *)aNotification
{
Jan 21, 2010
Jan 21, 2010
158
SDL_SendWindowEvent(_data->window, SDL_WINDOWEVENT_SHOWN, 0, 0);
Jul 24, 2006
Jul 24, 2006
159
160
161
162
}
- (void)mouseDown:(NSEvent *)theEvent
{
Jul 30, 2006
Jul 30, 2006
163
int button;
Jul 24, 2006
Jul 24, 2006
164
Jul 30, 2006
Jul 30, 2006
165
166
167
168
169
170
171
172
173
174
175
176
177
178
switch ([theEvent buttonNumber]) {
case 0:
button = SDL_BUTTON_LEFT;
break;
case 1:
button = SDL_BUTTON_RIGHT;
break;
case 2:
button = SDL_BUTTON_MIDDLE;
break;
default:
button = [theEvent buttonNumber];
break;
}
Jul 6, 2010
Jul 6, 2010
179
SDL_SendMouseButton(_data->window, SDL_PRESSED, button);
Jul 24, 2006
Jul 24, 2006
180
181
182
183
}
- (void)rightMouseDown:(NSEvent *)theEvent
{
Jul 30, 2006
Jul 30, 2006
184
[self mouseDown:theEvent];
Jul 24, 2006
Jul 24, 2006
185
186
187
188
}
- (void)otherMouseDown:(NSEvent *)theEvent
{
Jul 30, 2006
Jul 30, 2006
189
[self mouseDown:theEvent];
Jul 24, 2006
Jul 24, 2006
190
191
192
193
}
- (void)mouseUp:(NSEvent *)theEvent
{
Jul 30, 2006
Jul 30, 2006
194
int button;
Jul 24, 2006
Jul 24, 2006
195
Jul 30, 2006
Jul 30, 2006
196
197
198
199
200
201
202
203
204
205
206
207
208
209
switch ([theEvent buttonNumber]) {
case 0:
button = SDL_BUTTON_LEFT;
break;
case 1:
button = SDL_BUTTON_RIGHT;
break;
case 2:
button = SDL_BUTTON_MIDDLE;
break;
default:
button = [theEvent buttonNumber];
break;
}
Jul 6, 2010
Jul 6, 2010
210
SDL_SendMouseButton(_data->window, SDL_RELEASED, button);
Jul 24, 2006
Jul 24, 2006
211
212
213
214
}
- (void)rightMouseUp:(NSEvent *)theEvent
{
Jul 30, 2006
Jul 30, 2006
215
[self mouseUp:theEvent];
Jul 24, 2006
Jul 24, 2006
216
217
218
219
}
- (void)otherMouseUp:(NSEvent *)theEvent
{
Jul 30, 2006
Jul 30, 2006
220
[self mouseUp:theEvent];
Jul 24, 2006
Jul 24, 2006
221
222
223
224
}
- (void)mouseMoved:(NSEvent *)theEvent
{
Jan 21, 2010
Jan 21, 2010
225
SDL_Window *window = _data->window;
Jul 24, 2006
Jul 24, 2006
226
227
NSPoint point;
Dec 3, 2009
Dec 3, 2009
228
229
point = [theEvent locationInWindow];
point.y = window->h - point.y;
Dec 1, 2009
Dec 1, 2009
230
231
if ( point.x < 0 || point.x >= window->w ||
point.y < 0 || point.y >= window->h ) {
May 10, 2010
May 10, 2010
232
233
if (SDL_GetMouseFocus() == window) {
SDL_SetMouseFocus(NULL);
Oct 28, 2006
Oct 28, 2006
234
235
}
} else {
Jul 6, 2010
Jul 6, 2010
236
SDL_SendMouseMotion(window, 0, (int)point.x, (int)point.y);
Oct 28, 2006
Oct 28, 2006
237
}
Jul 24, 2006
Jul 24, 2006
238
239
}
Jul 29, 2006
Jul 29, 2006
240
241
242
243
244
- (void)mouseDragged:(NSEvent *)theEvent
{
[self mouseMoved:theEvent];
}
Jul 29, 2006
Jul 29, 2006
245
246
247
248
249
250
251
252
253
254
- (void)rightMouseDragged:(NSEvent *)theEvent
{
[self mouseMoved:theEvent];
}
- (void)otherMouseDragged:(NSEvent *)theEvent
{
[self mouseMoved:theEvent];
}
Jul 24, 2006
Jul 24, 2006
255
256
- (void)scrollWheel:(NSEvent *)theEvent
{
Jul 6, 2010
Jul 6, 2010
257
258
259
260
261
262
263
264
265
266
267
268
269
270
float x = [theEvent deltaX];
float y = [theEvent deltaY];
if (x > 0) {
x += 0.9f;
} else if (x < 0) {
x -= 0.9f;
}
if (y > 0) {
y += 0.9f;
} else if (y < 0) {
y -= 0.9f;
}
SDL_SendMouseWheel(_data->window, (int)x, (int)y);
Jul 24, 2006
Jul 24, 2006
271
272
}
Jul 29, 2010
Jul 29, 2010
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
- (void)touchesBeganWithEvent:(NSEvent *) theEvent
{
[self handleTouches:COCOA_TOUCH_DOWN withEvent:theEvent];
}
- (void)touchesMovedWithEvent:(NSEvent *) theEvent
{
[self handleTouches:COCOA_TOUCH_MOVE withEvent:theEvent];
}
- (void)touchesEndedWithEvent:(NSEvent *) theEvent
{
[self handleTouches:COCOA_TOUCH_UP withEvent:theEvent];
}
- (void)touchesCancelledWithEvent:(NSEvent *) theEvent
{
[self handleTouches:COCOA_TOUCH_CANCELLED withEvent:theEvent];
}
- (void)handleTouches:(cocoaTouchType)type withEvent:(NSEvent *)event
{
NSSet *touches = [event touchesMatchingPhase:NSTouchPhaseBegan inView:nil];
NSEnumerator *enumerator = [touches objectEnumerator];
NSTouch *touch = (NSTouch*)[enumerator nextObject];
while (touch) {
long touchId = (long)[touch device];
if (!SDL_GetTouch(touchId)) {
Jul 29, 2010
Jul 29, 2010
302
printf("Adding touch: %i\n",touchId)
Jul 29, 2010
Jul 29, 2010
303
304
305
306
307
308
309
310
311
312
313
314
315
316
SDL_Touch touch;
touch.id = touchId;
touch.x_min = 0;
touch.x_max = 1;
touch.xres = touch.x_max - touch.x_min;
touch.y_min = 0;
touch.y_max = 1;
touch.yres = touch.y_max - touch.y_min;
touch.pressure_min = 0;
touch.pressure_max = 1;
touch.pressureres = touch.pressure_max - touch.pressure_min;
if (SDL_AddTouch(&touch, "") < 0) {
Jul 29, 2010
Jul 29, 2010
317
continue;
Jul 29, 2010
Jul 29, 2010
318
}
Jul 29, 2010
Jul 29, 2010
319
printf("Success, added touch: %i\n",touchId)
Jul 29, 2010
Jul 29, 2010
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
}
float x = [touch normalizedPosition].x;
float y = [touch normalizedPosition].y;
long fingerId = (long)[touch identity];
switch (type) {
case COCOA_TOUCH_DOWN:
SDL_SendFingerDown(touchId, fingerId, SDL_TRUE, x, y, 1);
break;
case COCOA_TOUCH_UP:
case COCOA_TOUCH_CANCELLED:
SDL_SendFingerDown(touchId, fingerId, SDL_FALSE, x, y, 1);
break;
case COCOA_TOUCH_MOVE:
SDL_SendTouchMotion(touchId, fingerId, SDL_FALSE, x, y, 1);
break;
}
touch = (NSTouch*)[enumerator nextObject];
}
}
Jul 24, 2006
Jul 24, 2006
341
342
@end
Aug 6, 2006
Aug 6, 2006
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
@interface SDLWindow : NSWindow
/* These are needed for borderless/fullscreen windows */
- (BOOL)canBecomeKeyWindow;
- (BOOL)canBecomeMainWindow;
@end
@implementation SDLWindow
- (BOOL)canBecomeKeyWindow
{
return YES;
}
- (BOOL)canBecomeMainWindow
{
return YES;
}
@end
Jul 24, 2006
Jul 24, 2006
361
static int
Jul 27, 2006
Jul 27, 2006
362
SetupWindowData(_THIS, SDL_Window * window, NSWindow *nswindow, SDL_bool created)
Jul 24, 2006
Jul 24, 2006
363
364
{
NSAutoreleasePool *pool;
Jul 27, 2006
Jul 27, 2006
365
SDL_VideoData *videodata = (SDL_VideoData *) _this->driverdata;
Jan 21, 2010
Jan 21, 2010
366
SDL_VideoDisplay *display = window->display;
Dec 6, 2009
Dec 6, 2009
367
SDL_DisplayData *displaydata = (SDL_DisplayData *) display->driverdata;
Jul 24, 2006
Jul 24, 2006
368
369
370
371
372
373
374
375
SDL_WindowData *data;
/* Allocate the window data */
data = (SDL_WindowData *) SDL_malloc(sizeof(*data));
if (!data) {
SDL_OutOfMemory();
return -1;
}
Jan 21, 2010
Jan 21, 2010
376
data->window = window;
Jan 21, 2010
Jan 21, 2010
377
data->nswindow = nswindow;
Jul 24, 2006
Jul 24, 2006
378
data->created = created;
Dec 1, 2009
Dec 1, 2009
379
data->display = displaydata->display;
Jul 27, 2006
Jul 27, 2006
380
data->videodata = videodata;
Jul 24, 2006
Jul 24, 2006
381
382
383
384
385
386
387
388
389
pool = [[NSAutoreleasePool alloc] init];
/* Create an event listener for the window */
data->listener = [[Cocoa_WindowListener alloc] init];
[data->listener listen:data];
/* Fill in the SDL window with the window data */
{
Dec 6, 2009
Dec 6, 2009
390
SDL_Rect bounds;
Jul 24, 2006
Jul 24, 2006
391
392
NSRect rect = [nswindow contentRectForFrameRect:[nswindow frame]];
ConvertNSRect(&rect);
Dec 6, 2009
Dec 6, 2009
393
394
395
Cocoa_GetDisplayBounds(_this, display, &bounds);
window->x = (int)rect.origin.x - bounds.x;
window->y = (int)rect.origin.y - bounds.y;
Jul 24, 2006
Jul 24, 2006
396
397
398
399
400
401
402
403
404
405
406
window->w = (int)rect.size.width;
window->h = (int)rect.size.height;
}
if ([nswindow isVisible]) {
window->flags |= SDL_WINDOW_SHOWN;
} else {
window->flags &= ~SDL_WINDOW_SHOWN;
}
{
unsigned int style = [nswindow styleMask];
Jul 29, 2006
Jul 29, 2006
407
if ((style & ~NSResizableWindowMask) == NSBorderlessWindowMask) {
Jul 24, 2006
Jul 24, 2006
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
window->flags |= SDL_WINDOW_BORDERLESS;
} else {
window->flags &= ~SDL_WINDOW_BORDERLESS;
}
if (style & NSResizableWindowMask) {
window->flags |= SDL_WINDOW_RESIZABLE;
} else {
window->flags &= ~SDL_WINDOW_RESIZABLE;
}
}
if ([nswindow isZoomed]) {
window->flags |= SDL_WINDOW_MAXIMIZED;
} else {
window->flags &= ~SDL_WINDOW_MAXIMIZED;
}
if ([nswindow isMiniaturized]) {
window->flags |= SDL_WINDOW_MINIMIZED;
} else {
window->flags &= ~SDL_WINDOW_MINIMIZED;
}
if ([nswindow isKeyWindow]) {
window->flags |= SDL_WINDOW_INPUT_FOCUS;
May 10, 2010
May 10, 2010
430
SDL_SetKeyboardFocus(data->window);
Jul 24, 2006
Jul 24, 2006
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
if (window->flags & SDL_WINDOW_INPUT_GRABBED) {
/* FIXME */
}
}
/* All done! */
[pool release];
window->driverdata = data;
return 0;
}
int
Cocoa_CreateWindow(_THIS, SDL_Window * window)
{
Dec 1, 2009
Dec 1, 2009
446
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
Jul 24, 2006
Jul 24, 2006
447
NSWindow *nswindow;
Jan 21, 2010
Jan 21, 2010
448
SDL_VideoDisplay *display = window->display;
Jul 24, 2006
Jul 24, 2006
449
NSRect rect;
Dec 6, 2009
Dec 6, 2009
450
SDL_Rect bounds;
Jul 24, 2006
Jul 24, 2006
451
452
unsigned int style;
Dec 6, 2009
Dec 6, 2009
453
Cocoa_GetDisplayBounds(_this, display, &bounds);
Feb 19, 2009
Feb 19, 2009
454
455
if ((window->flags & SDL_WINDOW_FULLSCREEN)
|| window->x == SDL_WINDOWPOS_CENTERED) {
Dec 6, 2009
Dec 6, 2009
456
457
458
459
rect.origin.x = bounds.x + (bounds.w - window->w) / 2;
} else if (window->x == SDL_WINDOWPOS_UNDEFINED) {
rect.origin.x = bounds.x;
} else {
Dec 6, 2009
Dec 6, 2009
460
rect.origin.x = bounds.x + window->x;
Jul 24, 2006
Jul 24, 2006
461
}
Feb 19, 2009
Feb 19, 2009
462
463
if ((window->flags & SDL_WINDOW_FULLSCREEN)
|| window->y == SDL_WINDOWPOS_CENTERED) {
Dec 6, 2009
Dec 6, 2009
464
465
466
467
rect.origin.y = bounds.y + (bounds.h - window->h) / 2;
} else if (window->x == SDL_WINDOWPOS_UNDEFINED) {
rect.origin.y = bounds.y;
} else {
Dec 6, 2009
Dec 6, 2009
468
rect.origin.y = bounds.y + window->y;
Jul 24, 2006
Jul 24, 2006
469
470
471
472
473
474
475
476
477
478
479
480
481
482
}
rect.size.width = window->w;
rect.size.height = window->h;
ConvertNSRect(&rect);
if (window->flags & SDL_WINDOW_BORDERLESS) {
style = NSBorderlessWindowMask;
} else {
style = (NSTitledWindowMask|NSClosableWindowMask|NSMiniaturizableWindowMask);
}
if (window->flags & SDL_WINDOW_RESIZABLE) {
style |= NSResizableWindowMask;
}
Dec 1, 2009
Dec 1, 2009
483
484
485
486
/* Figure out which screen to place this window */
NSArray *screens = [NSScreen screens];
NSScreen *screen = nil;
NSScreen *candidate;
Dec 5, 2009
Dec 5, 2009
487
488
int i, count = [screens count];
for (i = 0; i < count; ++i) {
Dec 6, 2009
Dec 6, 2009
489
candidate = [screens objectAtIndex:i];
Dec 1, 2009
Dec 1, 2009
490
491
492
493
494
495
496
497
498
499
500
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];
Jul 24, 2006
Jul 24, 2006
501
502
503
[pool release];
Jul 27, 2006
Jul 27, 2006
504
if (SetupWindowData(_this, window, nswindow, SDL_TRUE) < 0) {
Jul 24, 2006
Jul 24, 2006
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
[nswindow release];
return -1;
}
return 0;
}
int
Cocoa_CreateWindowFrom(_THIS, SDL_Window * window, const void *data)
{
NSAutoreleasePool *pool;
NSWindow *nswindow = (NSWindow *) data;
NSString *title;
pool = [[NSAutoreleasePool alloc] init];
/* Query the title from the existing window */
title = [nswindow title];
if (title) {
window->title = SDL_strdup([title UTF8String]);
}
[pool release];
Jul 27, 2006
Jul 27, 2006
528
return SetupWindowData(_this, window, nswindow, SDL_FALSE);
Jul 24, 2006
Jul 24, 2006
529
530
531
532
533
}
void
Cocoa_SetWindowTitle(_THIS, SDL_Window * window)
{
Jul 25, 2006
Jul 25, 2006
534
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
Jan 21, 2010
Jan 21, 2010
535
NSWindow *nswindow = ((SDL_WindowData *) window->driverdata)->nswindow;
Jul 24, 2006
Jul 24, 2006
536
537
NSString *string;
Jul 29, 2006
Jul 29, 2006
538
539
540
541
542
if(window->title) {
string = [[NSString alloc] initWithUTF8String:window->title];
} else {
string = [[NSString alloc] init];
}
Jul 24, 2006
Jul 24, 2006
543
544
[nswindow setTitle:string];
[string release];
Jul 29, 2006
Jul 29, 2006
545
Jul 25, 2006
Jul 25, 2006
546
[pool release];
Jul 24, 2006
Jul 24, 2006
547
548
549
550
551
}
void
Cocoa_SetWindowPosition(_THIS, SDL_Window * window)
{
Jul 25, 2006
Jul 25, 2006
552
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
Jan 21, 2010
Jan 21, 2010
553
NSWindow *nswindow = ((SDL_WindowData *) window->driverdata)->nswindow;
Jan 21, 2010
Jan 21, 2010
554
SDL_VideoDisplay *display = window->display;
Jul 24, 2006
Jul 24, 2006
555
NSRect rect;
Dec 6, 2009
Dec 6, 2009
556
SDL_Rect bounds;
Jul 24, 2006
Jul 24, 2006
557
Dec 6, 2009
Dec 6, 2009
558
Cocoa_GetDisplayBounds(_this, display, &bounds);
Feb 19, 2009
Feb 19, 2009
559
560
if ((window->flags & SDL_WINDOW_FULLSCREEN)
|| window->x == SDL_WINDOWPOS_CENTERED) {
Dec 6, 2009
Dec 6, 2009
561
rect.origin.x = bounds.x + (bounds.w - window->w) / 2;
Feb 19, 2009
Feb 19, 2009
562
} else {
Dec 6, 2009
Dec 6, 2009
563
rect.origin.x = bounds.x + window->x;
Feb 19, 2009
Feb 19, 2009
564
565
566
}
if ((window->flags & SDL_WINDOW_FULLSCREEN)
|| window->y == SDL_WINDOWPOS_CENTERED) {
Dec 6, 2009
Dec 6, 2009
567
rect.origin.y = bounds.y + (bounds.h - window->h) / 2;
Feb 19, 2009
Feb 19, 2009
568
} else {
Dec 6, 2009
Dec 6, 2009
569
rect.origin.y = bounds.y + window->y;
Feb 19, 2009
Feb 19, 2009
570
}
Jul 24, 2006
Jul 24, 2006
571
572
573
574
575
rect.size.width = window->w;
rect.size.height = window->h;
ConvertNSRect(&rect);
rect = [nswindow frameRectForContentRect:rect];
[nswindow setFrameOrigin:rect.origin];
Jul 25, 2006
Jul 25, 2006
576
[pool release];
Jul 24, 2006
Jul 24, 2006
577
578
579
580
581
}
void
Cocoa_SetWindowSize(_THIS, SDL_Window * window)
{
Jul 25, 2006
Jul 25, 2006
582
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
Jan 21, 2010
Jan 21, 2010
583
NSWindow *nswindow = ((SDL_WindowData *) window->driverdata)->nswindow;
Jul 24, 2006
Jul 24, 2006
584
585
586
587
588
NSSize size;
size.width = window->w;
size.height = window->h;
[nswindow setContentSize:size];
Jul 25, 2006
Jul 25, 2006
589
[pool release];
Jul 24, 2006
Jul 24, 2006
590
591
592
593
594
}
void
Cocoa_ShowWindow(_THIS, SDL_Window * window)
{
Jul 25, 2006
Jul 25, 2006
595
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
Jan 21, 2010
Jan 21, 2010
596
NSWindow *nswindow = ((SDL_WindowData *) window->driverdata)->nswindow;
Jul 24, 2006
Jul 24, 2006
597
Jul 29, 2006
Jul 29, 2006
598
599
600
if (![nswindow isMiniaturized]) {
[nswindow makeKeyAndOrderFront:nil];
}
Jul 25, 2006
Jul 25, 2006
601
[pool release];
Jul 24, 2006
Jul 24, 2006
602
603
604
605
606
}
void
Cocoa_HideWindow(_THIS, SDL_Window * window)
{
Jul 29, 2006
Jul 29, 2006
607
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
Jan 21, 2010
Jan 21, 2010
608
NSWindow *nswindow = ((SDL_WindowData *) window->driverdata)->nswindow;
Jul 24, 2006
Jul 24, 2006
609
Jul 29, 2006
Jul 29, 2006
610
611
[nswindow orderOut:nil];
[pool release];
Jul 24, 2006
Jul 24, 2006
612
613
614
615
616
}
void
Cocoa_RaiseWindow(_THIS, SDL_Window * window)
{
Jul 25, 2006
Jul 25, 2006
617
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
Jan 21, 2010
Jan 21, 2010
618
NSWindow *nswindow = ((SDL_WindowData *) window->driverdata)->nswindow;
Jul 24, 2006
Jul 24, 2006
619
620
[nswindow makeKeyAndOrderFront:nil];
Jul 25, 2006
Jul 25, 2006
621
[pool release];
Jul 24, 2006
Jul 24, 2006
622
623
624
625
626
}
void
Cocoa_MaximizeWindow(_THIS, SDL_Window * window)
{
Jul 25, 2006
Jul 25, 2006
627
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
Jan 21, 2010
Jan 21, 2010
628
NSWindow *nswindow = ((SDL_WindowData *) window->driverdata)->nswindow;
Jul 24, 2006
Jul 24, 2006
629
Jul 29, 2006
Jul 29, 2006
630
[nswindow zoom:nil];
Jul 25, 2006
Jul 25, 2006
631
[pool release];
Jul 24, 2006
Jul 24, 2006
632
633
634
635
636
}
void
Cocoa_MinimizeWindow(_THIS, SDL_Window * window)
{
Jul 25, 2006
Jul 25, 2006
637
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
Jan 21, 2010
Jan 21, 2010
638
NSWindow *nswindow = ((SDL_WindowData *) window->driverdata)->nswindow;
Jul 24, 2006
Jul 24, 2006
639
Jul 29, 2006
Jul 29, 2006
640
[nswindow miniaturize:nil];
Jul 25, 2006
Jul 25, 2006
641
[pool release];
Jul 24, 2006
Jul 24, 2006
642
643
644
645
646
}
void
Cocoa_RestoreWindow(_THIS, SDL_Window * window)
{
Jul 29, 2006
Jul 29, 2006
647
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
Jan 21, 2010
Jan 21, 2010
648
NSWindow *nswindow = ((SDL_WindowData *) window->driverdata)->nswindow;
Jul 24, 2006
Jul 24, 2006
649
Jul 29, 2006
Jul 29, 2006
650
651
652
653
654
655
if ([nswindow isMiniaturized]) {
[nswindow deminiaturize:nil];
} else if ([nswindow isZoomed]) {
[nswindow zoom:nil];
}
[pool release];
Jul 24, 2006
Jul 24, 2006
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
}
void
Cocoa_SetWindowGrab(_THIS, SDL_Window * window)
{
if ((window->flags & SDL_WINDOW_INPUT_GRABBED) &&
(window->flags & SDL_WINDOW_INPUT_FOCUS)) {
/* FIXME: Grab mouse */
} else {
/* FIXME: Release mouse */
}
}
void
Cocoa_DestroyWindow(_THIS, SDL_Window * window)
{
Jul 25, 2006
Jul 25, 2006
672
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
Jul 24, 2006
Jul 24, 2006
673
674
675
676
677
678
SDL_WindowData *data = (SDL_WindowData *) window->driverdata;
if (data) {
[data->listener close];
[data->listener release];
if (data->created) {
Jan 21, 2010
Jan 21, 2010
679
[data->nswindow close];
Jul 24, 2006
Jul 24, 2006
680
681
682
}
SDL_free(data);
}
Jul 25, 2006
Jul 25, 2006
683
[pool release];
Jul 24, 2006
Jul 24, 2006
684
685
686
687
688
}
SDL_bool
Cocoa_GetWindowWMInfo(_THIS, SDL_Window * window, SDL_SysWMinfo * info)
{
May 10, 2010
May 10, 2010
689
//NSWindow *nswindow = ((SDL_WindowData *) window->driverdata)->nswindow;
Jul 24, 2006
Jul 24, 2006
690
691
692
693
694
695
696
697
698
699
700
701
if (info->version.major <= SDL_MAJOR_VERSION) {
//info->window = nswindow;
return SDL_TRUE;
} else {
SDL_SetError("Application not compiled with SDL %d.%d\n",
SDL_MAJOR_VERSION, SDL_MINOR_VERSION);
return SDL_FALSE;
}
}
/* vi: set ts=4 sw=4 expandtab: */