Subversion Repositories Games.Descent

Rev

Blame | Last modification | View Log | Download | RSS feed

  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. }
  100.