SDL  2.0
SDL_cocoamessagebox.m
Go to the documentation of this file.
1 /*
2  Simple DirectMedia Layer
3  Copyright (C) 1997-2020 Sam Lantinga <slouken@libsdl.org>
4 
5  This software is provided 'as-is', without any express or implied
6  warranty. In no event will the authors be held liable for any damages
7  arising from the use of this software.
8 
9  Permission is granted to anyone to use this software for any purpose,
10  including commercial applications, and to alter it and redistribute it
11  freely, subject to the following restrictions:
12 
13  1. The origin of this software must not be misrepresented; you must not
14  claim that you wrote the original software. If you use this software
15  in a product, an acknowledgment in the product documentation would be
16  appreciated but is not required.
17  2. Altered source versions must be plainly marked as such, and must not be
18  misrepresented as being the original software.
19  3. This notice may not be removed or altered from any source distribution.
20 */
21 #include "../../SDL_internal.h"
22 
23 #if SDL_VIDEO_DRIVER_COCOA
24 
25 #include "SDL_events.h"
26 #include "SDL_timer.h"
27 #include "SDL_messagebox.h"
28 #include "SDL_cocoavideo.h"
29 
30 @interface SDLMessageBoxPresenter : NSObject {
31 @public
32  NSInteger clicked;
33  NSWindow *nswindow;
34 }
35 - (id) initWithParentWindow:(SDL_Window *)window;
36 - (void) alertDidEnd:(NSAlert *)alert returnCode:(NSInteger)returnCode contextInfo:(void *)contextInfo;
37 @end
38 
39 @implementation SDLMessageBoxPresenter
40 - (id) initWithParentWindow:(SDL_Window *)window
41 {
42  self = [super init];
43  if (self) {
44  clicked = -1;
45 
46  /* Retain the NSWindow because we'll show the alert later on the main thread */
47  if (window) {
48  nswindow = [((SDL_WindowData *) window->driverdata)->nswindow retain];
49  } else {
50  nswindow = NULL;
51  }
52  }
53 
54  return self;
55 }
56 
57 - (void)showAlert:(NSAlert*)alert
58 {
59  if (nswindow) {
60 #ifdef MAC_OS_X_VERSION_10_9
61  if ([alert respondsToSelector:@selector(beginSheetModalForWindow:completionHandler:)]) {
62  [alert beginSheetModalForWindow:nswindow completionHandler:^(NSModalResponse returnCode) {
63  clicked = returnCode;
64  }];
65  } else
66 #endif
67  {
68 #if MAC_OS_X_VERSION_MIN_REQUIRED < 1090
69  [alert beginSheetModalForWindow:nswindow modalDelegate:self didEndSelector:@selector(alertDidEnd:returnCode:contextInfo:) contextInfo:nil];
70 #endif
71  }
72 
73  while (clicked < 0) {
75  SDL_Delay(100);
76  }
77 
78  [nswindow release];
79  } else {
80  clicked = [alert runModal];
81  }
82 }
83 
84 - (void) alertDidEnd:(NSAlert *)alert returnCode:(NSInteger)returnCode contextInfo:(void *)contextInfo
85 {
86  clicked = returnCode;
87 }
88 
89 @end
90 
91 
92 /* Display a Cocoa message box */
93 int
94 Cocoa_ShowMessageBox(const SDL_MessageBoxData *messageboxdata, int *buttonid)
95 { @autoreleasepool
96 {
98 
99  NSAlert* alert = [[[NSAlert alloc] init] autorelease];
100 
101  if (messageboxdata->flags & SDL_MESSAGEBOX_ERROR) {
102  [alert setAlertStyle:NSAlertStyleCritical];
103  } else if (messageboxdata->flags & SDL_MESSAGEBOX_WARNING) {
104  [alert setAlertStyle:NSAlertStyleWarning];
105  } else {
106  [alert setAlertStyle:NSAlertStyleInformational];
107  }
108 
109  [alert setMessageText:[NSString stringWithUTF8String:messageboxdata->title]];
110  [alert setInformativeText:[NSString stringWithUTF8String:messageboxdata->message]];
111 
112  const SDL_MessageBoxButtonData *buttons = messageboxdata->buttons;
113  int i;
114  for (i = 0; i < messageboxdata->numbuttons; ++i) {
115  const SDL_MessageBoxButtonData *sdlButton;
116  NSButton *button;
117 
118  if (messageboxdata->flags & SDL_MESSAGEBOX_BUTTONS_RIGHT_TO_LEFT) {
119  sdlButton = &messageboxdata->buttons[messageboxdata->numbuttons - 1 - i];
120  } else {
121  sdlButton = &messageboxdata->buttons[i];
122  }
123 
124  button = [alert addButtonWithTitle:[NSString stringWithUTF8String:sdlButton->text]];
126  [button setKeyEquivalent:@"\r"];
127  } else if (sdlButton->flags & SDL_MESSAGEBOX_BUTTON_ESCAPEKEY_DEFAULT) {
128  [button setKeyEquivalent:@"\033"];
129  } else {
130  [button setKeyEquivalent:@""];
131  }
132  }
133 
134  SDLMessageBoxPresenter* presenter = [[[SDLMessageBoxPresenter alloc] initWithParentWindow:messageboxdata->window] autorelease];
135 
136  [presenter performSelectorOnMainThread:@selector(showAlert:)
137  withObject:alert
138  waitUntilDone:YES];
139 
140  int returnValue = 0;
141  NSInteger clicked = presenter->clicked;
142  if (clicked >= NSAlertFirstButtonReturn) {
143  clicked -= NSAlertFirstButtonReturn;
144  if (messageboxdata->flags & SDL_MESSAGEBOX_BUTTONS_RIGHT_TO_LEFT) {
145  clicked = messageboxdata->numbuttons - 1 - clicked;
146  }
147  *buttonid = buttons[clicked].buttonid;
148  } else {
149  returnValue = SDL_SetError("Did not get a valid `clicked button' id: %ld", (long)clicked);
150  }
151 
152  return returnValue;
153 }}
154 
155 #endif /* SDL_VIDEO_DRIVER_COCOA */
156 
157 /* vi: set ts=4 sw=4 expandtab: */
SDL_events.h
SDL_MESSAGEBOX_BUTTON_ESCAPEKEY_DEFAULT
@ SDL_MESSAGEBOX_BUTTON_ESCAPEKEY_DEFAULT
Definition: SDL_messagebox.h:52
if
set set set set set set set macro pixldst1 abits if abits op else op endif endm macro pixldst2 abits if abits op else op endif endm macro pixldst4 abits if abits op else op endif endm macro pixldst0 abits op endm macro pixldst3 mem_operand op endm macro pixldst30 mem_operand op endm macro pixldst abits if abits elseif abits elseif abits elseif abits elseif abits pixldst0 abits else pixldst0 abits pixldst0 abits pixldst0 abits pixldst0 abits endif elseif abits else pixldst0 abits pixldst0 abits endif elseif abits else error unsupported bpp *numpix else pixst endif endm macro pixld1_s mem_operand if asr adds SRC_WIDTH_FIXED bpl add asl mov asr adds SRC_WIDTH_FIXED bpl add asl mov asr adds SRC_WIDTH_FIXED bpl add asl mov asr adds SRC_WIDTH_FIXED bpl add asl elseif asr adds SRC_WIDTH_FIXED bpl add asl mov asr adds SRC_WIDTH_FIXED bpl add asl else error unsupported endif endm macro pixld2_s mem_operand if mov asr add asl add asl mov asr sub UNIT_X add asl mov asr add asl add asl mov asr add UNIT_X add asl else pixld1_s mem_operand pixld1_s mem_operand endif endm macro pixld0_s mem_operand if asr adds SRC_WIDTH_FIXED bpl add asl elseif asr adds SRC_WIDTH_FIXED bpl add asl endif endm macro pixld_s_internal mem_operand if mem_operand pixld2_s mem_operand pixdeinterleave basereg elseif mem_operand elseif mem_operand elseif mem_operand elseif mem_operand pixld0_s mem_operand else pixld0_s mem_operand pixld0_s mem_operand pixld0_s mem_operand pixld0_s mem_operand endif elseif mem_operand else pixld0_s mem_operand pixld0_s mem_operand endif elseif mem_operand else error unsupported mem_operand if bpp mem_operand endif endm macro vuzp8 reg2 vuzp d d &reg2 endm macro vzip8 reg2 vzip d d &reg2 endm macro pixdeinterleave basereg basereg basereg basereg basereg endif endm macro pixinterleave basereg basereg basereg basereg basereg endif endm macro PF boost_increment endif if endif PF tst PF addne PF subne PF cmp ORIG_W if endif if endif if endif PF subge ORIG_W PF subges if endif if endif if endif endif endm macro cache_preload_simple endif if dst_r_bpp pld[DST_R, #(PREFETCH_DISTANCE_SIMPLE *dst_r_bpp/8)] endif if mask_bpp pld if[MASK, #(PREFETCH_DISTANCE_SIMPLE *mask_bpp/8)] endif endif endm macro fetch_mask_pixblock pixld mask_basereg pixblock_size MASK endm macro ensure_destination_ptr_alignment process_pixblock_tail_head if beq irp skip1(dst_w_bpp<=(lowbit *8)) &&((lowbit *8)<(pixblock_size *dst_w_bpp)) .if lowbit< 16 tst DST_R
Definition: pixman-arm-neon-asm.h:469
NULL
#define NULL
Definition: begin_code.h:167
SDL_timer.h
SDL_WindowData
Definition: SDL_androidwindow.h:39
SDL_messagebox.h
SDL_MESSAGEBOX_WARNING
@ SDL_MESSAGEBOX_WARNING
Definition: SDL_messagebox.h:40
SDL_MessageBoxButtonData::flags
Uint32 flags
Definition: SDL_messagebox.h:60
SDL_cocoavideo.h
SDL_PumpEvents
#define SDL_PumpEvents
Definition: SDL_dynapi_overrides.h:116
SDL_Window
The type used to identify a window.
Definition: SDL_sysvideo.h:75
SDL_MESSAGEBOX_BUTTONS_RIGHT_TO_LEFT
@ SDL_MESSAGEBOX_BUTTONS_RIGHT_TO_LEFT
Definition: SDL_messagebox.h:43
window
EGLSurface EGLNativeWindowType * window
Definition: eglext.h:1025
SDL_MessageBoxData::flags
Uint32 flags
Definition: SDL_messagebox.h:96
SDL_MessageBoxData
MessageBox structure containing title, text, window, etc.
Definition: SDL_messagebox.h:95
SDL_MESSAGEBOX_ERROR
@ SDL_MESSAGEBOX_ERROR
Definition: SDL_messagebox.h:39
SDL_MessageBoxButtonData
Individual button data.
Definition: SDL_messagebox.h:59
SDL_Delay
#define SDL_Delay
Definition: SDL_dynapi_overrides.h:486
id
GLuint id
Definition: SDL_opengl_glext.h:531
SDL_MessageBoxData::buttons
const SDL_MessageBoxButtonData * buttons
Definition: SDL_messagebox.h:102
Cocoa_RegisterApp
void Cocoa_RegisterApp(void)
SDL_MESSAGEBOX_BUTTON_RETURNKEY_DEFAULT
@ SDL_MESSAGEBOX_BUTTON_RETURNKEY_DEFAULT
Definition: SDL_messagebox.h:51
SDL_SetError
#define SDL_SetError
Definition: SDL_dynapi_overrides.h:30
SDL_MessageBoxButtonData::text
const char * text
Definition: SDL_messagebox.h:62
void
SDL_PRINTF_FORMAT_STRING const char int SDL_PRINTF_FORMAT_STRING const char int SDL_PRINTF_FORMAT_STRING const char int SDL_PRINTF_FORMAT_STRING const char const char SDL_SCANF_FORMAT_STRING const char return SDL_ThreadFunction const char void return Uint32 return Uint32 void
Definition: SDL_dynapi_procs.h:89
button
SDL_Texture * button
Definition: testgamecontroller.c:67
SDL_MessageBoxData::numbuttons
int numbuttons
Definition: SDL_messagebox.h:101
i
return Display return Display Bool Bool int int int return Display XEvent Bool(*) XPointer return Display return Display Drawable _Xconst char unsigned int unsigned int return Display Pixmap Pixmap XColor XColor unsigned int unsigned int return Display _Xconst char char int char return Display Visual unsigned int int int char unsigned int unsigned int in i)
Definition: SDL_x11sym.h:50