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

Latest commit

 

History

History
868 lines (737 loc) · 24.5 KB

SDL_cocoawindow.m

File metadata and controls

868 lines (737 loc) · 24.5 KB
 
Jul 24, 2006
Jul 24, 2006
1
2
/*
SDL - Simple DirectMedia Layer
Feb 12, 2011
Feb 12, 2011
3
Copyright (C) 1997-2011 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"
Jan 20, 2011
Jan 20, 2011
32
#include "SDL_cocoamouse.h"
Jul 24, 2006
Jul 24, 2006
33
34
35
36
37
38
39
40
41
42
43
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;
Feb 21, 2011
Feb 21, 2011
44
45
NSWindow *window = data->nswindow;
NSView *view = [window contentView];
Jul 24, 2006
Jul 24, 2006
46
47
48
49
50
_data = data;
center = [NSNotificationCenter defaultCenter];
Feb 21, 2011
Feb 21, 2011
51
52
53
54
55
56
57
58
59
60
61
if ([window delegate] != nil) {
[center addObserver:self selector:@selector(windowDidExpose:) name:NSWindowDidExposeNotification object:window];
[center addObserver:self selector:@selector(windowDidMove:) name:NSWindowDidMoveNotification object:window];
[center addObserver:self selector:@selector(windowDidResize:) name:NSWindowDidResizeNotification object:window];
[center addObserver:self selector:@selector(windowDidMiniaturize:) name:NSWindowDidMiniaturizeNotification object:window];
[center addObserver:self selector:@selector(windowDidDeminiaturize:) name:NSWindowDidDeminiaturizeNotification object:window];
[center addObserver:self selector:@selector(windowDidBecomeKey:) name:NSWindowDidBecomeKeyNotification object:window];
[center addObserver:self selector:@selector(windowDidResignKey:) name:NSWindowDidResignKeyNotification object:window];
} else {
[window setDelegate:self];
}
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];
Feb 21, 2011
Feb 21, 2011
65
66
67
68
69
[window setNextResponder:self];
[window setAcceptsMouseMovedEvents:YES];
[view setNextResponder:self];
[view addTrackingRect:[view visibleRect] owner:self userData:nil assumeInside:NO];
Dec 2, 2010
Dec 2, 2010
70
#if MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_6
Feb 21, 2011
Feb 21, 2011
71
[view setAcceptsTouchEvents:YES];
Dec 1, 2010
Dec 1, 2010
72
#endif
Jul 24, 2006
Jul 24, 2006
73
74
75
76
77
}
- (void)close
{
NSNotificationCenter *center;
Feb 21, 2011
Feb 21, 2011
78
79
NSWindow *window = _data->nswindow;
NSView *view = [window contentView];
Jul 24, 2006
Jul 24, 2006
80
81
82
center = [NSNotificationCenter defaultCenter];
Feb 21, 2011
Feb 21, 2011
83
84
85
86
87
88
89
90
91
92
93
if ([window delegate] != self) {
[center removeObserver:self name:NSWindowDidExposeNotification object:window];
[center removeObserver:self name:NSWindowDidMoveNotification object:window];
[center removeObserver:self name:NSWindowDidResizeNotification object:window];
[center removeObserver:self name:NSWindowDidMiniaturizeNotification object:window];
[center removeObserver:self name:NSWindowDidDeminiaturizeNotification object:window];
[center removeObserver:self name:NSWindowDidBecomeKeyNotification object:window];
[center removeObserver:self name:NSWindowDidResignKeyNotification object:window];
} else {
[window setDelegate:nil];
}
Jul 24, 2006
Jul 24, 2006
94
95
[center removeObserver:self name:NSApplicationDidHideNotification object:NSApp];
[center removeObserver:self name:NSApplicationDidUnhideNotification object:NSApp];
Feb 21, 2011
Feb 21, 2011
96
Feb 21, 2011
Feb 21, 2011
97
98
99
100
101
102
if ([window nextResponder] == self) {
[window setNextResponder:nil];
}
if ([view nextResponder] == self) {
[view setNextResponder:nil];
}
Jul 24, 2006
Jul 24, 2006
103
104
105
106
}
- (BOOL)windowShouldClose:(id)sender
{
Jan 21, 2010
Jan 21, 2010
107
SDL_SendWindowEvent(_data->window, SDL_WINDOWEVENT_CLOSE, 0, 0);
Jul 24, 2006
Jul 24, 2006
108
109
110
111
112
return NO;
}
- (void)windowDidExpose:(NSNotification *)aNotification
{
Jan 21, 2010
Jan 21, 2010
113
SDL_SendWindowEvent(_data->window, SDL_WINDOWEVENT_EXPOSED, 0, 0);
Jul 24, 2006
Jul 24, 2006
114
115
116
117
118
}
- (void)windowDidMove:(NSNotification *)aNotification
{
int x, y;
Jan 21, 2010
Jan 21, 2010
119
NSRect rect = [_data->nswindow contentRectForFrameRect:[_data->nswindow frame]];
Jul 24, 2006
Jul 24, 2006
120
ConvertNSRect(&rect);
Dec 1, 2009
Dec 1, 2009
121
122
x = (int)rect.origin.x;
y = (int)rect.origin.y;
Jan 21, 2010
Jan 21, 2010
123
SDL_SendWindowEvent(_data->window, SDL_WINDOWEVENT_MOVED, x, y);
Jul 24, 2006
Jul 24, 2006
124
125
126
127
128
}
- (void)windowDidResize:(NSNotification *)aNotification
{
int w, h;
Jan 21, 2010
Jan 21, 2010
129
NSRect rect = [_data->nswindow contentRectForFrameRect:[_data->nswindow frame]];
Jul 24, 2006
Jul 24, 2006
130
131
w = (int)rect.size.width;
h = (int)rect.size.height;
Dec 31, 2010
Dec 31, 2010
132
133
if (SDL_IsShapedWindow(_data->window))
Cocoa_ResizeWindowShape(_data->window);
Jan 21, 2010
Jan 21, 2010
134
SDL_SendWindowEvent(_data->window, SDL_WINDOWEVENT_RESIZED, w, h);
Jul 24, 2006
Jul 24, 2006
135
136
137
138
}
- (void)windowDidMiniaturize:(NSNotification *)aNotification
{
Jan 21, 2010
Jan 21, 2010
139
SDL_SendWindowEvent(_data->window, SDL_WINDOWEVENT_MINIMIZED, 0, 0);
Jul 24, 2006
Jul 24, 2006
140
141
142
143
}
- (void)windowDidDeminiaturize:(NSNotification *)aNotification
{
Jan 21, 2010
Jan 21, 2010
144
SDL_SendWindowEvent(_data->window, SDL_WINDOWEVENT_RESTORED, 0, 0);
Jul 24, 2006
Jul 24, 2006
145
146
147
148
}
- (void)windowDidBecomeKey:(NSNotification *)aNotification
{
Feb 21, 2011
Feb 21, 2011
149
150
SDL_Window *window = _data->window;
Oct 28, 2006
Oct 28, 2006
151
/* We're going to get keyboard events, since we're key. */
Feb 21, 2011
Feb 21, 2011
152
153
154
SDL_SetKeyboardFocus(window);
/* If we just gained focus we need the updated mouse position */
Feb 21, 2011
Feb 21, 2011
155
if (SDL_GetMouseFocus() == window) {
Feb 21, 2011
Feb 21, 2011
156
157
158
159
160
161
NSPoint point;
point = [NSEvent mouseLocation];
point = [_data->nswindow convertScreenToBase:point];
point.y = window->h - point.y;
SDL_SendMouseMotion(window, 0, (int)point.x, (int)point.y);
}
Jul 9, 2010
Jul 9, 2010
162
163
164
/* Check to see if someone updated the clipboard */
Cocoa_CheckClipboardUpdate(_data->videodata);
Jul 24, 2006
Jul 24, 2006
165
166
167
168
}
- (void)windowDidResignKey:(NSNotification *)aNotification
{
Oct 28, 2006
Oct 28, 2006
169
/* Some other window will get mouse events, since we're not key. */
May 10, 2010
May 10, 2010
170
171
if (SDL_GetMouseFocus() == _data->window) {
SDL_SetMouseFocus(NULL);
Oct 28, 2006
Oct 28, 2006
172
}
Jul 30, 2006
Jul 30, 2006
173
Oct 28, 2006
Oct 28, 2006
174
/* Some other window will get keyboard events, since we're not key. */
May 10, 2010
May 10, 2010
175
176
177
if (SDL_GetKeyboardFocus() == _data->window) {
SDL_SetKeyboardFocus(NULL);
}
Jul 24, 2006
Jul 24, 2006
178
179
180
181
}
- (void)windowDidHide:(NSNotification *)aNotification
{
Jan 21, 2010
Jan 21, 2010
182
SDL_SendWindowEvent(_data->window, SDL_WINDOWEVENT_HIDDEN, 0, 0);
Jul 24, 2006
Jul 24, 2006
183
184
185
186
}
- (void)windowDidUnhide:(NSNotification *)aNotification
{
Jan 21, 2010
Jan 21, 2010
187
SDL_SendWindowEvent(_data->window, SDL_WINDOWEVENT_SHOWN, 0, 0);
Jul 24, 2006
Jul 24, 2006
188
189
190
191
}
- (void)mouseDown:(NSEvent *)theEvent
{
Jul 30, 2006
Jul 30, 2006
192
int button;
Jul 24, 2006
Jul 24, 2006
193
Jul 30, 2006
Jul 30, 2006
194
195
196
197
198
199
200
201
202
203
204
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:
Jan 21, 2011
Jan 21, 2011
205
button = [theEvent buttonNumber] + 1;
Jul 30, 2006
Jul 30, 2006
206
207
break;
}
Jul 6, 2010
Jul 6, 2010
208
SDL_SendMouseButton(_data->window, SDL_PRESSED, button);
Jul 24, 2006
Jul 24, 2006
209
210
211
212
}
- (void)rightMouseDown:(NSEvent *)theEvent
{
Jul 30, 2006
Jul 30, 2006
213
[self mouseDown:theEvent];
Jul 24, 2006
Jul 24, 2006
214
215
216
217
}
- (void)otherMouseDown:(NSEvent *)theEvent
{
Jul 30, 2006
Jul 30, 2006
218
[self mouseDown:theEvent];
Jul 24, 2006
Jul 24, 2006
219
220
221
222
}
- (void)mouseUp:(NSEvent *)theEvent
{
Jul 30, 2006
Jul 30, 2006
223
int button;
Jul 24, 2006
Jul 24, 2006
224
Jul 30, 2006
Jul 30, 2006
225
226
227
228
229
230
231
232
233
234
235
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:
Jan 21, 2011
Jan 21, 2011
236
button = [theEvent buttonNumber] + 1;
Jul 30, 2006
Jul 30, 2006
237
238
break;
}
Jul 6, 2010
Jul 6, 2010
239
SDL_SendMouseButton(_data->window, SDL_RELEASED, button);
Jul 24, 2006
Jul 24, 2006
240
241
242
243
}
- (void)rightMouseUp:(NSEvent *)theEvent
{
Jul 30, 2006
Jul 30, 2006
244
[self mouseUp:theEvent];
Jul 24, 2006
Jul 24, 2006
245
246
247
248
}
- (void)otherMouseUp:(NSEvent *)theEvent
{
Jul 30, 2006
Jul 30, 2006
249
[self mouseUp:theEvent];
Jul 24, 2006
Jul 24, 2006
250
251
}
Feb 21, 2011
Feb 21, 2011
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
- (void)mouseEntered:(NSEvent *)theEvent
{
SDL_SetMouseFocus(_data->window);
}
- (void)mouseExited:(NSEvent *)theEvent
{
SDL_Window *window = _data->window;
if (SDL_GetMouseFocus() == window) {
if (window->flags & SDL_WINDOW_INPUT_GRABBED) {
int x, y;
NSPoint point;
CGPoint cgpoint;
point = [theEvent locationInWindow];
point.y = window->h - point.y;
SDL_SendMouseMotion(window, 0, (int)point.x, (int)point.y);
SDL_GetMouseState(&x, &y);
cgpoint.x = window->x + x;
cgpoint.y = window->y + y;
CGDisplayMoveCursorToPoint(kCGDirectMainDisplay, cgpoint);
} else {
SDL_SetMouseFocus(NULL);
}
}
}
Jul 24, 2006
Jul 24, 2006
281
282
- (void)mouseMoved:(NSEvent *)theEvent
{
Jan 21, 2010
Jan 21, 2010
283
SDL_Window *window = _data->window;
Jul 24, 2006
Jul 24, 2006
284
Feb 21, 2011
Feb 21, 2011
285
286
#ifdef RELATIVE_MOTION
if (window->flags & SDL_WINDOW_INPUT_GRABBED) {
Jan 20, 2011
Jan 20, 2011
287
return;
Feb 21, 2011
Feb 21, 2011
288
289
290
291
292
293
294
295
}
#endif
if (SDL_GetMouseFocus() == window) {
NSPoint point;
point = [theEvent locationInWindow];
point.y = window->h - point.y;
Jan 20, 2011
Jan 20, 2011
296
Jul 6, 2010
Jul 6, 2010
297
SDL_SendMouseMotion(window, 0, (int)point.x, (int)point.y);
Oct 28, 2006
Oct 28, 2006
298
}
Jul 24, 2006
Jul 24, 2006
299
300
}
Jul 29, 2006
Jul 29, 2006
301
302
303
304
305
- (void)mouseDragged:(NSEvent *)theEvent
{
[self mouseMoved:theEvent];
}
Jul 29, 2006
Jul 29, 2006
306
307
308
309
310
311
312
313
314
315
- (void)rightMouseDragged:(NSEvent *)theEvent
{
[self mouseMoved:theEvent];
}
- (void)otherMouseDragged:(NSEvent *)theEvent
{
[self mouseMoved:theEvent];
}
Jul 24, 2006
Jul 24, 2006
316
317
- (void)scrollWheel:(NSEvent *)theEvent
{
Jan 20, 2011
Jan 20, 2011
318
Cocoa_HandleMouseWheel(_data->window, theEvent);
Jul 24, 2006
Jul 24, 2006
319
320
}
Jul 29, 2010
Jul 29, 2010
321
322
323
324
325
326
327
328
329
330
331
332
333
334
- (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
335
Jul 29, 2010
Jul 29, 2010
336
337
338
339
340
341
342
- (void)touchesCancelledWithEvent:(NSEvent *) theEvent
{
[self handleTouches:COCOA_TOUCH_CANCELLED withEvent:theEvent];
}
- (void)handleTouches:(cocoaTouchType)type withEvent:(NSEvent *)event
{
Dec 2, 2010
Dec 2, 2010
343
#if MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_6
Aug 1, 2010
Aug 1, 2010
344
345
346
NSSet *touches = 0;
NSEnumerator *enumerator;
NSTouch *touch;
Jul 29, 2010
Jul 29, 2010
347
Aug 1, 2010
Aug 1, 2010
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
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
363
while (touch) {
Aug 1, 2010
Aug 1, 2010
364
SDL_TouchID touchId = (SDL_TouchID)[touch device];
Jul 29, 2010
Jul 29, 2010
365
366
367
368
369
370
if (!SDL_GetTouch(touchId)) {
SDL_Touch touch;
touch.id = touchId;
touch.x_min = 0;
touch.x_max = 1;
Jul 31, 2010
Jul 31, 2010
371
touch.native_xres = touch.x_max - touch.x_min;
Jul 29, 2010
Jul 29, 2010
372
373
touch.y_min = 0;
touch.y_max = 1;
Jul 31, 2010
Jul 31, 2010
374
touch.native_yres = touch.y_max - touch.y_min;
Jul 29, 2010
Jul 29, 2010
375
376
touch.pressure_min = 0;
touch.pressure_max = 1;
Jul 31, 2010
Jul 31, 2010
377
touch.native_pressureres = touch.pressure_max - touch.pressure_min;
Jul 29, 2010
Jul 29, 2010
378
379
if (SDL_AddTouch(&touch, "") < 0) {
Aug 1, 2010
Aug 1, 2010
380
return;
Jul 29, 2010
Jul 29, 2010
381
382
}
}
Aug 14, 2010
Aug 14, 2010
383
384
SDL_FingerID fingerId = (SDL_FingerID)[touch identity];
Jul 29, 2010
Jul 29, 2010
385
386
float x = [touch normalizedPosition].x;
float y = [touch normalizedPosition].y;
Feb 12, 2011
Feb 12, 2011
387
388
/* Make the origin the upper left instead of the lower left */
y = 1.0f - y;
Aug 14, 2010
Aug 14, 2010
389
Jul 29, 2010
Jul 29, 2010
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
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
405
#endif /* MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_6 */
Jul 24, 2006
Jul 24, 2006
406
407
408
409
}
@end
Aug 6, 2006
Aug 6, 2006
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
@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
Feb 21, 2011
Feb 21, 2011
428
@interface SDLView : NSView { }
May 9, 2010
May 9, 2010
429
430
431
432
433
@end
@implementation SDLView
- (void)rightMouseDown:(NSEvent *)theEvent
{
Feb 21, 2011
Feb 21, 2011
434
[[self nextResponder] rightMouseDown:theEvent];
May 9, 2010
May 9, 2010
435
436
437
}
@end
Feb 11, 2011
Feb 11, 2011
438
static unsigned int
Feb 16, 2011
Feb 16, 2011
439
GetWindowStyle(SDL_Window * window)
Feb 11, 2011
Feb 11, 2011
440
441
442
{
unsigned int style;
Feb 16, 2011
Feb 16, 2011
443
if (window->flags & SDL_WINDOW_FULLSCREEN) {
Feb 11, 2011
Feb 11, 2011
444
style = NSBorderlessWindowMask;
Feb 16, 2011
Feb 16, 2011
445
446
447
448
449
450
451
452
453
454
} else {
if (window->flags & SDL_WINDOW_BORDERLESS) {
style = NSBorderlessWindowMask;
} else {
style = (NSTitledWindowMask|NSClosableWindowMask|NSMiniaturizableWindowMask);
}
if (window->flags & SDL_WINDOW_RESIZABLE) {
style |= NSResizableWindowMask;
}
}
Feb 11, 2011
Feb 11, 2011
455
456
457
return style;
}
Jul 24, 2006
Jul 24, 2006
458
static int
Jul 27, 2006
Jul 27, 2006
459
SetupWindowData(_THIS, SDL_Window * window, NSWindow *nswindow, SDL_bool created)
Jul 24, 2006
Jul 24, 2006
460
461
{
NSAutoreleasePool *pool;
Jul 27, 2006
Jul 27, 2006
462
SDL_VideoData *videodata = (SDL_VideoData *) _this->driverdata;
Jul 24, 2006
Jul 24, 2006
463
464
465
SDL_WindowData *data;
/* Allocate the window data */
Feb 11, 2011
Feb 11, 2011
466
data = (SDL_WindowData *) SDL_calloc(1, sizeof(*data));
Jul 24, 2006
Jul 24, 2006
467
468
469
470
if (!data) {
SDL_OutOfMemory();
return -1;
}
Jan 21, 2010
Jan 21, 2010
471
data->window = window;
Jan 21, 2010
Jan 21, 2010
472
data->nswindow = nswindow;
Jul 24, 2006
Jul 24, 2006
473
data->created = created;
Jul 27, 2006
Jul 27, 2006
474
data->videodata = videodata;
Jul 24, 2006
Jul 24, 2006
475
476
477
478
479
480
481
482
483
pool = [[NSAutoreleasePool alloc] init];
/* Create an event listener for the window */
data->listener = [[Cocoa_WindowListener alloc] init];
/* Fill in the SDL window with the window data */
{
NSRect rect = [nswindow contentRectForFrameRect:[nswindow frame]];
Feb 21, 2011
Feb 21, 2011
484
NSView *contentView = [[SDLView alloc] initWithFrame:rect];
May 9, 2010
May 9, 2010
485
486
487
[nswindow setContentView: contentView];
[contentView release];
Jul 24, 2006
Jul 24, 2006
488
ConvertNSRect(&rect);
Feb 12, 2011
Feb 12, 2011
489
490
491
492
window->x = (int)rect.origin.x;
window->y = (int)rect.origin.y;
window->w = (int)rect.size.width;
window->h = (int)rect.size.height;
Jul 24, 2006
Jul 24, 2006
493
}
Feb 21, 2011
Feb 21, 2011
494
495
496
497
/* Set up the listener after we create the view */
[data->listener listen:data];
Jul 24, 2006
Jul 24, 2006
498
499
500
501
502
503
504
505
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
506
if ((style & ~NSResizableWindowMask) == NSBorderlessWindowMask) {
Jul 24, 2006
Jul 24, 2006
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
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
529
SDL_SetKeyboardFocus(data->window);
Jul 24, 2006
Jul 24, 2006
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
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
545
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
Jul 24, 2006
Jul 24, 2006
546
NSWindow *nswindow;
Feb 10, 2011
Feb 10, 2011
547
SDL_VideoDisplay *display = SDL_GetDisplayForWindow(window);
Jul 24, 2006
Jul 24, 2006
548
NSRect rect;
Dec 6, 2009
Dec 6, 2009
549
SDL_Rect bounds;
Jul 24, 2006
Jul 24, 2006
550
551
unsigned int style;
Dec 6, 2009
Dec 6, 2009
552
Cocoa_GetDisplayBounds(_this, display, &bounds);
Feb 11, 2011
Feb 11, 2011
553
if (SDL_WINDOWPOS_ISCENTERED(window->x)) {
Dec 6, 2009
Dec 6, 2009
554
rect.origin.x = bounds.x + (bounds.w - window->w) / 2;
Feb 10, 2011
Feb 10, 2011
555
} else if (SDL_WINDOWPOS_ISUNDEFINED(window->x)) {
Dec 6, 2009
Dec 6, 2009
556
557
rect.origin.x = bounds.x;
} else {
Feb 10, 2011
Feb 10, 2011
558
rect.origin.x = window->x;
Jul 24, 2006
Jul 24, 2006
559
}
Feb 11, 2011
Feb 11, 2011
560
if (SDL_WINDOWPOS_ISCENTERED(window->y)) {
Dec 6, 2009
Dec 6, 2009
561
rect.origin.y = bounds.y + (bounds.h - window->h) / 2;
Feb 10, 2011
Feb 10, 2011
562
} else if (SDL_WINDOWPOS_ISUNDEFINED(window->y)) {
Dec 6, 2009
Dec 6, 2009
563
564
rect.origin.y = bounds.y;
} else {
Feb 10, 2011
Feb 10, 2011
565
rect.origin.y = window->y;
Jul 24, 2006
Jul 24, 2006
566
567
568
569
570
}
rect.size.width = window->w;
rect.size.height = window->h;
ConvertNSRect(&rect);
Feb 16, 2011
Feb 16, 2011
571
style = GetWindowStyle(window);
Jul 24, 2006
Jul 24, 2006
572
Dec 1, 2009
Dec 1, 2009
573
574
575
576
/* Figure out which screen to place this window */
NSArray *screens = [NSScreen screens];
NSScreen *screen = nil;
NSScreen *candidate;
Dec 5, 2009
Dec 5, 2009
577
578
int i, count = [screens count];
for (i = 0; i < count; ++i) {
Dec 6, 2009
Dec 6, 2009
579
candidate = [screens objectAtIndex:i];
Dec 1, 2009
Dec 1, 2009
580
581
582
583
584
585
586
587
588
589
590
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
591
592
593
[pool release];
Jul 27, 2006
Jul 27, 2006
594
if (SetupWindowData(_this, window, nswindow, SDL_TRUE) < 0) {
Jul 24, 2006
Jul 24, 2006
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
[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
618
return SetupWindowData(_this, window, nswindow, SDL_FALSE);
Jul 24, 2006
Jul 24, 2006
619
620
621
622
623
}
void
Cocoa_SetWindowTitle(_THIS, SDL_Window * window)
{
Jul 25, 2006
Jul 25, 2006
624
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
Jan 21, 2010
Jan 21, 2010
625
NSWindow *nswindow = ((SDL_WindowData *) window->driverdata)->nswindow;
Jul 24, 2006
Jul 24, 2006
626
627
NSString *string;
Jul 29, 2006
Jul 29, 2006
628
629
630
631
632
if(window->title) {
string = [[NSString alloc] initWithUTF8String:window->title];
} else {
string = [[NSString alloc] init];
}
Jul 24, 2006
Jul 24, 2006
633
634
[nswindow setTitle:string];
[string release];
Jul 29, 2006
Jul 29, 2006
635
Jul 25, 2006
Jul 25, 2006
636
[pool release];
Jul 24, 2006
Jul 24, 2006
637
638
}
Feb 22, 2011
Feb 22, 2011
639
640
641
642
643
644
645
646
647
648
649
650
651
void
Cocoa_SetWindowIcon(_THIS, SDL_Window * window, SDL_Surface * icon)
{
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
NSImage *nsimage = Cocoa_CreateImage(icon);
if (nsimage) {
[NSApp setApplicationIconImage:nsimage];
}
[pool release];
}
Jul 24, 2006
Jul 24, 2006
652
653
654
void
Cocoa_SetWindowPosition(_THIS, SDL_Window * window)
{
Jul 25, 2006
Jul 25, 2006
655
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
Jan 21, 2010
Jan 21, 2010
656
NSWindow *nswindow = ((SDL_WindowData *) window->driverdata)->nswindow;
Feb 10, 2011
Feb 10, 2011
657
SDL_VideoDisplay *display = SDL_GetDisplayForWindow(window);
Jul 24, 2006
Jul 24, 2006
658
NSRect rect;
Dec 6, 2009
Dec 6, 2009
659
SDL_Rect bounds;
Jul 24, 2006
Jul 24, 2006
660
Dec 6, 2009
Dec 6, 2009
661
Cocoa_GetDisplayBounds(_this, display, &bounds);
Feb 11, 2011
Feb 11, 2011
662
if (SDL_WINDOWPOS_ISCENTERED(window->x)) {
Dec 6, 2009
Dec 6, 2009
663
rect.origin.x = bounds.x + (bounds.w - window->w) / 2;
Feb 19, 2009
Feb 19, 2009
664
} else {
Feb 10, 2011
Feb 10, 2011
665
rect.origin.x = window->x;
Feb 19, 2009
Feb 19, 2009
666
}
Feb 11, 2011
Feb 11, 2011
667
if (SDL_WINDOWPOS_ISCENTERED(window->y)) {
Dec 6, 2009
Dec 6, 2009
668
rect.origin.y = bounds.y + (bounds.h - window->h) / 2;
Feb 19, 2009
Feb 19, 2009
669
} else {
Feb 10, 2011
Feb 10, 2011
670
rect.origin.y = window->y;
Feb 19, 2009
Feb 19, 2009
671
}
Jul 24, 2006
Jul 24, 2006
672
673
674
675
676
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
677
[pool release];
Jul 24, 2006
Jul 24, 2006
678
679
680
681
682
}
void
Cocoa_SetWindowSize(_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
686
687
688
689
NSSize size;
size.width = window->w;
size.height = window->h;
[nswindow setContentSize:size];
Jul 25, 2006
Jul 25, 2006
690
[pool release];
Jul 24, 2006
Jul 24, 2006
691
692
693
694
695
}
void
Cocoa_ShowWindow(_THIS, SDL_Window * window)
{
Jul 25, 2006
Jul 25, 2006
696
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
Jan 21, 2010
Jan 21, 2010
697
NSWindow *nswindow = ((SDL_WindowData *) window->driverdata)->nswindow;
Jul 24, 2006
Jul 24, 2006
698
Jul 29, 2006
Jul 29, 2006
699
700
701
if (![nswindow isMiniaturized]) {
[nswindow makeKeyAndOrderFront:nil];
}
Jul 25, 2006
Jul 25, 2006
702
[pool release];
Jul 24, 2006
Jul 24, 2006
703
704
705
706
707
}
void
Cocoa_HideWindow(_THIS, SDL_Window * window)
{
Jul 29, 2006
Jul 29, 2006
708
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
Jan 21, 2010
Jan 21, 2010
709
NSWindow *nswindow = ((SDL_WindowData *) window->driverdata)->nswindow;
Jul 24, 2006
Jul 24, 2006
710
Jul 29, 2006
Jul 29, 2006
711
712
[nswindow orderOut:nil];
[pool release];
Jul 24, 2006
Jul 24, 2006
713
714
715
716
717
}
void
Cocoa_RaiseWindow(_THIS, SDL_Window * window)
{
Jul 25, 2006
Jul 25, 2006
718
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
Jan 21, 2010
Jan 21, 2010
719
NSWindow *nswindow = ((SDL_WindowData *) window->driverdata)->nswindow;
Jul 24, 2006
Jul 24, 2006
720
721
[nswindow makeKeyAndOrderFront:nil];
Jul 25, 2006
Jul 25, 2006
722
[pool release];
Jul 24, 2006
Jul 24, 2006
723
724
725
726
727
}
void
Cocoa_MaximizeWindow(_THIS, SDL_Window * window)
{
Jul 25, 2006
Jul 25, 2006
728
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
Jan 21, 2010
Jan 21, 2010
729
NSWindow *nswindow = ((SDL_WindowData *) window->driverdata)->nswindow;
Jul 24, 2006
Jul 24, 2006
730
Jul 29, 2006
Jul 29, 2006
731
[nswindow zoom:nil];
Jul 25, 2006
Jul 25, 2006
732
[pool release];
Jul 24, 2006
Jul 24, 2006
733
734
735
736
737
}
void
Cocoa_MinimizeWindow(_THIS, SDL_Window * window)
{
Jul 25, 2006
Jul 25, 2006
738
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
Jan 21, 2010
Jan 21, 2010
739
NSWindow *nswindow = ((SDL_WindowData *) window->driverdata)->nswindow;
Jul 24, 2006
Jul 24, 2006
740
Jul 29, 2006
Jul 29, 2006
741
[nswindow miniaturize:nil];
Jul 25, 2006
Jul 25, 2006
742
[pool release];
Jul 24, 2006
Jul 24, 2006
743
744
745
746
747
}
void
Cocoa_RestoreWindow(_THIS, SDL_Window * window)
{
Jul 29, 2006
Jul 29, 2006
748
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
Jan 21, 2010
Jan 21, 2010
749
NSWindow *nswindow = ((SDL_WindowData *) window->driverdata)->nswindow;
Jul 24, 2006
Jul 24, 2006
750
Jul 29, 2006
Jul 29, 2006
751
752
753
754
755
756
if ([nswindow isMiniaturized]) {
[nswindow deminiaturize:nil];
} else if ([nswindow isZoomed]) {
[nswindow zoom:nil];
}
[pool release];
Jul 24, 2006
Jul 24, 2006
757
758
}
Feb 11, 2011
Feb 11, 2011
759
void
Feb 16, 2011
Feb 16, 2011
760
Cocoa_SetWindowFullscreen(_THIS, SDL_Window * window, SDL_VideoDisplay * display, SDL_bool fullscreen)
Feb 11, 2011
Feb 11, 2011
761
762
763
764
765
766
{
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
SDL_WindowData *data = (SDL_WindowData *) window->driverdata;
NSWindow *nswindow = data->nswindow;
NSRect rect;
Feb 16, 2011
Feb 16, 2011
767
if (fullscreen) {
Feb 11, 2011
Feb 11, 2011
768
769
770
771
772
773
774
775
776
SDL_Rect bounds;
Cocoa_GetDisplayBounds(_this, display, &bounds);
rect.origin.x = bounds.x;
rect.origin.y = bounds.y;
rect.size.width = bounds.w;
rect.size.height = bounds.h;
ConvertNSRect(&rect);
Feb 20, 2011
Feb 20, 2011
777
778
779
if ([nswindow respondsToSelector: @selector(setStyleMask:)]) {
[nswindow performSelector: @selector(setStyleMask:) withObject: (id)NSBorderlessWindowMask];
}
Feb 12, 2011
Feb 12, 2011
780
[nswindow setFrameOrigin:rect.origin];
Feb 20, 2011
Feb 20, 2011
781
[nswindow setContentSize:rect.size];
Feb 11, 2011
Feb 11, 2011
782
} else {
Feb 20, 2011
Feb 20, 2011
783
784
785
if ([nswindow respondsToSelector: @selector(setStyleMask:)]) {
[nswindow performSelector: @selector(setStyleMask:) withObject: (id)GetWindowStyle(window)];
}
Feb 11, 2011
Feb 11, 2011
786
Feb 12, 2011
Feb 12, 2011
787
788
// This doesn't seem to do anything...
//[nswindow setFrameOrigin:origin];
Feb 11, 2011
Feb 11, 2011
789
790
791
}
#ifdef FULLSCREEN_TOGGLEABLE
Feb 16, 2011
Feb 16, 2011
792
if (fullscreen) {
Feb 11, 2011
Feb 11, 2011
793
794
795
796
797
798
799
800
801
802
803
/* OpenGL is rendering to the window, so make it visible! */
[nswindow setLevel:CGShieldingWindowLevel()];
} else {
[nswindow setLevel:kCGNormalWindowLevel];
}
#endif
[nswindow makeKeyAndOrderFront:nil];
[pool release];
}
Feb 21, 2011
Feb 21, 2011
804
NSPoint origin;
Jul 24, 2006
Jul 24, 2006
805
806
807
void
Cocoa_SetWindowGrab(_THIS, SDL_Window * window)
{
Feb 21, 2011
Feb 21, 2011
808
809
810
811
812
813
#ifdef RELATIVE_MOTION
/* FIXME: work in progress
You set relative mode by using the following code in conjunction with
CGDisplayHideCursor(kCGDirectMainDisplay) and
CGDisplayShowCursor(kCGDirectMainDisplay)
*/
Jul 24, 2006
Jul 24, 2006
814
815
if ((window->flags & SDL_WINDOW_INPUT_GRABBED) &&
(window->flags & SDL_WINDOW_INPUT_FOCUS)) {
Feb 21, 2011
Feb 21, 2011
816
CGAssociateMouseAndMouseCursorPosition(NO);
Jul 24, 2006
Jul 24, 2006
817
} else {
Feb 21, 2011
Feb 21, 2011
818
CGAssociateMouseAndMouseCursorPosition(YES);
Jul 24, 2006
Jul 24, 2006
819
}
Feb 21, 2011
Feb 21, 2011
820
821
822
823
824
825
826
827
828
829
830
831
832
#else
/* Move the cursor to the nearest point in the window */
if ((window->flags & SDL_WINDOW_INPUT_GRABBED) &&
(window->flags & SDL_WINDOW_INPUT_FOCUS)) {
int x, y;
CGPoint cgpoint;
SDL_GetMouseState(&x, &y);
cgpoint.x = window->x + x;
cgpoint.y = window->y + y;
CGDisplayMoveCursorToPoint(kCGDirectMainDisplay, cgpoint);
}
#endif
Jul 24, 2006
Jul 24, 2006
833
834
835
836
837
}
void
Cocoa_DestroyWindow(_THIS, SDL_Window * window)
{
Jul 25, 2006
Jul 25, 2006
838
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
Jul 24, 2006
Jul 24, 2006
839
840
841
842
843
844
SDL_WindowData *data = (SDL_WindowData *) window->driverdata;
if (data) {
[data->listener close];
[data->listener release];
if (data->created) {
Jan 21, 2010
Jan 21, 2010
845
[data->nswindow close];
Jul 24, 2006
Jul 24, 2006
846
847
848
}
SDL_free(data);
}
Jul 25, 2006
Jul 25, 2006
849
[pool release];
Jul 24, 2006
Jul 24, 2006
850
851
852
853
854
}
SDL_bool
Cocoa_GetWindowWMInfo(_THIS, SDL_Window * window, SDL_SysWMinfo * info)
{
Sep 27, 2010
Sep 27, 2010
855
NSWindow *nswindow = ((SDL_WindowData *) window->driverdata)->nswindow;
Jul 24, 2006
Jul 24, 2006
856
857
if (info->version.major <= SDL_MAJOR_VERSION) {
Sep 27, 2010
Sep 27, 2010
858
info->subsystem = SDL_SYSWM_COCOA;
Jan 21, 2011
Jan 21, 2011
859
info->info.cocoa.window = nswindow;
Jul 24, 2006
Jul 24, 2006
860
861
862
863
864
865
866
867
868
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: */