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

Latest commit

 

History

History
145 lines (118 loc) · 4.41 KB

SDL_cocoamessagebox.m

File metadata and controls

145 lines (118 loc) · 4.41 KB
 
1
2
/*
Simple DirectMedia Layer
Feb 15, 2013
Feb 15, 2013
3
Copyright (C) 1997-2013 Sam Lantinga <slouken@libsdl.org>
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
This software is provided 'as-is', without any express or implied
warranty. In no event will the authors be held liable for any damages
arising from the use of this software.
Permission is granted to anyone to use this software for any purpose,
including commercial applications, and to alter it and redistribute it
freely, subject to the following restrictions:
1. The origin of this software must not be misrepresented; you must not
claim that you wrote the original software. If you use this software
in a product, an acknowledgment in the product documentation would be
appreciated but is not required.
2. Altered source versions must be plainly marked as such, and must not be
misrepresented as being the original software.
3. This notice may not be removed or altered from any source distribution.
*/
#include "SDL_config.h"
#if SDL_VIDEO_DRIVER_COCOA
May 3, 2013
May 3, 2013
25
#if defined(__APPLE__) && defined(__POWERPC__) && !defined(__APPLE_ALTIVEC__)
26
27
28
29
30
31
#include <altivec.h>
#undef bool
#undef vector
#undef pixel
#endif
Jul 14, 2013
Jul 14, 2013
32
33
#include "SDL_events.h"
#include "SDL_timer.h"
34
35
36
#include "SDL_messagebox.h"
#include "SDL_cocoavideo.h"
Apr 23, 2013
Apr 23, 2013
37
38
39
@interface SDLMessageBoxPresenter : NSObject {
@public
NSInteger clicked;
Jul 14, 2013
Jul 14, 2013
40
NSWindow *nswindow;
Apr 23, 2013
Apr 23, 2013
41
}
Jul 14, 2013
Jul 14, 2013
42
43
- (id) initWithParentWindow:(SDL_Window *)window;
- (void) alertDidEnd:(NSAlert *)alert returnCode:(NSInteger)returnCode contextInfo:(void *)contextInfo;
Apr 23, 2013
Apr 23, 2013
44
45
46
@end
@implementation SDLMessageBoxPresenter
Jul 14, 2013
Jul 14, 2013
47
- (id) initWithParentWindow:(SDL_Window *)window
Apr 23, 2013
Apr 23, 2013
48
49
50
51
{
self = [super init];
if (self) {
clicked = -1;
Jul 14, 2013
Jul 14, 2013
52
53
54
55
56
57
58
/* Retain the NSWindow because we'll show the alert later on the main thread */
if (window) {
nswindow = [((SDL_WindowData *) window->driverdata)->nswindow retain];
} else {
nswindow = NULL;
}
Apr 23, 2013
Apr 23, 2013
59
60
61
62
63
64
65
}
return self;
}
- (void)showAlert:(NSAlert*)alert
{
Jul 14, 2013
Jul 14, 2013
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
if (nswindow) {
[alert beginSheetModalForWindow:nswindow modalDelegate:self didEndSelector:@selector(alertDidEnd:returnCode:contextInfo:) contextInfo:nil];
while (clicked < 0) {
SDL_PumpEvents();
SDL_Delay(100);
}
[nswindow release];
} else {
clicked = [alert runModal];
}
}
- (void) alertDidEnd:(NSAlert *)alert returnCode:(NSInteger)returnCode contextInfo:(void *)contextInfo
{
clicked = returnCode;
Apr 23, 2013
Apr 23, 2013
81
}
Jul 14, 2013
Jul 14, 2013
82
Apr 23, 2013
Apr 23, 2013
83
84
@end
85
86
87
88
89
90
91
/* Display a Cocoa message box */
int
Cocoa_ShowMessageBox(const SDL_MessageBoxData *messageboxdata, int *buttonid)
{
Cocoa_RegisterApp();
Feb 12, 2013
Feb 12, 2013
92
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
Apr 23, 2013
Apr 23, 2013
94
NSAlert* alert = [[[NSAlert alloc] init] autorelease];
Feb 12, 2013
Feb 12, 2013
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
if (messageboxdata->flags & SDL_MESSAGEBOX_ERROR) {
[alert setAlertStyle:NSCriticalAlertStyle];
} else if (messageboxdata->flags & SDL_MESSAGEBOX_WARNING) {
[alert setAlertStyle:NSWarningAlertStyle];
} else {
[alert setAlertStyle:NSInformationalAlertStyle];
}
[alert setMessageText:[NSString stringWithUTF8String:messageboxdata->title]];
[alert setInformativeText:[NSString stringWithUTF8String:messageboxdata->message]];
const SDL_MessageBoxButtonData *buttons = messageboxdata->buttons;
int i;
for (i = 0; i < messageboxdata->numbuttons; ++i) {
NSButton *button = [alert addButtonWithTitle:[NSString stringWithUTF8String:buttons[i].text]];
if (buttons[i].flags & SDL_MESSAGEBOX_BUTTON_RETURNKEY_DEFAULT) {
[button setKeyEquivalent:@"\r"];
} else if (buttons[i].flags & SDL_MESSAGEBOX_BUTTON_ESCAPEKEY_DEFAULT) {
[button setKeyEquivalent:@"\033"];
Feb 12, 2013
Feb 12, 2013
116
[button setKeyEquivalent:@""];
Feb 12, 2013
Feb 12, 2013
118
}
Jul 14, 2013
Jul 14, 2013
120
SDLMessageBoxPresenter* presenter = [[[SDLMessageBoxPresenter alloc] initWithParentWindow:messageboxdata->window] autorelease];
Apr 23, 2013
Apr 23, 2013
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
[presenter performSelectorOnMainThread:@selector(showAlert:)
withObject:alert
waitUntilDone:YES];
int returnValue = 0;
NSInteger clicked = presenter->clicked;
if (clicked >= NSAlertFirstButtonReturn)
{
clicked -= NSAlertFirstButtonReturn;
*buttonid = buttons[clicked].buttonid;
}
else
{
returnValue = SDL_SetError("Did not get a valid `clicked button' id: %d", clicked);
}
Feb 12, 2013
Feb 12, 2013
138
[pool release];
Apr 23, 2013
Apr 23, 2013
140
return returnValue;
141
142
143
144
145
}
#endif /* SDL_VIDEO_DRIVER_COCOA */
/* vi: set ts=4 sw=4 expandtab: */