foxygit / doom Log in
commit 72b17f7b82b70cac0a12283b0b26b01e634c3728
Author:     Simon Howard <fraggle@gmail.com>
AuthorDate: Wed Mar 30 19:00:51 2011 +0000
Commit:     Simon Howard <fraggle@gmail.com>
CommitDate: Wed Mar 30 19:00:51 2011 +0000

    On OS X, display a dialog box when exiting with I_Error, like on
    Windows.

    Subversion-branch: /trunk/chocolate-doom
    Subversion-revision: 2317
---
 src/i_system.c | 43 +++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 43 insertions(+)

diff --git a/src/i_system.c b/src/i_system.c
index 4db97276..7d3687be 100644
--- a/src/i_system.c
+++ b/src/i_system.c
@@ -38,6 +38,8 @@
 #include <unistd.h>
 #endif

+#include "config.h"
+
 #include "deh_main.h"
 #include "doomdef.h"
 #include "doomstat.h"
@@ -59,6 +61,10 @@
 #include "w_wad.h"
 #include "z_zone.h"

+#ifdef __MACOSX__
+#include <CoreFoundation/CFUserNotification.h>
+#endif
+
 #define DEFAULT_RAM 16 /* MiB */
 #define MIN_RAM     4  /* MiB */

@@ -364,6 +370,43 @@ void I_Error (char *error, ...)
     }
 #endif

+#ifdef __MACOSX__
+    {
+        CFStringRef message;
+        char msgbuf[512];
+	int i;
+
+        va_start(argptr, error);
+        memset(msgbuf, 0, sizeof(msgbuf));
+        vsnprintf(msgbuf, sizeof(msgbuf) - 1, error, argptr);
+        va_end(argptr);
+
+	// The CoreFoundation message box wraps text lines, so replace
+	// newline characters with spaces so that multiline messages
+	// are continuous.
+
+	for (i = 0; msgbuf[i] != '\0'; ++i)
+        {
+            if (msgbuf[i] == '\n')
+            {
+                msgbuf[i] = ' ';
+            }
+        }
+
+        message = CFStringCreateWithCString(NULL, msgbuf,
+                                            kCFStringEncodingUTF8);
+
+        CFUserNotificationDisplayNotice(0,
+                                        kCFUserNotificationCautionAlertLevel,
+                                        NULL,
+                                        NULL,
+                                        NULL,
+                                        CFSTR(PACKAGE_STRING),
+                                        message,
+                                        NULL);
+    }
+#endif
+
     // abort();

     exit(-1);