rnd-20131212-1-src
[rocksndiamonds.git] / src / libgame / system.c
index 51e8df8905b2a0f1e70e6a43e92bb0a12c5c9174..988a97fae17f47e8b2d44deafc2a1f68e7d58836 100644 (file)
@@ -59,6 +59,9 @@ DrawBuffer           *drawto = NULL;
 
 int                    button_status = MB_NOT_PRESSED;
 boolean                        motion_status = FALSE;
+#if defined(TARGET_SDL2)
+boolean                        keyrepeat_status = TRUE;
+#endif
 
 int                    redraw_mask = REDRAW_NONE;
 int                    redraw_tiles = 0;
@@ -105,6 +108,11 @@ void InitProgramInfo(char *argv0,
   program.error_file = stderr;
 }
 
+void InitExitMessageFunction(void (*exit_message_function)(char *, va_list))
+{
+  program.exit_message_function = exit_message_function;
+}
+
 void InitExitFunction(void (*exit_function)(int))
 {
   program.exit_function = exit_function;
@@ -121,6 +129,9 @@ void InitExitFunction(void (*exit_function)(int))
 
 void InitPlatformDependentStuff(void)
 {
+  // this is initialized in GetOptions(), but may already be used before
+  options.verbose = TRUE;
+
 #if defined(PLATFORM_MSDOS)
   _fmode = O_BINARY;
 #endif
@@ -129,12 +140,22 @@ void InitPlatformDependentStuff(void)
   updateUserGameDataDir();
 #endif
 
+#if 1
+  openErrorFile();
+#else
 #if !defined(PLATFORM_UNIX) || defined(PLATFORM_MACOSX)
   openErrorFile();
 #endif
+#endif
 
 #if defined(TARGET_SDL)
-  if (SDL_Init(SDL_INIT_EVENTTHREAD | SDL_INIT_NOPARACHUTE) < 0)
+#if defined(TARGET_SDL2)
+  int sdl_init_flags = SDL_INIT_EVENTS      | SDL_INIT_NOPARACHUTE;
+#else
+  int sdl_init_flags = SDL_INIT_EVENTTHREAD | SDL_INIT_NOPARACHUTE;
+#endif
+
+  if (SDL_Init(sdl_init_flags) < 0)
     Error(ERR_EXIT, "SDL_Init() failed: %s", SDL_GetError());
 
   SDLNet_Init();
@@ -685,14 +706,17 @@ void BlitBitmap(Bitmap *src_bitmap, Bitmap *dst_bitmap,
     height = dst_bitmap->height - dst_y;
 #endif
 
-#if 0
+#if 1
+  /* !!! 2013-12-11: An "old friend" is back. Same bug in SDL2 2.0.1 !!! */
+#if 1
   /* !!! 2009-03-30: Fixed by using self-compiled, patched SDL.dll !!! */
   /* (This bug still exists in the actual (as of 2009-06-15) version 1.2.13,
      but is already fixed in SVN and should therefore finally be fixed with
      the next official SDL release, which is probably version 1.2.14.) */
 #if 1
   /* !!! 2009-03-24: It seems that this problem still exists in 1.2.12 !!! */
-#if defined(TARGET_SDL) && defined(PLATFORM_WIN32)
+  //#if defined(TARGET_SDL) && defined(PLATFORM_WIN32)
+#if defined(TARGET_SDL2)
   if (src_bitmap == dst_bitmap)
   {
     /* !!! THIS IS A BUG (IN THE SDL LIBRARY?) AND SHOULD BE FIXED !!! */
@@ -737,6 +761,7 @@ void BlitBitmap(Bitmap *src_bitmap, Bitmap *dst_bitmap,
 #endif
 #endif
 #endif
+#endif
 
 #if 0
   if (dst_x < gfx.sx + gfx.sxsize)
@@ -997,7 +1022,7 @@ Pixel GetPixelFromRGBcompact(Bitmap *bitmap, unsigned int color)
 /* execute all pending screen drawing operations */
 void FlushDisplay(void)
 {
-#ifndef TARGET_SDL
+#if !defined(TARGET_SDL)
   XFlush(display);
 #endif
 }
@@ -1005,7 +1030,7 @@ void FlushDisplay(void)
 /* execute and wait for all pending screen drawing operations */
 void SyncDisplay(void)
 {
-#ifndef TARGET_SDL
+#if !defined(TARGET_SDL)
   XSync(display, FALSE);
 #endif
 }
@@ -1013,9 +1038,13 @@ void SyncDisplay(void)
 void KeyboardAutoRepeatOn(void)
 {
 #if defined(TARGET_SDL)
+#if defined(TARGET_SDL2)
+  keyrepeat_status = TRUE;
+#else
   SDL_EnableKeyRepeat(SDL_DEFAULT_REPEAT_DELAY / 2,
                      SDL_DEFAULT_REPEAT_INTERVAL / 2);
   SDL_EnableUNICODE(1);
+#endif
 #else
   if (display)
     XAutoRepeatOn(display);
@@ -1025,8 +1054,12 @@ void KeyboardAutoRepeatOn(void)
 void KeyboardAutoRepeatOff(void)
 {
 #if defined(TARGET_SDL)
+#if defined(TARGET_SDL2)
+  keyrepeat_status = FALSE;
+#else
   SDL_EnableKeyRepeat(0, SDL_DEFAULT_REPEAT_INTERVAL);
   SDL_EnableUNICODE(0);
+#endif
 #else
   if (display)
     XAutoRepeatOff(display);
@@ -1279,11 +1312,11 @@ static void CreateScaledBitmaps(Bitmap *old_bitmap, int zoom_factor,
     if (old_bitmap->surface_masked)
       SDL_FreeSurface(old_bitmap->surface_masked);
 
-    SDL_SetColorKey(tmp_surface_1, SDL_SRCCOLORKEY,
+    SDL_SetColorKey(tmp_surface_1, SET_TRANSPARENT_PIXEL,
                    SDL_MapRGB(tmp_surface_1->format, 0x00, 0x00, 0x00));
     if ((old_bitmap->surface_masked = SDL_DisplayFormat(tmp_surface_1)) ==NULL)
       Error(ERR_EXIT, "SDL_DisplayFormat() failed");
-    SDL_SetColorKey(tmp_surface_1, 0, 0);      /* reset transparent pixel */
+    SDL_SetColorKey(tmp_surface_1, UNSET_TRANSPARENT_PIXEL, 0);
 #endif
   }
 #endif
@@ -1370,11 +1403,11 @@ static void CreateScaledBitmaps(Bitmap *old_bitmap, int zoom_factor,
     if (old_bitmap->surface_masked)
       SDL_FreeSurface(old_bitmap->surface_masked);
 
-    SDL_SetColorKey(old_surface, SDL_SRCCOLORKEY,
+    SDL_SetColorKey(old_surface, SET_TRANSPARENT_PIXEL,
                    SDL_MapRGB(old_surface->format, 0x00, 0x00, 0x00));
     if ((old_bitmap->surface_masked = SDL_DisplayFormat(old_surface)) ==NULL)
       Error(ERR_EXIT, "SDL_DisplayFormat() failed");
-    SDL_SetColorKey(old_surface, 0, 0);                /* reset transparent pixel */
+    SDL_SetColorKey(old_surface, UNSET_TRANSPARENT_PIXEL, 0);
 #endif
   }
 #endif
@@ -1612,10 +1645,14 @@ void SetAudioMode(boolean enabled)
 
 void InitEventFilter(EventFilter filter_function)
 {
-#if defined(TARGET_SDL)
   /* set event filter to filter out certain events */
+#if defined(TARGET_SDL)
+#if defined(TARGET_SDL2)
+  SDL_SetEventFilter(filter_function, NULL);
+#else
   SDL_SetEventFilter(filter_function);
 #endif
+#endif
 }
 
 boolean PendingEvent(void)
@@ -1639,7 +1676,11 @@ void NextEvent(Event *event)
 void PeekEvent(Event *event)
 {
 #if defined(TARGET_SDL)
+#if defined(TARGET_SDL2)
+  SDL_PeepEvents(event, 1, SDL_PEEKEVENT, SDL_FIRSTEVENT, SDL_LASTEVENT);
+#else
   SDL_PeepEvents(event, 1, SDL_PEEKEVENT, SDL_ALLEVENTS);
+#endif
 #else
   XPeekEvent(display, event);
 #endif
@@ -1648,6 +1689,10 @@ void PeekEvent(Event *event)
 Key GetEventKey(KeyEvent *event, boolean with_modifiers)
 {
 #if defined(TARGET_SDL)
+#if defined(TARGET_SDL2)
+  /* key up/down events in SDL2 do not return text characters anymore */
+  return event->keysym.sym;
+#else
 
 #if 0
   printf("unicode == '%d', sym == '%d', mod == '0x%04x'\n",
@@ -1663,6 +1708,7 @@ Key GetEventKey(KeyEvent *event, boolean with_modifiers)
   else
     return event->keysym.sym;
 
+#endif
 #else
 
 #if 0