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

Latest commit

 

History

History
758 lines (649 loc) · 21.8 KB

SDL_cocoawindow.m

File metadata and controls

758 lines (649 loc) · 21.8 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
#include "../../events/SDL_windowevents_c.h"
#include "SDL_cocoavideo.h"
Jul 27, 2010
Jul 27, 2010
31
#include "SDL_cocoashape.h"
Jul 24, 2006
Jul 24, 2006
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
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
}
Dec 2, 2010
Dec 2, 2010
60
61
// FIXME: Why doesn't this work?
// [center addObserver:self selector:@selector(rightMouseDown:) name:[NSString stringWithCString:"rightMouseDown" encoding:NSUTF8StringEncoding] object:[_data->nswindow contentView]];
Jul 24, 2006
Jul 24, 2006
62
63
64
[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
65
[_data->nswindow setAcceptsMouseMovedEvents:YES];
Dec 2, 2010
Dec 2, 2010
66
#if MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_6
Jul 29, 2010
Jul 29, 2010
67
[[_data->nswindow contentView] setAcceptsTouchEvents:YES];
Dec 1, 2010
Dec 1, 2010
68
#endif
Jul 24, 2006
Jul 24, 2006
69
70
71
72
73
74
75
76
}
- (void)close
{
NSNotificationCenter *center;
center = [NSNotificationCenter defaultCenter];
Jan 21, 2010
Jan 21, 2010
77
78
79
80
81
82
83
84
85
[_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
86
} else {
Jan 21, 2010
Jan 21, 2010
87
[_data->nswindow setDelegate:nil];
Jul 24, 2006
Jul 24, 2006
88
89
90
91
92
93
94
}
[center removeObserver:self name:NSApplicationDidHideNotification object:NSApp];
[center removeObserver:self name:NSApplicationDidUnhideNotification object:NSApp];
}
- (BOOL)windowShouldClose:(id)sender
{
Jan 21, 2010
Jan 21, 2010
95
SDL_SendWindowEvent(_data->window, SDL_WINDOWEVENT_CLOSE, 0, 0);
Jul 24, 2006
Jul 24, 2006
96
97
98
99
100
return NO;
}
- (void)windowDidExpose:(NSNotification *)aNotification
{
Jan 21, 2010
Jan 21, 2010
101
SDL_SendWindowEvent(_data->window, SDL_WINDOWEVENT_EXPOSED, 0, 0);
Jul 24, 2006
Jul 24, 2006
102
103
104
105
106
}
- (void)windowDidMove:(NSNotification *)aNotification
{
int x, y;
Jan 21, 2010
Jan 21, 2010
107
NSRect rect = [_data->nswindow contentRectForFrameRect:[_data->nswindow frame]];
Jul 24, 2006
Jul 24, 2006
108
ConvertNSRect(&rect);
Dec 1, 2009
Dec 1, 2009
109
110
x = (int)rect.origin.x;
y = (int)rect.origin.y;
Jan 21, 2010
Jan 21, 2010
111
SDL_SendWindowEvent(_data->window, SDL_WINDOWEVENT_MOVED, x, y);
Jul 24, 2006
Jul 24, 2006
112
113
114
115
116
}
- (void)windowDidResize:(NSNotification *)aNotification
{
int w, h;
Jan 21, 2010
Jan 21, 2010
117
NSRect rect = [_data->nswindow contentRectForFrameRect:[_data->nswindow frame]];
Jul 24, 2006
Jul 24, 2006
118
119
w = (int)rect.size.width;
h = (int)rect.size.height;
Jul 27, 2010
Jul 27, 2010
120
Cocoa_ResizeWindowShape(_data->window);
Jan 21, 2010
Jan 21, 2010
121
SDL_SendWindowEvent(_data->window, SDL_WINDOWEVENT_RESIZED, w, h);
Jul 24, 2006
Jul 24, 2006
122
123
124
125
}
- (void)windowDidMiniaturize:(NSNotification *)aNotification
{
Jan 21, 2010
Jan 21, 2010
126
SDL_SendWindowEvent(_data->window, SDL_WINDOWEVENT_MINIMIZED, 0, 0);
Jul 24, 2006
Jul 24, 2006
127
128
129
130
}
- (void)windowDidDeminiaturize:(NSNotification *)aNotification
{
Jan 21, 2010
Jan 21, 2010
131
SDL_SendWindowEvent(_data->window, SDL_WINDOWEVENT_RESTORED, 0, 0);
Jul 24, 2006
Jul 24, 2006
132
133
134
135
}
- (void)windowDidBecomeKey:(NSNotification *)aNotification
{
Oct 28, 2006
Oct 28, 2006
136
/* We're going to get keyboard events, since we're key. */
May 10, 2010
May 10, 2010
137
SDL_SetKeyboardFocus(_data->window);
Jul 9, 2010
Jul 9, 2010
138
139
140
/* Check to see if someone updated the clipboard */
Cocoa_CheckClipboardUpdate(_data->videodata);
Jul 24, 2006
Jul 24, 2006
141
142
143
144
}
- (void)windowDidResignKey:(NSNotification *)aNotification
{
Oct 28, 2006
Oct 28, 2006
145
/* Some other window will get mouse events, since we're not key. */
May 10, 2010
May 10, 2010
146
147
if (SDL_GetMouseFocus() == _data->window) {
SDL_SetMouseFocus(NULL);
Oct 28, 2006
Oct 28, 2006
148
}
Jul 30, 2006
Jul 30, 2006
149
Oct 28, 2006
Oct 28, 2006
150
/* Some other window will get keyboard events, since we're not key. */
May 10, 2010
May 10, 2010
151
152
153
if (SDL_GetKeyboardFocus() == _data->window) {
SDL_SetKeyboardFocus(NULL);
}
Jul 24, 2006
Jul 24, 2006
154
155
156
157
}
- (void)windowDidHide:(NSNotification *)aNotification
{
Jan 21, 2010
Jan 21, 2010
158
SDL_SendWindowEvent(_data->window, SDL_WINDOWEVENT_HIDDEN, 0, 0);
Jul 24, 2006
Jul 24, 2006
159
160
161
162
}
- (void)windowDidUnhide:(NSNotification *)aNotification
{
Jan 21, 2010
Jan 21, 2010
163
SDL_SendWindowEvent(_data->window, SDL_WINDOWEVENT_SHOWN, 0, 0);
Jul 24, 2006
Jul 24, 2006
164
165
166
167
}
- (void)mouseDown:(NSEvent *)theEvent
{
Jul 30, 2006
Jul 30, 2006
168
int button;
Jul 24, 2006
Jul 24, 2006
169
Jul 30, 2006
Jul 30, 2006
170
171
172
173
174
175
176
177
178
179
180
181
182
183
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
184
SDL_SendMouseButton(_data->window, SDL_PRESSED, button);
Jul 24, 2006
Jul 24, 2006
185
186
187
188
}
- (void)rightMouseDown:(NSEvent *)theEvent
{
Jul 30, 2006
Jul 30, 2006
189
[self mouseDown:theEvent];
Jul 24, 2006
Jul 24, 2006
190
191
192
193
}
- (void)otherMouseDown:(NSEvent *)theEvent
{
Jul 30, 2006
Jul 30, 2006
194
[self mouseDown:theEvent];
Jul 24, 2006
Jul 24, 2006
195
196
197
198
}
- (void)mouseUp:(NSEvent *)theEvent
{
Jul 30, 2006
Jul 30, 2006
199
int button;
Jul 24, 2006
Jul 24, 2006
200
Jul 30, 2006
Jul 30, 2006
201
202
203
204
205
206
207
208
209
210
211
212
213
214
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
215
SDL_SendMouseButton(_data->window, SDL_RELEASED, button);
Jul 24, 2006
Jul 24, 2006
216
217
218
219
}
- (void)rightMouseUp:(NSEvent *)theEvent
{
Jul 30, 2006
Jul 30, 2006
220
[self mouseUp:theEvent];
Jul 24, 2006
Jul 24, 2006
221
222
223
224
}
- (void)otherMouseUp:(NSEvent *)theEvent
{
Jul 30, 2006
Jul 30, 2006
225
[self mouseUp:theEvent];
Jul 24, 2006
Jul 24, 2006
226
227
228
229
}
- (void)mouseMoved:(NSEvent *)theEvent
{
Jan 21, 2010
Jan 21, 2010
230
SDL_Window *window = _data->window;
Jul 24, 2006
Jul 24, 2006
231
232
NSPoint point;
Dec 3, 2009
Dec 3, 2009
233
234
point = [theEvent locationInWindow];
point.y = window->h - point.y;
Dec 1, 2009
Dec 1, 2009
235
236
if ( point.x < 0 || point.x >= window->w ||
point.y < 0 || point.y >= window->h ) {
May 10, 2010
May 10, 2010
237
238
if (SDL_GetMouseFocus() == window) {
SDL_SetMouseFocus(NULL);
Oct 28, 2006
Oct 28, 2006
239
240
}
} else {
Jul 6, 2010
Jul 6, 2010
241
SDL_SendMouseMotion(window, 0, (int)point.x, (int)point.y);
Oct 28, 2006
Oct 28, 2006
242
}
Jul 24, 2006
Jul 24, 2006
243
244
}
Jul 29, 2006
Jul 29, 2006
245
246
247
248
249
- (void)mouseDragged:(NSEvent *)theEvent
{
[self mouseMoved:theEvent];
}
Jul 29, 2006
Jul 29, 2006
250
251
252
253
254
255
256
257
258
259
- (void)rightMouseDragged:(NSEvent *)theEvent
{
[self mouseMoved:theEvent];
}
- (void)otherMouseDragged:(NSEvent *)theEvent
{
[self mouseMoved:theEvent];
}
Jul 24, 2006
Jul 24, 2006
260
261
- (void)scrollWheel:(NSEvent *)theEvent
{
Jul 6, 2010
Jul 6, 2010
262
263
264
265
266
267
268
269
270
271
272
273
274
275
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
276
277
}
Jul 29, 2010
Jul 29, 2010
278
279
280
281
282
283
284
285
286
287
288
289
290
291
- (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];
}
Jul 29, 2006
Jul 29, 2006
292
Jul 29, 2010
Jul 29, 2010
293
294
295
296
297
298
299
- (void)touchesCancelledWithEvent:(NSEvent *) theEvent
{
[self handleTouches:COCOA_TOUCH_CANCELLED withEvent:theEvent];
}
- (void)handleTouches:(cocoaTouchType)type withEvent:(NSEvent *)event
{
Dec 2, 2010
Dec 2, 2010
300
#if MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_6
Aug 1, 2010
Aug 1, 2010
301
302
303
NSSet *touches = 0;
NSEnumerator *enumerator;
NSTouch *touch;
Jul 29, 2010
Jul 29, 2010
304
Aug 1, 2010
Aug 1, 2010
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
switch (type) {
case COCOA_TOUCH_DOWN:
touches = [event touchesMatchingPhase:NSTouchPhaseBegan inView:nil];
break;
case COCOA_TOUCH_UP:
case COCOA_TOUCH_CANCELLED:
touches = [event touchesMatchingPhase:NSTouchPhaseEnded inView:nil];
break;
case COCOA_TOUCH_MOVE:
touches = [event touchesMatchingPhase:NSTouchPhaseMoved inView:nil];
break;
}
enumerator = [touches objectEnumerator];
touch = (NSTouch*)[enumerator nextObject];
Jul 29, 2010
Jul 29, 2010
320
while (touch) {
Aug 1, 2010
Aug 1, 2010
321
SDL_TouchID touchId = (SDL_TouchID)[touch device];
Jul 29, 2010
Jul 29, 2010
322
323
324
325
326
327
if (!SDL_GetTouch(touchId)) {
SDL_Touch touch;
touch.id = touchId;
touch.x_min = 0;
touch.x_max = 1;
Jul 31, 2010
Jul 31, 2010
328
touch.native_xres = touch.x_max - touch.x_min;
Jul 29, 2010
Jul 29, 2010
329
330
touch.y_min = 0;
touch.y_max = 1;
Jul 31, 2010
Jul 31, 2010
331
touch.native_yres = touch.y_max - touch.y_min;
Jul 29, 2010
Jul 29, 2010
332
333
touch.pressure_min = 0;
touch.pressure_max = 1;
Jul 31, 2010
Jul 31, 2010
334
touch.native_pressureres = touch.pressure_max - touch.pressure_min;
Jul 29, 2010
Jul 29, 2010
335
336
if (SDL_AddTouch(&touch, "") < 0) {
Aug 1, 2010
Aug 1, 2010
337
return;
Jul 29, 2010
Jul 29, 2010
338
339
}
}
Aug 14, 2010
Aug 14, 2010
340
341
SDL_FingerID fingerId = (SDL_FingerID)[touch identity];
Jul 29, 2010
Jul 29, 2010
342
343
float x = [touch normalizedPosition].x;
float y = [touch normalizedPosition].y;
Aug 14, 2010
Aug 14, 2010
344
345
346
/* Make the origin the upper left instead of the lower left */
y = 1.0f - y;
Jul 29, 2010
Jul 29, 2010
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
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];
}
Dec 2, 2010
Dec 2, 2010
362
#endif /* MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_6 */
Jul 24, 2006
Jul 24, 2006
363
364
365
366
}
@end
Aug 6, 2006
Aug 6, 2006
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
@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
May 9, 2010
May 9, 2010
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
@interface SDLView : NSView {
Cocoa_WindowListener *listener;
}
@end
@implementation SDLView
- (id) initWithFrame: (NSRect) rect
listener: (Cocoa_WindowListener *) theListener
{
if (self = [super initWithFrame:rect]) {
listener = theListener;
}
return self;
}
- (void)rightMouseDown:(NSEvent *)theEvent
{
[listener mouseDown:theEvent];
}
@end
Jul 24, 2006
Jul 24, 2006
409
static int
Jul 27, 2006
Jul 27, 2006
410
SetupWindowData(_THIS, SDL_Window * window, NSWindow *nswindow, SDL_bool created)
Jul 24, 2006
Jul 24, 2006
411
412
{
NSAutoreleasePool *pool;
Jul 27, 2006
Jul 27, 2006
413
SDL_VideoData *videodata = (SDL_VideoData *) _this->driverdata;
Jan 21, 2010
Jan 21, 2010
414
SDL_VideoDisplay *display = window->display;
Dec 6, 2009
Dec 6, 2009
415
SDL_DisplayData *displaydata = (SDL_DisplayData *) display->driverdata;
Jul 24, 2006
Jul 24, 2006
416
417
418
419
420
421
422
423
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
424
data->window = window;
Jan 21, 2010
Jan 21, 2010
425
data->nswindow = nswindow;
Jul 24, 2006
Jul 24, 2006
426
data->created = created;
Dec 1, 2009
Dec 1, 2009
427
data->display = displaydata->display;
Jul 27, 2006
Jul 27, 2006
428
data->videodata = videodata;
Jul 24, 2006
Jul 24, 2006
429
430
431
432
433
434
435
436
437
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
438
SDL_Rect bounds;
Jul 24, 2006
Jul 24, 2006
439
NSRect rect = [nswindow contentRectForFrameRect:[nswindow frame]];
May 9, 2010
May 9, 2010
440
441
NSView *contentView = [[SDLView alloc] initWithFrame: rect
listener: data->listener];
Dec 2, 2010
Dec 2, 2010
442
443
444
#if MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_6
[contentView setAcceptsTouchEvents:YES];
#endif
May 9, 2010
May 9, 2010
445
446
447
[nswindow setContentView: contentView];
[contentView release];
Jul 24, 2006
Jul 24, 2006
448
ConvertNSRect(&rect);
Dec 6, 2009
Dec 6, 2009
449
450
451
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
452
453
454
455
456
457
458
459
460
461
462
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
463
if ((style & ~NSResizableWindowMask) == NSBorderlessWindowMask) {
Jul 24, 2006
Jul 24, 2006
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
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
486
SDL_SetKeyboardFocus(data->window);
Jul 24, 2006
Jul 24, 2006
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
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
502
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
Jul 24, 2006
Jul 24, 2006
503
NSWindow *nswindow;
Jan 21, 2010
Jan 21, 2010
504
SDL_VideoDisplay *display = window->display;
Jul 24, 2006
Jul 24, 2006
505
NSRect rect;
Dec 6, 2009
Dec 6, 2009
506
SDL_Rect bounds;
Jul 24, 2006
Jul 24, 2006
507
508
unsigned int style;
Dec 6, 2009
Dec 6, 2009
509
Cocoa_GetDisplayBounds(_this, display, &bounds);
Feb 19, 2009
Feb 19, 2009
510
511
if ((window->flags & SDL_WINDOW_FULLSCREEN)
|| window->x == SDL_WINDOWPOS_CENTERED) {
Dec 6, 2009
Dec 6, 2009
512
513
514
515
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
516
rect.origin.x = bounds.x + window->x;
Jul 24, 2006
Jul 24, 2006
517
}
Feb 19, 2009
Feb 19, 2009
518
519
if ((window->flags & SDL_WINDOW_FULLSCREEN)
|| window->y == SDL_WINDOWPOS_CENTERED) {
Dec 6, 2009
Dec 6, 2009
520
521
522
523
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
524
rect.origin.y = bounds.y + window->y;
Jul 24, 2006
Jul 24, 2006
525
526
527
528
529
530
531
532
533
534
535
536
537
538
}
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
539
540
541
542
/* Figure out which screen to place this window */
NSArray *screens = [NSScreen screens];
NSScreen *screen = nil;
NSScreen *candidate;
Dec 5, 2009
Dec 5, 2009
543
544
int i, count = [screens count];
for (i = 0; i < count; ++i) {
Dec 6, 2009
Dec 6, 2009
545
candidate = [screens objectAtIndex:i];
Dec 1, 2009
Dec 1, 2009
546
547
548
549
550
551
552
553
554
555
556
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
557
558
559
[pool release];
Jul 27, 2006
Jul 27, 2006
560
if (SetupWindowData(_this, window, nswindow, SDL_TRUE) < 0) {
Jul 24, 2006
Jul 24, 2006
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
[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
584
return SetupWindowData(_this, window, nswindow, SDL_FALSE);
Jul 24, 2006
Jul 24, 2006
585
586
587
588
589
}
void
Cocoa_SetWindowTitle(_THIS, SDL_Window * window)
{
Jul 25, 2006
Jul 25, 2006
590
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
Jan 21, 2010
Jan 21, 2010
591
NSWindow *nswindow = ((SDL_WindowData *) window->driverdata)->nswindow;
Jul 24, 2006
Jul 24, 2006
592
593
NSString *string;
Jul 29, 2006
Jul 29, 2006
594
595
596
597
598
if(window->title) {
string = [[NSString alloc] initWithUTF8String:window->title];
} else {
string = [[NSString alloc] init];
}
Jul 24, 2006
Jul 24, 2006
599
600
[nswindow setTitle:string];
[string release];
Jul 29, 2006
Jul 29, 2006
601
Jul 25, 2006
Jul 25, 2006
602
[pool release];
Jul 24, 2006
Jul 24, 2006
603
604
605
606
607
}
void
Cocoa_SetWindowPosition(_THIS, SDL_Window * window)
{
Jul 25, 2006
Jul 25, 2006
608
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
Jan 21, 2010
Jan 21, 2010
609
NSWindow *nswindow = ((SDL_WindowData *) window->driverdata)->nswindow;
Jan 21, 2010
Jan 21, 2010
610
SDL_VideoDisplay *display = window->display;
Jul 24, 2006
Jul 24, 2006
611
NSRect rect;
Dec 6, 2009
Dec 6, 2009
612
SDL_Rect bounds;
Jul 24, 2006
Jul 24, 2006
613
Dec 6, 2009
Dec 6, 2009
614
Cocoa_GetDisplayBounds(_this, display, &bounds);
Feb 19, 2009
Feb 19, 2009
615
616
if ((window->flags & SDL_WINDOW_FULLSCREEN)
|| window->x == SDL_WINDOWPOS_CENTERED) {
Dec 6, 2009
Dec 6, 2009
617
rect.origin.x = bounds.x + (bounds.w - window->w) / 2;
Feb 19, 2009
Feb 19, 2009
618
} else {
Dec 6, 2009
Dec 6, 2009
619
rect.origin.x = bounds.x + window->x;
Feb 19, 2009
Feb 19, 2009
620
621
622
}
if ((window->flags & SDL_WINDOW_FULLSCREEN)
|| window->y == SDL_WINDOWPOS_CENTERED) {
Dec 6, 2009
Dec 6, 2009
623
rect.origin.y = bounds.y + (bounds.h - window->h) / 2;
Feb 19, 2009
Feb 19, 2009
624
} else {
Dec 6, 2009
Dec 6, 2009
625
rect.origin.y = bounds.y + window->y;
Feb 19, 2009
Feb 19, 2009
626
}
Jul 24, 2006
Jul 24, 2006
627
628
629
630
631
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
632
[pool release];
Jul 24, 2006
Jul 24, 2006
633
634
635
636
637
}
void
Cocoa_SetWindowSize(_THIS, SDL_Window * window)
{
Jul 25, 2006
Jul 25, 2006
638
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
Jan 21, 2010
Jan 21, 2010
639
NSWindow *nswindow = ((SDL_WindowData *) window->driverdata)->nswindow;
Jul 24, 2006
Jul 24, 2006
640
641
642
643
644
NSSize size;
size.width = window->w;
size.height = window->h;
[nswindow setContentSize:size];
Jul 25, 2006
Jul 25, 2006
645
[pool release];
Jul 24, 2006
Jul 24, 2006
646
647
648
649
650
}
void
Cocoa_ShowWindow(_THIS, SDL_Window * window)
{
Jul 25, 2006
Jul 25, 2006
651
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
Jan 21, 2010
Jan 21, 2010
652
NSWindow *nswindow = ((SDL_WindowData *) window->driverdata)->nswindow;
Jul 24, 2006
Jul 24, 2006
653
Jul 29, 2006
Jul 29, 2006
654
655
656
if (![nswindow isMiniaturized]) {
[nswindow makeKeyAndOrderFront:nil];
}
Jul 25, 2006
Jul 25, 2006
657
[pool release];
Jul 24, 2006
Jul 24, 2006
658
659
660
661
662
}
void
Cocoa_HideWindow(_THIS, SDL_Window * window)
{
Jul 29, 2006
Jul 29, 2006
663
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
Jan 21, 2010
Jan 21, 2010
664
NSWindow *nswindow = ((SDL_WindowData *) window->driverdata)->nswindow;
Jul 24, 2006
Jul 24, 2006
665
Jul 29, 2006
Jul 29, 2006
666
667
[nswindow orderOut:nil];
[pool release];
Jul 24, 2006
Jul 24, 2006
668
669
670
671
672
}
void
Cocoa_RaiseWindow(_THIS, SDL_Window * window)
{
Jul 25, 2006
Jul 25, 2006
673
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
Jan 21, 2010
Jan 21, 2010
674
NSWindow *nswindow = ((SDL_WindowData *) window->driverdata)->nswindow;
Jul 24, 2006
Jul 24, 2006
675
676
[nswindow makeKeyAndOrderFront:nil];
Jul 25, 2006
Jul 25, 2006
677
[pool release];
Jul 24, 2006
Jul 24, 2006
678
679
680
681
682
}
void
Cocoa_MaximizeWindow(_THIS, SDL_Window * window)
{
Jul 25, 2006
Jul 25, 2006
683
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
Jan 21, 2010
Jan 21, 2010
684
NSWindow *nswindow = ((SDL_WindowData *) window->driverdata)->nswindow;
Jul 24, 2006
Jul 24, 2006
685
Jul 29, 2006
Jul 29, 2006
686
[nswindow zoom:nil];
Jul 25, 2006
Jul 25, 2006
687
[pool release];
Jul 24, 2006
Jul 24, 2006
688
689
690
691
692
}
void
Cocoa_MinimizeWindow(_THIS, SDL_Window * window)
{
Jul 25, 2006
Jul 25, 2006
693
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
Jan 21, 2010
Jan 21, 2010
694
NSWindow *nswindow = ((SDL_WindowData *) window->driverdata)->nswindow;
Jul 24, 2006
Jul 24, 2006
695
Jul 29, 2006
Jul 29, 2006
696
[nswindow miniaturize:nil];
Jul 25, 2006
Jul 25, 2006
697
[pool release];
Jul 24, 2006
Jul 24, 2006
698
699
700
701
702
}
void
Cocoa_RestoreWindow(_THIS, SDL_Window * window)
{
Jul 29, 2006
Jul 29, 2006
703
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
Jan 21, 2010
Jan 21, 2010
704
NSWindow *nswindow = ((SDL_WindowData *) window->driverdata)->nswindow;
Jul 24, 2006
Jul 24, 2006
705
Jul 29, 2006
Jul 29, 2006
706
707
708
709
710
711
if ([nswindow isMiniaturized]) {
[nswindow deminiaturize:nil];
} else if ([nswindow isZoomed]) {
[nswindow zoom:nil];
}
[pool release];
Jul 24, 2006
Jul 24, 2006
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
}
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
728
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
Jul 24, 2006
Jul 24, 2006
729
730
731
732
733
734
SDL_WindowData *data = (SDL_WindowData *) window->driverdata;
if (data) {
[data->listener close];
[data->listener release];
if (data->created) {
Jan 21, 2010
Jan 21, 2010
735
[data->nswindow close];
Jul 24, 2006
Jul 24, 2006
736
737
738
}
SDL_free(data);
}
Jul 25, 2006
Jul 25, 2006
739
[pool release];
Jul 24, 2006
Jul 24, 2006
740
741
742
743
744
}
SDL_bool
Cocoa_GetWindowWMInfo(_THIS, SDL_Window * window, SDL_SysWMinfo * info)
{
Sep 27, 2010
Sep 27, 2010
745
NSWindow *nswindow = ((SDL_WindowData *) window->driverdata)->nswindow;
Jul 24, 2006
Jul 24, 2006
746
747
if (info->version.major <= SDL_MAJOR_VERSION) {
Sep 27, 2010
Sep 27, 2010
748
info->subsystem = SDL_SYSWM_COCOA;
Sep 30, 2010
Sep 30, 2010
749
info->cocoa.window = nswindow;
Jul 24, 2006
Jul 24, 2006
750
751
752
753
754
755
756
757
758
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: */