Subversion Repositories Games.Rick Dangerous

Rev

Rev 11 | Blame | Compare with Previous | Last modification | View Log | Download | RSS feed

  1. /*
  2.  * src/system.c
  3.  *
  4.  * Copyright (C) 1998-2002 BigOrno (bigorno@bigorno.net). All rights reserved.
  5.  *
  6.  * The use and distribution terms for this software are contained in the file
  7.  * named README, which can be found in the root of this distribution. By
  8.  * using this software in any fashion, you are agreeing to be bound by the
  9.  * terms of this license.
  10.  *
  11.  * You must not remove this notice, or any other, from this software.
  12.  */
  13.  
  14. #include <SDL2/SDL.h>
  15.  
  16. #include <signal.h>
  17.  
  18. #include "system.h"
  19. #if defined(_WIN32)
  20. #include "windows.h"
  21. char *sys_getbasepath (void)
  22. {
  23.    static char app_path[1024] = "";
  24.    if (app_path[0] == 0)
  25.    {
  26.       GetModuleFileName (NULL, app_path, 1024);
  27.       if (strrchr (app_path, '\\') != NULL)
  28.          *strrchr (app_path, '\\') = 0;
  29.    }
  30.    return (app_path);
  31. }
  32. #define sys_getdatapath() sys_getbasepath ()
  33. #elif defined(__APPLE__)
  34. #include <CoreFoundation/CoreFoundation.h>
  35. #include <sys/types.h>
  36. #include <sys/stat.h>
  37. #include <unistd.h>
  38. #include <dlfcn.h>
  39. #include <pwd.h>
  40. void MessageBox (void *handle, char *msg, char *title, int buttons)
  41. {
  42.    const void *keys[2];
  43.    const void *values[2];
  44.    SInt32 result;
  45.  
  46.    if (title == NULL)
  47.       title = "";
  48.  
  49.    keys[0] = kCFUserNotificationAlertHeaderKey;
  50.    values[0] = CFStringCreateWithCString (kCFAllocatorDefault, title, kCFStringEncodingUTF8);;
  51.  
  52.    keys[1] = kCFUserNotificationAlertMessageKey;
  53.    values[1] = CFStringCreateWithCString (kCFAllocatorDefault, msg, kCFStringEncodingUTF8);
  54.  
  55.    result = 0;
  56.    CFUserNotificationCreate
  57.    (
  58.       kCFAllocatorDefault,
  59.       0,
  60.       kCFUserNotificationPlainAlertLevel,
  61.       &result,
  62.       CFDictionaryCreate
  63.       (
  64.          0,
  65.          keys,
  66.          values,
  67.          sizeof (keys) / sizeof (*keys),
  68.          &kCFTypeDictionaryKeyCallBacks,
  69.          &kCFTypeDictionaryValueCallBacks
  70.       )
  71.    );
  72. }
  73. #define MB_OK 0
  74. char *sys_getbasepath (void)
  75. {
  76.    static char app_path[1024] = "";
  77.    if (app_path[0] == 0)
  78.    {
  79.       Dl_info addr_info;
  80.       if (dladdr (sys_getbasepath, &addr_info) == 0)
  81.          return (".");
  82.       strcpy_s (app_path, 1024, addr_info.dli_fname);
  83.       if (strrchr (app_path, '/') != NULL)
  84.          *strrchr (app_path, '/') = 0;
  85.       if (strrchr (app_path, '/') != NULL)
  86.          *strrchr (app_path, '/') = 0;
  87.       strcat_s (app_path, 1024, "/Resources");
  88.    }
  89.    return (app_path);
  90. }
  91. char *sys_getdatapath (void)
  92. {
  93.    static char data_path[1024] = "";
  94.    if (data_path[0] == 0)
  95.    {
  96.       // Pierre-Marie Baty -- macOS .app fix
  97.       // peek in ~/Library/Application Support/<DOTTED BUNDLE ID>
  98.       // if the directory doesn't exist, create it
  99.       char bundle_id[256];
  100.       char *homedir = getenv ("HOME");
  101.       if (homedir == NULL)
  102.          homedir = getpwuid (getuid ())->pw_dir;
  103.       CFStringGetCString (CFBundleGetIdentifier (CFBundleGetMainBundle ()), bundle_id, sizeof (bundle_id), kCFStringEncodingUTF8);
  104.       sprintf (data_path, "%s/Library/Application Support/%s", homedir, bundle_id);
  105.       if (access (data_path, 0) != 0)
  106.          mkdir (data_path, 0755);
  107.    }
  108.    return (data_path);
  109. }
  110. #else // !_WIN32 && !__APPLE__
  111. #define MessageBox(handle,msg,title,btns) fprintf (stderr, msg)
  112. #define MB_OK 0
  113. char *sys_getbasepath (void)
  114. {
  115.    return (".");
  116. }
  117. #define sys_getdatapath() sys_getbasepath ()
  118. #endif // _WIN32 || __APPLE__
  119.  
  120.  
  121. /*
  122.  * Panic
  123.  */
  124. void sys_panic (char *err, ...)
  125. {
  126.    va_list argptr;
  127.    char s[1024];
  128.  
  129.    /* prepare message */
  130.    va_start (argptr, err);
  131.    vsprintf_s (s, sizeof (s), err, argptr);
  132.    va_end (argptr);
  133.  
  134.    /* print message and die */
  135.    MessageBox (NULL, s, NULL, MB_OK);
  136.    exit (1);
  137. }
  138.  
  139.  
  140. /*
  141.  * Print a message
  142.  */
  143. void sys_printf (char *msg, ...)
  144. {
  145.    va_list argptr;
  146.    char s[2048];
  147.  
  148.    /* prepare message */
  149.    va_start (argptr, msg);
  150.    vsprintf_s (s, sizeof (s), msg, argptr);
  151.    va_end (argptr);
  152.  
  153.    MessageBox (NULL, s, NULL, MB_OK);
  154. }
  155.  
  156.  
  157. /*
  158.  * Return number of microseconds elapsed since first call
  159.  */
  160. U32 sys_gettime (void)
  161. {
  162.    static U32 ticks_base = 0;
  163.    U32 ticks;
  164.  
  165.    ticks = SDL_GetTicks ();
  166.  
  167.    if (!ticks_base)
  168.       ticks_base = ticks;
  169.  
  170.    return ticks - ticks_base;
  171. }
  172.  
  173.  
  174. /*
  175.  * Sleep a number of microseconds
  176.  */
  177. void sys_sleep (int s)
  178. {
  179.    SDL_Delay (s);
  180. }
  181.  
  182.  
  183. /*
  184.  * Initialize system
  185.  */
  186. void sys_init (int argc, char **argv)
  187. {
  188.    sysarg_init (argc, argv);
  189.    sysvid_init ();
  190.    sysjoy_init ();
  191.  
  192.     if (sysarg_args_nosound == 0)
  193.       syssnd_init ();
  194.  
  195.    atexit (sys_shutdown);
  196.    signal (SIGINT, exit);
  197.    signal (SIGTERM, exit);
  198. }
  199.  
  200.  
  201. /*
  202.  * Shutdown system
  203.  */
  204. void sys_shutdown (void)
  205. {
  206.    syssnd_shutdown ();
  207.    sysjoy_shutdown ();
  208.    sysvid_shutdown ();
  209. }
  210.