Subversion Repositories Games.Descent

Rev

Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
1 pmbaty 1
/*
2
 * This file is part of the DXX-Rebirth project <https://www.dxx-rebirth.com/>.
3
 * It is copyright by its individual contributors, as recorded in the
4
 * project's Git history.  See COPYING.txt at the top level for license
5
 * terms and a link to the Git history.
6
 */
7
/*
8
 *  messagebox.c
9
 *  d1x-rebirth
10
 *
11
 *  Display an error or warning messagebox using the OS's window server.
12
 *
13
 */
14
 
15
#ifdef __APPLE__
16
#include <Carbon/Carbon.h>
17
#else
18
#include <Carbon.h>
19
#endif
20
 
21
#include "window.h"
22
#include "event.h"
23
#include "messagebox.h"
24
 
25
void display_mac_alert(const char *message, int error)
26
{
27
        window  *wind;
28
        d_event event;
29
        int             fullscreen;
30
        bool    osX = FALSE;
31
        uint    response;
32
        int16_t itemHit;
33
 
34
        // Handle Descent's windows properly
35
        if ((wind = window_get_front()))
36
                WINDOW_SEND_EVENT(wind, EVENT_WINDOW_DEACTIVATED);
37
 
38
        if (grd_curscreen && (fullscreen = gr_check_fullscreen()))
39
                gr_toggle_fullscreen();
40
 
41
        osX = ( Gestalt(gestaltSystemVersion, (long *) &response) == noErr)
42
                && (response >= 0x01000 );
43
 
44
    ShowCursor();
45
 
46
        if (osX)
47
        {
48
#ifdef TARGET_API_MAC_CARBON
49
                DialogRef       alert;
50
                CFStringRef     error_text = CFSTR("Sorry, a critical error has occurred.");
51
                CFStringRef     text = NULL;
52
 
53
                text = CFStringCreateWithCString(CFAllocatorGetDefault(), message, kCFStringEncodingMacRoman);
54
                if (!text)
55
                {
56
                        if (wind) WINDOW_SEND_EVENT(wind, EVENT_WINDOW_ACTIVATED);
57
                        return;
58
                }
59
 
60
                if (CreateStandardAlert(error ? kAlertStopAlert : kAlertNoteAlert, error ? error_text : text, error ? text : NULL, 0, &alert) != noErr)
61
                {
62
                        CFRelease(text);
63
                        if (wind) WINDOW_SEND_EVENT(wind, EVENT_WINDOW_ACTIVATED);
64
                        return;
65
                }
66
 
67
                RunStandardAlert(alert, 0, &itemHit);
68
                CFRelease(text);
69
#endif
70
        }
71
        else
72
        {
73
                // This #if guard removes both compiler warnings
74
                // and complications if we didn't link the (older) Mac OS X SDK that actually supports the following.
75
#if !defined(MAC_OS_X_VERSION_MAX_ALLOWED) || (MAC_OS_X_VERSION_MAX_ALLOWED < MAC_OS_X_VERSION_10_4)
76
                Str255  error_text = "\pSorry, a critical error has occurred.";
77
                Str255  text;
78
 
79
                CopyCStringToPascal(message, text);
80
                StandardAlert(error ? kAlertStopAlert : kAlertNoteAlert, error ? error_text : text, error ? text : NULL, 0, &itemHit);
81
#endif
82
        }
83
 
84
        if ((wind = window_get_front()))
85
                WINDOW_SEND_EVENT(wind, EVENT_WINDOW_ACTIVATED);
86
 
87
        if (grd_curscreen && !error && fullscreen)
88
                gr_toggle_fullscreen();
89
}
90
 
91
void msgbox_warning(const char *message)
92
{
93
        display_mac_alert(message, 0);
94
}
95
 
96
void msgbox_error(const char *message)
97
{
98
        display_mac_alert(message, 1);
99
}