From 617aeb0777722f2783a85b20e87e6d1442af910b Mon Sep 17 00:00:00 2001 From: Sam Lantinga Date: Tue, 30 Oct 2012 12:31:26 -0700 Subject: [PATCH] Added Cocoa message box implementation --- src/video/SDL_video.c | 10 +++- src/video/cocoa/SDL_cocoamessagebox.h | 29 +++++++++++ src/video/cocoa/SDL_cocoamessagebox.m | 72 +++++++++++++++++++++++++++ src/video/x11/SDL_x11messagebox.h | 28 +++++++++++ 4 files changed, 138 insertions(+), 1 deletion(-) create mode 100644 src/video/cocoa/SDL_cocoamessagebox.h create mode 100644 src/video/cocoa/SDL_cocoamessagebox.m create mode 100644 src/video/x11/SDL_x11messagebox.h diff --git a/src/video/SDL_video.c b/src/video/SDL_video.c index 254de9eec..f633069ef 100644 --- a/src/video/SDL_video.c +++ b/src/video/SDL_video.c @@ -2841,8 +2841,11 @@ SDL_IsScreenKeyboardShown(SDL_Window *window) return SDL_FALSE; } +#if SDL_VIDEO_DRIVER_COCOA +#include "cocoa/SDL_cocoamessagebox.h" +#endif #if SDL_VIDEO_DRIVER_X11 -extern int X11_ShowMessageBox(const SDL_MessageBoxData *messageboxdata, int *buttonid); +#include "x11/SDL_x11messagebox.h" #endif int @@ -2860,6 +2863,11 @@ SDL_ShowMessageBox(const SDL_MessageBoxData *messageboxdata, int *buttonid) } /* It's completely fine to call this function before video is initialized */ +#if SDL_VIDEO_DRIVER_COCOA + if (Cocoa_ShowMessageBox(messageboxdata, buttonid) == 0) { + return 0; + } +#endif #if SDL_VIDEO_DRIVER_X11 if (X11_ShowMessageBox(messageboxdata, buttonid) == 0) { return 0; diff --git a/src/video/cocoa/SDL_cocoamessagebox.h b/src/video/cocoa/SDL_cocoamessagebox.h new file mode 100644 index 000000000..4d639060f --- /dev/null +++ b/src/video/cocoa/SDL_cocoamessagebox.h @@ -0,0 +1,29 @@ +/* + Simple DirectMedia Layer + Copyright (C) 1997-2012 Sam Lantinga + + 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 + +extern int Cocoa_ShowMessageBox(const SDL_MessageBoxData *messageboxdata, int *buttonid); + +#endif /* SDL_VIDEO_DRIVER_COCOA */ + +/* vi: set ts=4 sw=4 expandtab: */ diff --git a/src/video/cocoa/SDL_cocoamessagebox.m b/src/video/cocoa/SDL_cocoamessagebox.m new file mode 100644 index 000000000..c947a66f4 --- /dev/null +++ b/src/video/cocoa/SDL_cocoamessagebox.m @@ -0,0 +1,72 @@ +/* + Simple DirectMedia Layer + Copyright (C) 1997-2012 Sam Lantinga + + 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 + +#include "SDL.h" +#include "SDL_cocoavideo.h" + + +/* Display a Cocoa message box */ +int +Cocoa_ShowMessageBox(const SDL_MessageBoxData *messageboxdata, int *buttonid) +{ + NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; + + NSAlert* alert = [[NSAlert alloc] init]; + + 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 alloc] initWithUTF8String:messageboxdata->title]]; + [alert setInformativeText:[[NSString alloc] initWithUTF8String:messageboxdata->message]]; + + const SDL_MessageBoxButtonData *buttons = messageboxdata->buttons; + int i; + for (i = 0; i < messageboxdata->numbuttons; ++i) { + NSButton *button = [alert addButtonWithTitle:[[NSString alloc] initWithUTF8String: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"]; + } else { + [button setKeyEquivalent:@""]; + } + } + + NSInteger clicked = [alert runModal]; + clicked -= NSAlertFirstButtonReturn; + *buttonid = buttons[clicked].buttonid; + + [pool release]; + + return 0; +} + +#endif /* SDL_VIDEO_DRIVER_COCOA */ + +/* vi: set ts=4 sw=4 expandtab: */ diff --git a/src/video/x11/SDL_x11messagebox.h b/src/video/x11/SDL_x11messagebox.h new file mode 100644 index 000000000..6f01c1d1d --- /dev/null +++ b/src/video/x11/SDL_x11messagebox.h @@ -0,0 +1,28 @@ +/* + Simple DirectMedia Layer + Copyright (C) 1997-2012 Sam Lantinga + + 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. +*/ + +#if SDL_VIDEO_DRIVER_X11 + +extern int X11_ShowMessageBox(const SDL_MessageBoxData *messageboxdata, int *buttonid); + +#endif /* SDL_VIDEO_DRIVER_X11 */ + +/* vi: set ts=4 sw=4 expandtab: */