rnd-20030208-3-src
[rocksndiamonds.git] / src / screens.c
index 6e2948aae75a0fb85ca75e62a408d2c7acee2494..830834d85cb6884341295781b1aed872d6d64344 100644 (file)
 /* screens in the setup menu */
 #define SETUP_MODE_MAIN                        0
 #define SETUP_MODE_GAME                        1
-#define SETUP_MODE_INPUT               2
-#define SETUP_MODE_SHORTCUT            3
-#define SETUP_MODE_GRAPHICS            4
-#define SETUP_MODE_SOUND               5
-#define SETUP_MODE_ARTWORK             6
-#define SETUP_MODE_CHOOSE_GRAPHICS     7
-#define SETUP_MODE_CHOOSE_SOUNDS       8
-#define SETUP_MODE_CHOOSE_MUSIC                9
-
-#define MAX_SETUP_MODES                        10
+#define SETUP_MODE_EDITOR              2
+#define SETUP_MODE_INPUT               3
+#define SETUP_MODE_SHORTCUT            4
+#define SETUP_MODE_GRAPHICS            5
+#define SETUP_MODE_SOUND               6
+#define SETUP_MODE_ARTWORK             7
+#define SETUP_MODE_CHOOSE_GRAPHICS     8
+#define SETUP_MODE_CHOOSE_SOUNDS       9
+#define SETUP_MODE_CHOOSE_MUSIC                10
+
+#define MAX_SETUP_MODES                        11
 
 /* for input setup functions */
 #define SETUPINPUT_SCREEN_POS_START    0
@@ -70,39 +71,78 @@ static void HandleChooseTree(int, int, int, int, int, TreeInfo **);
 static struct GadgetInfo *screen_gadget[NUM_SCREEN_GADGETS];
 static int setup_mode = SETUP_MODE_MAIN;
 
-static void drawCursorExt(int pos, int color, int graphic)
+#if defined(TARGET_X11_NATIVE_PERFORMANCE_WORKAROUND)
+static Bitmap *scrollbar_bitmap[4];
+#endif
+
+
+static void drawCursorExt(int xpos, int ypos, int color, int graphic)
 {
   static int cursor_array[SCR_FIELDY];
 
-  if (graphic)
-    cursor_array[pos] = graphic;
-
-  graphic = cursor_array[pos];
+  if (xpos == 0)
+  {
+    if (graphic != 0)
+      cursor_array[ypos] = graphic;
+    else
+      graphic = cursor_array[ypos];
+  }
 
   if (color == FC_RED)
     graphic = (graphic == IMG_ARROW_BLUE_LEFT  ? IMG_ARROW_RED_LEFT  :
               graphic == IMG_ARROW_BLUE_RIGHT ? IMG_ARROW_RED_RIGHT :
               IMG_BALL_RED);
 
-  DrawGraphic(0, MENU_SCREEN_START_YPOS + pos, graphic, 0);
+  ypos += MENU_SCREEN_START_YPOS;
+
+  DrawBackground(SX + xpos * 32, SY + ypos * 32, TILEX, TILEY);
+  DrawGraphicThruMask(xpos, ypos, graphic, 0);
+}
+
+static void initCursor(int ypos, int graphic)
+{
+  drawCursorExt(0, ypos, FC_BLUE, graphic);
+}
+
+static void drawCursor(int ypos, int color)
+{
+  drawCursorExt(0, ypos, color, 0);
+}
+
+static void drawCursorXY(int xpos, int ypos, int graphic)
+{
+  drawCursorExt(xpos, ypos, -1, graphic);
+}
+
+static void PlaySound_Menu_Start(int sound)
+{
+  if (sound_info[sound].loop)
+    PlaySoundLoop(sound);
+  else
+    PlaySound(sound);
 }
 
-static void initCursor(int pos, int graphic)
+static void PlaySound_Menu_Continue(int sound)
 {
-  drawCursorExt(pos, FC_BLUE, graphic);
+  if (sound_info[sound].loop)
+    PlaySoundLoop(sound);
 }
 
-static void drawCursor(int pos, int color)
+void DrawTextStatic(int x, int y, char *text, int font_size, int font_type)
 {
-  drawCursorExt(pos, color, 0);
+  if (game_status == MAINMENU && gfx.menu_main_hide_static_text)
+    return;
+
+  DrawText(x, y, text, font_size, font_type);
 }
 
 void DrawHeadline()
 {
-  int x = SX + (SXSIZE - strlen(PROGRAM_TITLE_STRING) * FONT1_XSIZE) / 2;
+  int x1 = SX + (SXSIZE - strlen(PROGRAM_TITLE_STRING)   * FONT1_XSIZE) / 2;
+  int x2 = SX + (SXSIZE - strlen(WINDOW_SUBTITLE_STRING) * FONT2_XSIZE) / 2;
 
-  DrawText(x, SY + 8, PROGRAM_TITLE_STRING, FS_BIG, FC_YELLOW);
-  DrawTextFCentered(46, FC_RED, WINDOW_SUBTITLE_STRING);
+  DrawTextStatic(x1, SY + 8,  PROGRAM_TITLE_STRING,   FS_BIG,   FC_YELLOW);
+  DrawTextStatic(x2, SY + 46, WINDOW_SUBTITLE_STRING, FS_SMALL, FC_RED);
 }
 
 static void ToggleFullscreenIfNeeded()
@@ -118,7 +158,7 @@ static void ToggleFullscreenIfNeeded()
     setup.fullscreen = video.fullscreen_enabled;
 
     /* redraw background to newly created backbuffer */
-    BlitBitmap(new_graphic_info[IMG_MENU_BACK].bitmap, backbuffer,
+    BlitBitmap(graphic_info[IMG_GLOBAL_BORDER].bitmap, backbuffer,
               0,0, WIN_XSIZE,WIN_YSIZE, 0,0);
 
     /* restore old door content */
@@ -137,9 +177,13 @@ void DrawMainMenu()
 
   UnmapAllGadgets();
   FadeSounds();
+
   KeyboardAutoRepeatOn();
   ActivateJoystick();
+
   SetDrawDeactivationMask(REDRAW_NONE);
+  SetDrawBackgroundMask(REDRAW_FIELD);
+
   audio.sound_deactivated = FALSE;
 
   /* needed if last screen was the playing screen, invoked from level editor */
@@ -180,19 +224,22 @@ void DrawMainMenu()
   GetPlayerConfig();
   LoadLevel(level_nr);
 
+  SetMainBackgroundImage(IMG_BACKGROUND_MAIN);
   ClearWindow();
+
   DrawHeadline();
-  DrawText(SX + 32,    SY + 2*32, name_text, FS_BIG, FC_GREEN);
+
+  DrawTextStatic(SX + 32,    SY + 2*32, name_text, FS_BIG, FC_GREEN);
   DrawText(SX + 6*32,  SY + 2*32, setup.player_name, FS_BIG, FC_RED);
-  DrawText(SX + 32,    SY + 3*32, "Level:", FS_BIG, FC_GREEN);
+  DrawTextStatic(SX + 32,    SY + 3*32, "Level:", FS_BIG, FC_GREEN);
   DrawText(SX + 11*32, SY + 3*32, int2str(level_nr,3), FS_BIG,
           (leveldir_current->readonly ? FC_RED : FC_YELLOW));
-  DrawText(SX + 32,    SY + 4*32, "Hall Of Fame", FS_BIG, FC_GREEN);
-  DrawText(SX + 32,    SY + 5*32, "Level Creator", FS_BIG, FC_GREEN);
-  DrawText(SY + 32,    SY + 6*32, "Info Screen", FS_BIG, FC_GREEN);
-  DrawText(SX + 32,    SY + 7*32, "Start Game", FS_BIG, FC_GREEN);
-  DrawText(SX + 32,    SY + 8*32, "Setup", FS_BIG, FC_GREEN);
-  DrawText(SX + 32,    SY + 9*32, "Quit", FS_BIG, FC_GREEN);
+  DrawTextStatic(SX + 32,    SY + 4*32, "Hall Of Fame", FS_BIG, FC_GREEN);
+  DrawTextStatic(SX + 32,    SY + 5*32, "Level Creator", FS_BIG, FC_GREEN);
+  DrawTextStatic(SY + 32,    SY + 6*32, "Info Screen", FS_BIG, FC_GREEN);
+  DrawTextStatic(SX + 32,    SY + 7*32, "Start Game", FS_BIG, FC_GREEN);
+  DrawTextStatic(SX + 32,    SY + 8*32, "Setup", FS_BIG, FC_GREEN);
+  DrawTextStatic(SX + 32,    SY + 9*32, "Quit", FS_BIG, FC_GREEN);
 
   DrawMicroLevel(MICROLEV_XPOS, MICROLEV_YPOS, TRUE);
 
@@ -209,11 +256,16 @@ void DrawMainMenu()
   for(i=0; i<8; i++)
     initCursor(i, (i == 1 || i == 6 ? IMG_ARROW_BLUE_RIGHT : IMG_BALL_BLUE));
 
+#if 0
   DrawGraphic(10, 3, IMG_ARROW_BLUE_LEFT, 0);
   DrawGraphic(14, 3, IMG_ARROW_BLUE_RIGHT, 0);
+#else
+  drawCursorXY(10, 1, IMG_ARROW_BLUE_LEFT);
+  drawCursorXY(14, 1, IMG_ARROW_BLUE_RIGHT);
+#endif
 
-  DrawText(SX + 56, SY + 326, "A Game by Artsoft Entertainment",
-          FS_SMALL, FC_RED);
+  DrawTextStatic(SX + 56, SY + 326, "A Game by Artsoft Entertainment",
+                FS_SMALL, FC_RED);
 
   if (leveldir_current->name)
   {
@@ -318,10 +370,8 @@ void HandleMainMenu(int mx, int my, int dx, int dy, int button)
 
     level_nr = new_level_nr;
 
-    DrawTextExt(drawto, SX + 11 * 32, SY + 3 * 32,
-               int2str(level_nr, 3), FS_BIG, font_color);
-    DrawTextExt(window, SX + 11 * 32, SY + 3 * 32,
-               int2str(level_nr, 3), FS_BIG, font_color);
+    DrawText(SX + 11 * 32, SY + 3 * 32, int2str(level_nr, 3),
+            FS_BIG, font_color);
 
     LoadLevel(level_nr);
     DrawMicroLevel(MICROLEV_XPOS, MICROLEV_YPOS, TRUE);
@@ -435,8 +485,8 @@ void HandleMainMenu(int mx, int my, int dx, int dy, int button)
 static long helpscreen_state;
 static int helpscreen_step[MAX_HELPSCREEN_ELS];
 static int helpscreen_frame[MAX_HELPSCREEN_ELS];
-static int helpscreen_delay[MAX_HELPSCREEN_ELS];
-static int helpscreen_action[] =
+#if 0
+static int OLD_helpscreen_action[] =
 {
   GFX_SPIELER1_DOWN,4,2,
   GFX_SPIELER1_UP,4,2,
@@ -544,6 +594,219 @@ static int helpscreen_action[] =
   GFX_SPEED_PILL,1,100,                                                HA_NEXT,
   HA_END
 };
+#endif
+
+static int helpscreen_action[] =
+{
+  IMG_PLAYER1_MOVING_DOWN,             16,
+  IMG_PLAYER1_MOVING_UP,               16,
+  IMG_PLAYER1_MOVING_LEFT,             16,
+  IMG_PLAYER1_MOVING_RIGHT,            16,
+  IMG_PLAYER1_PUSHING_LEFT,            16,
+  IMG_PLAYER1_PUSHING_RIGHT,           16,                     HA_NEXT,
+
+  IMG_SAND,                            -1,                     HA_NEXT,
+
+  IMG_EMPTY_SPACE,                     -1,                     HA_NEXT,
+
+  IMG_QUICKSAND_EMPTY,                 -1,                     HA_NEXT,
+
+  IMG_STEELWALL,                       -1,                     HA_NEXT,
+
+  IMG_WALL,                            -1,                     HA_NEXT,
+
+  IMG_WALL_GROWING_ACTIVE_LEFT,                20,
+  IMG_WALL,                            50,
+  IMG_EMPTY_SPACE,                     20,
+  IMG_WALL_GROWING_ACTIVE_RIGHT,       20,
+  IMG_WALL,                            50,
+  IMG_EMPTY_SPACE,                     20,
+  IMG_WALL_GROWING_ACTIVE_UP,          20,
+  IMG_WALL,                            50,
+  IMG_EMPTY_SPACE,                     20,
+  IMG_WALL_GROWING_ACTIVE_DOWN,                20,
+  IMG_WALL,                            50,
+  IMG_EMPTY_SPACE,                     20,                     HA_NEXT,
+
+  IMG_INVISIBLE_WALL,                  -1,                     HA_NEXT,
+
+  IMG_WALL_CRUMBLED,                   -1,                     HA_NEXT,
+
+  IMG_INFO_FONT_EM_1,                  160,
+  IMG_INFO_FONT_EM_2,                  160,
+  IMG_INFO_FONT_EM_3,                  160,
+  IMG_INFO_FONT_EM_4,                  160,
+  IMG_INFO_FONT_EM_5,                  40,                     HA_NEXT,
+
+  IMG_EMERALD,                         -1,                     HA_NEXT,
+
+  IMG_DIAMOND,                         -1,                     HA_NEXT,
+
+  IMG_BD_DIAMOND,                      -1,                     HA_NEXT,
+
+  IMG_EMERALD_YELLOW,                  50,
+  IMG_EMERALD_RED,                     50,
+  IMG_EMERALD_PURPLE,                  50,                     HA_NEXT,
+
+  IMG_BD_ROCK,                         -1,                     HA_NEXT,
+
+  IMG_BOMB,                            100,
+  IMG_EXPLOSION,                       16,
+  IMG_EMPTY_SPACE,                     10,                     HA_NEXT,
+
+  IMG_NUT,                             100,
+  IMG_NUT_CRACKING,                    6,
+  IMG_EMERALD,                         20,                     HA_NEXT,
+
+  IMG_WALL_EMERALD,                    100,
+  IMG_EXPLOSION,                       16,
+  IMG_EMERALD,                         20,                     HA_NEXT,
+
+  IMG_WALL_DIAMOND,                    100,
+  IMG_EXPLOSION,                       16,
+  IMG_DIAMOND,                         20,                     HA_NEXT,
+
+  IMG_WALL_BD_DIAMOND,                         100,
+  IMG_EXPLOSION,                       16,
+  IMG_BD_DIAMOND,                      20,                     HA_NEXT,
+
+  IMG_WALL_EMERALD_YELLOW,             100,
+  IMG_EXPLOSION,                       16,
+  IMG_EMERALD_YELLOW,                  20,
+  IMG_WALL_EMERALD_RED,                        100,
+  IMG_EXPLOSION,                       16,
+  IMG_EMERALD_RED,                     20,
+  IMG_WALL_EMERALD_PURPLE,             100,
+  IMG_EXPLOSION,                       16,
+  IMG_EMERALD_PURPLE,                  20,                     HA_NEXT,
+
+  IMG_ACID,                            -1,                     HA_NEXT,
+
+  IMG_KEY1,                            50,
+  IMG_KEY2,                            50,
+  IMG_KEY3,                            50,
+  IMG_KEY4,                            50,                     HA_NEXT,
+
+  IMG_GATE1,                           50,
+  IMG_GATE2,                           50,
+  IMG_GATE3,                           50,
+  IMG_GATE4,                           50,                     HA_NEXT,
+
+  IMG_GATE1_GRAY,                      50,
+  IMG_GATE2_GRAY,                      50,
+  IMG_GATE3_GRAY,                      50,
+  IMG_GATE4_GRAY,                      50,                     HA_NEXT,
+
+  IMG_DYNAMITE,                                -1,                     HA_NEXT,
+
+  IMG_DYNAMITE_ACTIVE,                 96,
+  IMG_EXPLOSION,                       16,
+  IMG_EMPTY_SPACE,                     20,                     HA_NEXT,
+
+  IMG_DYNABOMB_ACTIVE,                 100,
+  IMG_EXPLOSION,                       16,
+  IMG_EMPTY_SPACE,                     20,                     HA_NEXT,
+
+  IMG_DYNABOMB_NR,                     -1,                     HA_NEXT,
+
+  IMG_DYNABOMB_SZ,                     -1,                     HA_NEXT,
+
+  IMG_SPACESHIP_RIGHT,                 16,
+  IMG_SPACESHIP_UP,                    16,
+  IMG_SPACESHIP_LEFT,                  16,
+  IMG_SPACESHIP_DOWN,                  16,                     HA_NEXT,
+
+  IMG_BUG_RIGHT,                       16,
+  IMG_BUG_UP,                          16,
+  IMG_BUG_LEFT,                                16,
+  IMG_BUG_DOWN,                                16,                     HA_NEXT,
+
+  IMG_BD_BUTTERFLY,                    -1,                     HA_NEXT,
+
+  IMG_BD_FIREFLY,                      -1,                     HA_NEXT,
+
+  IMG_PACMAN_RIGHT,                    16,
+  IMG_PACMAN_UP,                       16,
+  IMG_PACMAN_LEFT,                     16,
+  IMG_PACMAN_DOWN,                     16,                     HA_NEXT,
+
+  IMG_YAMYAM,                          -1,                     HA_NEXT,
+
+  IMG_DARK_YAMYAM,                     -1,                     HA_NEXT,
+
+  IMG_ROBOT,                           -1,                     HA_NEXT,
+
+  IMG_MOLE_MOVING_RIGHT,               16,
+  IMG_MOLE_MOVING_UP,                  16,
+  IMG_MOLE_MOVING_LEFT,                        16,
+  IMG_MOLE_MOVING_DOWN,                        16,                     HA_NEXT,
+
+  IMG_PENGUIN_MOVING_RIGHT,            16,
+  IMG_PENGUIN_MOVING_UP,               16,
+  IMG_PENGUIN_MOVING_LEFT,             16,
+  IMG_PENGUIN_MOVING_DOWN,             16,                     HA_NEXT,
+
+  IMG_PIG_MOVING_RIGHT,                        16,
+  IMG_PIG_MOVING_UP,                   16,
+  IMG_PIG_MOVING_LEFT,                 16,
+  IMG_PIG_MOVING_DOWN,                 16,                     HA_NEXT,
+
+  IMG_DRAGON_MOVING_RIGHT,             16,
+  IMG_DRAGON_MOVING_UP,                        16,
+  IMG_DRAGON_MOVING_LEFT,              16,
+  IMG_DRAGON_MOVING_DOWN,              16,                     HA_NEXT,
+
+  IMG_SATELLITE,                       -1,                     HA_NEXT,
+
+  IMG_ROBOT_WHEEL,                     50,
+  IMG_ROBOT_WHEEL_ACTIVE,              100,                    HA_NEXT,
+
+  IMG_LAMP,                            50,
+  IMG_LAMP_ACTIVE,                     50,                     HA_NEXT,
+
+  IMG_TIME_ORB_FULL,                   50,
+  IMG_TIME_ORB_EMPTY,                  50,                     HA_NEXT,
+
+  IMG_AMOEBA_DROP,                     50,
+  IMG_AMOEBA_CREATING,                 6,
+  IMG_AMOEBA_WET,                      20,                     HA_NEXT,
+
+  IMG_AMOEBA_DEAD,                     -1,                     HA_NEXT,
+
+  IMG_AMOEBA_WET,                      -1,                     HA_NEXT,
+
+  IMG_AMOEBA_WET,                      100,
+  IMG_AMOEBA_CREATING,                 6,                      HA_NEXT,
+
+  IMG_AMOEBA_FULL,                     50,
+  IMG_AMOEBA_DEAD,                     50,
+  IMG_EXPLOSION,                       16,
+  IMG_DIAMOND,                         20,                     HA_NEXT,
+
+  IMG_GAMEOFLIFE,                      -1,                     HA_NEXT,
+
+  IMG_BIOMAZE,                         -1,                     HA_NEXT,
+
+  IMG_MAGIC_WALL_ACTIVE,               -1,                     HA_NEXT,
+
+  IMG_BD_MAGIC_WALL_ACTIVE,            -1,                     HA_NEXT,
+
+  IMG_EXIT_CLOSED,                     200,
+  IMG_EXIT_OPENING,                    16,
+  IMG_EXIT_OPEN,                       100,                    HA_NEXT,
+
+  IMG_EXIT_OPEN,                       -1,                     HA_NEXT,
+
+  IMG_SOKOBAN_OBJECT,                  -1,                     HA_NEXT,
+
+  IMG_SOKOBAN_FIELD_EMPTY,             -1,                     HA_NEXT,
+
+  IMG_SOKOBAN_FIELD_FULL,              -1,                     HA_NEXT,
+
+  IMG_SPEED_PILL,                      -1,                     HA_NEXT,
+
+  HA_END
+};
 static char *helpscreen_eltext[][2] =
 {
  {"THE HERO:",                         "(Is _this_ guy good old Rockford?)"},
@@ -608,7 +871,7 @@ static char *helpscreen_eltext[][2] =
  {"Sokoban element: Field with object", "which can be pushed away"},
  {"Speed pill: Lets the player run",    "twice as fast as normally"},
 };
-static int num_helpscreen_els = sizeof(helpscreen_eltext)/(2*sizeof(char *));
+static int num_helpscreen_els = sizeof(helpscreen_eltext) / (2*sizeof(char *));
 
 static char *helpscreen_music[][3] =
 {
@@ -623,7 +886,8 @@ static char *helpscreen_music[][3] =
 static int num_helpscreen_music = 7;
 static int helpscreen_musicpos;
 
-void DrawHelpScreenElAction(int start)
+#if 0
+void OLD_DrawHelpScreenElAction(int start)
 {
   int i = 0, j = 0;
   int frame, graphic;
@@ -685,6 +949,81 @@ void DrawHelpScreenElAction(int start)
     MarkTileDirty(1,i);
   }
 }
+#endif
+
+void DrawHelpScreenElAction(int start)
+{
+  int i = 0, j = 0;
+  int xstart = SX + 16;
+  int ystart = SY + 64 + 2 * 32;
+  int ystep = TILEY + 4;
+  int graphic;
+  int frame_count;
+  int sync_frame;
+  int frame;
+
+  while (helpscreen_action[j] != HA_END)
+  {
+    if (i >= start + MAX_HELPSCREEN_ELS || i >= num_helpscreen_els)
+      break;
+    else if (i < start)
+    {
+      while (helpscreen_action[j] != HA_NEXT)
+       j++;
+
+      j++;
+      i++;
+
+      continue;
+    }
+
+    j += 2 * helpscreen_step[i-start];
+    graphic = helpscreen_action[j++];
+    frame_count = helpscreen_action[j++];
+    if (frame_count == -1)
+      frame_count = 1000000;
+
+    if (helpscreen_frame[i-start] == 0)
+    {
+      sync_frame = 0;
+      helpscreen_frame[i-start] = frame_count - 1;
+    }
+    else
+    {
+      sync_frame = frame_count - helpscreen_frame[i-start];
+      helpscreen_frame[i-start]--;
+    }
+
+    if (helpscreen_action[j] == HA_NEXT)
+    {
+      if (!helpscreen_frame[i-start])
+       helpscreen_step[i-start] = 0;
+    }
+    else
+    {
+      if (!helpscreen_frame[i-start])
+       helpscreen_step[i-start]++;
+      while(helpscreen_action[j] != HA_NEXT)
+       j++;
+    }
+    j++;
+
+    frame = getGraphicAnimationFrame(graphic, sync_frame);
+
+    DrawGraphicExt(drawto, xstart, ystart + (i-start) * ystep,
+                  graphic, frame);
+
+    i++;
+  }
+
+  for(i=2; i<16; i++)
+  {
+    MarkTileDirty(0, i);
+    MarkTileDirty(1, i);
+  }
+
+  FrameCounter++;
+}
 
 void DrawHelpScreenElText(int start)
 {
@@ -692,6 +1031,7 @@ void DrawHelpScreenElText(int start)
   int xstart = SX + 56, ystart = SY + 65 + 2 * 32, ystep = TILEY + 4;
   int ybottom = SYSIZE - 20;
 
+  SetMainBackgroundImage(IMG_BACKGROUND_INFO);
   ClearWindow();
   DrawHeadline();
 
@@ -812,15 +1152,21 @@ void DrawHelpScreen()
   CloseDoor(DOOR_CLOSE_2);
 
   for(i=0;i<MAX_HELPSCREEN_ELS;i++)
-    helpscreen_step[i] = helpscreen_frame[i] = helpscreen_delay[i] = 0;
+    helpscreen_step[i] = helpscreen_frame[i] = 0;
   helpscreen_musicpos = 0;
   helpscreen_state = 0;
+
   DrawHelpScreenElText(0);
   DrawHelpScreenElAction(0);
 
   FadeToFront();
   InitAnimation();
+
+#if 0
   PlaySoundLoop(SND_MENU_INFO_SCREEN);
+#else
+  PlaySound_Menu_Start(SND_MENU_INFO_SCREEN);
+#endif
 }
 
 void HandleHelpScreen(int button)
@@ -836,8 +1182,10 @@ void HandleHelpScreen(int button)
     if (helpscreen_state < num_helpscreen_els_pages - 1)
     {
       for(i=0;i<MAX_HELPSCREEN_ELS;i++)
-       helpscreen_step[i] = helpscreen_frame[i] = helpscreen_delay[i] = 0;
+       helpscreen_step[i] = helpscreen_frame[i] = 0;
       helpscreen_state++;
+
+      FrameCounter = 0;
       DrawHelpScreenElText(helpscreen_state * MAX_HELPSCREEN_ELS);
       DrawHelpScreenElAction(helpscreen_state * MAX_HELPSCREEN_ELS);
     }
@@ -868,7 +1216,7 @@ void HandleHelpScreen(int button)
   }
   else
   {
-    if (DelayReached(&hs_delay, GAME_FRAME_DELAY * 2))
+    if (DelayReached(&hs_delay, GAME_FRAME_DELAY))
     {
       if (helpscreen_state < num_helpscreen_els_pages)
        DrawHelpScreenElAction(helpscreen_state * MAX_HELPSCREEN_ELS);
@@ -877,7 +1225,11 @@ void HandleHelpScreen(int button)
     /* !!! workaround for playing "music" that is really a sound loop (and
        must therefore periodically be reactivated with the current sound
        engine !!! */
+#if 0
     PlaySoundLoop(SND_MENU_INFO_SCREEN);
+#else
+    PlaySound_Menu_Continue(SND_MENU_INFO_SCREEN);
+#endif
 
     DoAnimation();
   }
@@ -892,8 +1244,10 @@ void HandleTypeName(int newxpos, Key key)
   if (newxpos)
   {
     xpos = newxpos;
-    DrawText(SX + 6*32, SY + ypos*32, setup.player_name, FS_BIG, FC_YELLOW);
-    DrawGraphic(xpos + 6, ypos, IMG_BALL_RED, 0);
+    DrawText(SX + 6 * 32, SY + ypos * 32, setup.player_name,
+            FS_BIG, FC_YELLOW);
+    drawCursorXY(xpos + 6, ypos - 2, IMG_BALL_RED);
+
     return;
   }
 
@@ -911,23 +1265,23 @@ void HandleTypeName(int newxpos, Key key)
     setup.player_name[xpos] = ascii;
     setup.player_name[xpos + 1] = 0;
     xpos++;
-    DrawTextExt(drawto, SX + 6*32, SY + ypos*32,
-               setup.player_name, FS_BIG, FC_YELLOW);
-    DrawTextExt(window, SX + 6*32, SY + ypos*32,
-               setup.player_name, FS_BIG, FC_YELLOW);
-    DrawGraphic(xpos + 6, ypos, IMG_BALL_RED, 0);
+
+    DrawText(SX + 6 * 32, SY + ypos * 32, setup.player_name,
+            FS_BIG, FC_YELLOW);
+    drawCursorXY(xpos + 6, ypos - 2, IMG_BALL_RED);
   }
   else if ((key == KSYM_Delete || key == KSYM_BackSpace) && xpos > 0)
   {
     xpos--;
     setup.player_name[xpos] = 0;
-    DrawGraphic(xpos + 6, ypos, IMG_BALL_RED, 0);
-    DrawGraphic(xpos + 7, ypos, IMG_EMPTY, 0);
+
+    DrawBackground(SX + (xpos + 6) * 32, SY + ypos * 32, 2 * TILEX, TILEY);
+    drawCursorXY(xpos + 6, ypos - 2, IMG_BALL_RED);
   }
   else if (key == KSYM_Return && xpos > 0)
   {
-    DrawText(SX + 6*32, SY + ypos*32, setup.player_name, FS_BIG, FC_RED);
-    DrawGraphic(xpos + 6, ypos, IMG_EMPTY, 0);
+    DrawText(SX + 6 * 32, SY + ypos * 32, setup.player_name, FS_BIG, FC_RED);
+    DrawBackground(SX + (xpos + 6) * 32, SY + ypos * 32, TILEX, TILEY);
 
     SaveSetup();
     game_status = MAINMENU;
@@ -942,6 +1296,7 @@ static void DrawChooseTree(TreeInfo **ti_ptr)
   CloseDoor(DOOR_CLOSE_2);
 
   ClearWindow();
+
   HandleChooseTree(0,0, 0,0, MB_MENU_INITIALIZE, ti_ptr);
   MapChooseTreeGadgets(*ti_ptr);
 
@@ -975,7 +1330,7 @@ static void drawChooseTreeList(int first_entry, int num_page_entries,
   char *title_string = NULL;
   int offset = (ti->type == TREE_TYPE_LEVEL_DIR ? 0 : 16);
 
-  ClearRectangle(backbuffer, SX, SY, SXSIZE - 32, SYSIZE);
+  DrawBackground(SX, SY, SXSIZE - 32, SYSIZE);
   redraw_mask |= REDRAW_FIELD;
 
   title_string =
@@ -1010,10 +1365,20 @@ static void drawChooseTreeList(int first_entry, int num_page_entries,
   }
 
   if (first_entry > 0)
-    DrawGraphic(0, 1, IMG_ARROW_BLUE_UP, 0);
+  {
+    int ypos = 1;
+
+    DrawBackground(SX, SY + ypos * 32, TILEX, TILEY);
+    DrawGraphicThruMask(0, ypos, IMG_ARROW_BLUE_UP, 0);
+  }
 
   if (first_entry + num_page_entries < num_entries)
-    DrawGraphic(0, MAX_MENU_ENTRIES_ON_SCREEN + 1, IMG_ARROW_BLUE_DOWN, 0);
+  {
+    int ypos = MAX_MENU_ENTRIES_ON_SCREEN + 1;
+
+    DrawBackground(SX, SY + ypos * 32, TILEX, TILEY);
+    DrawGraphicThruMask(0, ypos, IMG_ARROW_BLUE_DOWN, 0);
+  }
 }
 
 static void drawChooseTreeInfo(int entry_pos, TreeInfo *ti)
@@ -1027,7 +1392,7 @@ static void drawChooseTreeInfo(int entry_pos, TreeInfo *ti)
   node_first = getTreeInfoFirstGroupEntry(ti);
   node = getTreeInfoFromPos(node_first, entry_pos);
 
-  ClearRectangle(drawto, SX + 32, SY + 32, SXSIZE - 64, 32);
+  DrawBackground(SX + 32, SY + 32, SXSIZE - 64, 32);
 
   if (node->parent_link)
     DrawTextFCentered(40, FC_RED, "leave group \"%s\"", node->class_desc);
@@ -1246,6 +1611,8 @@ static void HandleChooseTree(int mx, int my, int dx, int dy, int button,
 
 void DrawChooseLevel()
 {
+  SetMainBackgroundImage(IMG_BACKGROUND_LEVEL_SERIES);
+
   DrawChooseTree(&leveldir_current);
 }
 
@@ -1265,15 +1632,23 @@ void DrawHallOfFame(int highlight_position)
 
   FadeToFront();
   InitAnimation();
+
   HandleHallOfFame(highlight_position,0, 0,0, MB_MENU_INITIALIZE);
+
+#if 0
   PlaySound(SND_MENU_HALL_OF_FAME);
+#else
+  PlaySound_Menu_Start(SND_MENU_HALL_OF_FAME);
+#endif
 }
 
 static void drawHallOfFameList(int first_entry, int highlight_position)
 {
   int i;
 
+  SetMainBackgroundImage(IMG_BACKGROUND_HALL_OF_FAME);
   ClearWindow();
+
   DrawText(SX + 80, SY + 8, "Hall Of Fame", FS_BIG, FC_YELLOW);
   DrawTextFCentered(46, FC_RED, "HighScores of Level %d", level_nr);
 
@@ -1352,7 +1727,12 @@ void HandleHallOfFame(int mx, int my, int dx, int dy, int button)
   BackToFront();
 
   if (game_status == HALLOFFAME)
+  {
     DoAnimation();
+#if 1
+    PlaySound_Menu_Continue(SND_MENU_HALL_OF_FAME);
+#endif
+  }
 }
 
 
@@ -1379,6 +1759,12 @@ static void execSetupGame()
   DrawSetupScreen();
 }
 
+static void execSetupEditor()
+{
+  setup_mode = SETUP_MODE_EDITOR;
+  DrawSetupScreen();
+}
+
 static void execSetupGraphics()
 {
   setup_mode = SETUP_MODE_GRAPHICS;
@@ -1454,6 +1840,7 @@ static void execSaveAndExitSetup()
 static struct TokenInfo setup_info_main[] =
 {
   { TYPE_ENTER_MENU,   execSetupGame,          "Game Settings"         },
+  { TYPE_ENTER_MENU,   execSetupEditor,        "Editor Settings"       },
   { TYPE_ENTER_MENU,   execSetupGraphics,      "Graphics"              },
   { TYPE_ENTER_MENU,   execSetupSound,         "Sound & Music"         },
   { TYPE_ENTER_MENU,   execSetupArtwork,       "Custom Artwork"        },
@@ -1461,7 +1848,7 @@ static struct TokenInfo setup_info_main[] =
   { TYPE_ENTER_MENU,   execSetupShortcut,      "Key Shortcuts"         },
   { TYPE_EMPTY,                NULL,                   ""                      },
   { TYPE_LEAVE_MENU,   execExitSetup,          "Exit"                  },
-  { TYPE_LEAVE_MENU,   execSaveAndExitSetup,   "Save and exit"         },
+  { TYPE_LEAVE_MENU,   execSaveAndExitSetup,   "Save and Exit"         },
   { 0,                 NULL,                   NULL                    }
 };
 
@@ -1472,7 +1859,24 @@ static struct TokenInfo setup_info_game[] =
   { TYPE_SWITCH,       &setup.time_limit,      "Timelimit:"            },
   { TYPE_SWITCH,       &setup.autorecord,      "Auto-Record:"          },
   { TYPE_EMPTY,                NULL,                   ""                      },
-  { TYPE_LEAVE_MENU,   execSetupMain,          "Exit"                  },
+  { TYPE_LEAVE_MENU,   execSetupMain,          "Back"                  },
+  { 0,                 NULL,                   NULL                    }
+};
+
+static struct TokenInfo setup_info_editor[] =
+{
+  { TYPE_STRING,       NULL,                   "Offer Special Elements:"},
+  { TYPE_SWITCH,       &setup.editor.el_boulderdash,   "BoulderDash:"  },
+  { TYPE_SWITCH,       &setup.editor.el_emerald_mine,  "Emerald Mine:" },
+  { TYPE_SWITCH,       &setup.editor.el_more,          "More:"         },
+  { TYPE_SWITCH,       &setup.editor.el_sokoban,       "Sokoban:"      },
+  { TYPE_SWITCH,       &setup.editor.el_supaplex,      "Supaplex:"     },
+  { TYPE_SWITCH,       &setup.editor.el_diamond_caves, "Diamd. Caves:" },
+  { TYPE_SWITCH,       &setup.editor.el_dx_boulderdash,"DX Boulderd.:" },
+  { TYPE_SWITCH,       &setup.editor.el_chars,         "Characters:"   },
+  { TYPE_SWITCH,       &setup.editor.el_custom,        "Custom:"       },
+  { TYPE_EMPTY,                NULL,                   ""                      },
+  { TYPE_LEAVE_MENU,   execSetupMain,          "Back"                  },
   { 0,                 NULL,                   NULL                    }
 };
 
@@ -1488,7 +1892,7 @@ static struct TokenInfo setup_info_graphics[] =
   { TYPE_SWITCH,       &setup.quick_doors,     "Quick Doors:"          },
   { TYPE_SWITCH,       &setup.toons,           "Toons:"                },
   { TYPE_EMPTY,                NULL,                   ""                      },
-  { TYPE_LEAVE_MENU,   execSetupMain,          "Exit"                  },
+  { TYPE_LEAVE_MENU,   execSetupMain,          "Back"                  },
   { 0,                 NULL,                   NULL                    }
 };
 
@@ -1500,7 +1904,7 @@ static struct TokenInfo setup_info_sound[] =
   { TYPE_SWITCH,       &setup.sound_loops,     "Sound Loops:"          },
   { TYPE_SWITCH,       &setup.sound_music,     "Game Music:"           },
   { TYPE_EMPTY,                NULL,                   ""                      },
-  { TYPE_LEAVE_MENU,   execSetupMain,          "Exit"                  },
+  { TYPE_LEAVE_MENU,   execSetupMain,          "Back"                  },
   { 0,                 NULL,                   NULL                    }
 };
 
@@ -1518,7 +1922,7 @@ static struct TokenInfo setup_info_artwork[] =
   { TYPE_YES_NO,       &setup.override_level_sounds,   "Sounds:"       },
   { TYPE_YES_NO,       &setup.override_level_music,    "Music:"        },
   { TYPE_EMPTY,                NULL,                   ""                      },
-  { TYPE_LEAVE_MENU,   execSetupMain,          "Exit"                  },
+  { TYPE_LEAVE_MENU,   execSetupMain,          "Back"                  },
   { 0,                 NULL,                   NULL                    }
 };
 
@@ -1533,7 +1937,7 @@ static struct TokenInfo setup_info_shortcut[] =
   { TYPE_EMPTY,                NULL,                   ""                      },
   { TYPE_YES_NO,       &setup.ask_on_escape,   "Ask on Esc:"           },
   { TYPE_EMPTY,                NULL,                   ""                      },
-  { TYPE_LEAVE_MENU,   execSetupMain,          "Exit"                  },
+  { TYPE_LEAVE_MENU,   execSetupMain,          "Back"                  },
   { 0,                 NULL,                   NULL                    }
 };
 
@@ -1654,6 +2058,7 @@ static void DrawSetupScreen_Generic()
 
   UnmapAllGadgets();
   CloseDoor(DOOR_CLOSE_2);
+
   ClearWindow();
 
   if (setup_mode == SETUP_MODE_MAIN)
@@ -1666,6 +2071,11 @@ static void DrawSetupScreen_Generic()
     setup_info = setup_info_game;
     title_string = "Setup Game";
   }
+  else if (setup_mode == SETUP_MODE_EDITOR)
+  {
+    setup_info = setup_info_editor;
+    title_string = "Setup Editor";
+  }
   else if (setup_mode == SETUP_MODE_GRAPHICS)
   {
     setup_info = setup_info_graphics;
@@ -1729,12 +2139,18 @@ static void DrawSetupScreen_Generic()
 void HandleSetupScreen_Generic(int mx, int my, int dx, int dy, int button)
 {
   static int choice_store[MAX_SETUP_MODES];
-  int choice = choice_store[setup_mode];
+  int choice = choice_store[setup_mode];       /* always starts with 0 */
   int x = 0;
   int y = choice;
 
   if (button == MB_MENU_INITIALIZE)
   {
+    /* advance to first valid menu entry */
+    while (choice < num_setup_info &&
+          (setup_info[choice].type & TYPE_SKIP_ENTRY))
+      choice++;
+    choice_store[setup_mode] = choice;
+
     drawCursor(choice, FC_RED);
     return;
   }
@@ -1819,6 +2235,7 @@ void HandleSetupScreen_Generic(int mx, int my, int dx, int dy, int button)
 void DrawSetupScreen_Input()
 {
   ClearWindow();
+
   DrawText(SX+16, SY+16, "Setup Input", FS_BIG, FC_YELLOW);
 
   initCursor(0, IMG_BALL_BLUE);
@@ -1826,12 +2243,12 @@ void DrawSetupScreen_Input()
   initCursor(2, IMG_ARROW_BLUE_RIGHT);
   initCursor(13, IMG_ARROW_BLUE_LEFT);
 
-  DrawGraphic(10, MENU_SCREEN_START_YPOS, IMG_ARROW_BLUE_LEFT, 0);
-  DrawGraphic(12, MENU_SCREEN_START_YPOS, IMG_ARROW_BLUE_RIGHT, 0);
+  drawCursorXY(10, 0, IMG_ARROW_BLUE_LEFT);
+  drawCursorXY(12, 0, IMG_ARROW_BLUE_RIGHT);
 
   DrawText(SX+32, SY+2*32, "Player:", FS_BIG, FC_GREEN);
   DrawText(SX+32, SY+3*32, "Device:", FS_BIG, FC_GREEN);
-  DrawText(SX+32, SY+15*32, "Exit", FS_BIG, FC_GREEN);
+  DrawText(SX+32, SY+15*32, "Back", FS_BIG, FC_GREEN);
 
 #if 0
   DeactivateJoystickForCalibration();
@@ -1893,7 +2310,7 @@ static void drawPlayerSetupInputInfo(int player_nr)
   custom_key = setup.input[player_nr].key;
 
   DrawText(SX+11*32, SY+2*32, int2str(player_nr + 1, 1), FS_BIG, FC_RED);
-  DrawGraphic(8, 2, PLAYER_NR_GFX(IMG_PLAYER1, player_nr), 0);
+  DrawGraphicThruMask(8, 2, PLAYER_NR_GFX(IMG_PLAYER1, player_nr), 0);
 
   if (setup.input[player_nr].use_joystick)
   {
@@ -1911,10 +2328,10 @@ static void drawPlayerSetupInputInfo(int player_nr)
   }
 
   DrawText(SX+32, SY+5*32, "Actual Settings:", FS_BIG, FC_GREEN);
-  DrawGraphic(1, 6, IMG_ARROW_BLUE_LEFT, 0);
-  DrawGraphic(1, 7, IMG_ARROW_BLUE_RIGHT, 0);
-  DrawGraphic(1, 8, IMG_ARROW_BLUE_UP, 0);
-  DrawGraphic(1, 9, IMG_ARROW_BLUE_DOWN, 0);
+  drawCursorXY(1, 4, IMG_ARROW_BLUE_LEFT);
+  drawCursorXY(1, 5, IMG_ARROW_BLUE_RIGHT);
+  drawCursorXY(1, 6, IMG_ARROW_BLUE_UP);
+  drawCursorXY(1, 7, IMG_ARROW_BLUE_DOWN);
   DrawText(SX+2*32, SY+6*32, ":", FS_BIG, FC_BLUE);
   DrawText(SX+2*32, SY+7*32, ":", FS_BIG, FC_BLUE);
   DrawText(SX+2*32, SY+8*32, ":", FS_BIG, FC_BLUE);
@@ -2388,6 +2805,8 @@ void DrawSetupScreen()
 {
   DeactivateJoystick();
 
+  SetMainBackgroundImage(IMG_BACKGROUND_SETUP);
+
   if (setup_mode == SETUP_MODE_INPUT)
     DrawSetupScreen_Input();
   else if (setup_mode == SETUP_MODE_CHOOSE_GRAPHICS)
@@ -2471,7 +2890,11 @@ static struct
 
 static struct
 {
+#if defined(TARGET_X11_NATIVE_PERFORMANCE_WORKAROUND)
+  Bitmap **gfx_unpressed, **gfx_pressed;
+#else
   int gfx_unpressed, gfx_pressed;
+#endif
   int x, y;
   int width, height;
   int type;
@@ -2480,7 +2903,11 @@ static struct
 } scrollbar_info[NUM_SCREEN_SCROLLBARS] =
 {
   {
+#if defined(TARGET_X11_NATIVE_PERFORMANCE_WORKAROUND)
+    &scrollbar_bitmap[0], &scrollbar_bitmap[1],
+#else
     IMG_SCROLLBAR_BLUE, IMG_SCROLLBAR_RED,
+#endif
     SX + SC_SCROLL_VERTICAL_XPOS, SY + SC_SCROLL_VERTICAL_YPOS,
     SC_SCROLL_VERTICAL_XSIZE, SC_SCROLL_VERTICAL_YSIZE,
     GD_TYPE_SCROLLBAR_VERTICAL,
@@ -2515,12 +2942,12 @@ static void CreateScreenScrollbuttons()
 
     gfx_unpressed = scrollbutton_info[i].gfx_unpressed;
     gfx_pressed   = scrollbutton_info[i].gfx_pressed;
-    gd_bitmap_unpressed = new_graphic_info[gfx_unpressed].bitmap;
-    gd_bitmap_pressed   = new_graphic_info[gfx_pressed].bitmap;
-    gd_x1 = new_graphic_info[gfx_unpressed].src_x;
-    gd_y1 = new_graphic_info[gfx_unpressed].src_y;
-    gd_x2 = new_graphic_info[gfx_pressed].src_x;
-    gd_y2 = new_graphic_info[gfx_pressed].src_y;
+    gd_bitmap_unpressed = graphic_info[gfx_unpressed].bitmap;
+    gd_bitmap_pressed   = graphic_info[gfx_pressed].bitmap;
+    gd_x1 = graphic_info[gfx_unpressed].src_x;
+    gd_y1 = graphic_info[gfx_unpressed].src_y;
+    gd_x2 = graphic_info[gfx_pressed].src_x;
+    gd_y2 = graphic_info[gfx_pressed].src_y;
 
     gi = CreateGadget(GDI_CUSTOM_ID, id,
                      GDI_CUSTOM_TYPE_ID, i,
@@ -2551,7 +2978,9 @@ static void CreateScreenScrollbars()
   for (i=0; i<NUM_SCREEN_SCROLLBARS; i++)
   {
     Bitmap *gd_bitmap_unpressed, *gd_bitmap_pressed;
+#if !defined(TARGET_X11_NATIVE_PERFORMANCE_WORKAROUND)
     int gfx_unpressed, gfx_pressed;
+#endif
     int gd_x1, gd_x2, gd_y1, gd_y2;
     struct GadgetInfo *gi;
     int items_max, items_visible, item_position;
@@ -2565,14 +2994,23 @@ static void CreateScreenScrollbars()
 
     event_mask = GD_EVENT_MOVING | GD_EVENT_OFF_BORDERS;
 
+#if defined(TARGET_X11_NATIVE_PERFORMANCE_WORKAROUND)
+    gd_bitmap_unpressed = *scrollbar_info[i].gfx_unpressed;
+    gd_bitmap_pressed   = *scrollbar_info[i].gfx_pressed;
+    gd_x1 = 0;
+    gd_y1 = 0;
+    gd_x2 = 0;
+    gd_y2 = 0;
+#else
     gfx_unpressed = scrollbar_info[i].gfx_unpressed;
     gfx_pressed   = scrollbar_info[i].gfx_pressed;
-    gd_bitmap_unpressed = new_graphic_info[gfx_unpressed].bitmap;
-    gd_bitmap_pressed   = new_graphic_info[gfx_pressed].bitmap;
-    gd_x1 = new_graphic_info[gfx_unpressed].src_x;
-    gd_y1 = new_graphic_info[gfx_unpressed].src_y;
-    gd_x2 = new_graphic_info[gfx_pressed].src_x;
-    gd_y2 = new_graphic_info[gfx_pressed].src_y;
+    gd_bitmap_unpressed = graphic_info[gfx_unpressed].bitmap;
+    gd_bitmap_pressed   = graphic_info[gfx_pressed].bitmap;
+    gd_x1 = graphic_info[gfx_unpressed].src_x;
+    gd_y1 = graphic_info[gfx_unpressed].src_y;
+    gd_x2 = graphic_info[gfx_pressed].src_x;
+    gd_y2 = graphic_info[gfx_pressed].src_y;
+#endif
 
     gi = CreateGadget(GDI_CUSTOM_ID, id,
                      GDI_CUSTOM_TYPE_ID, i,
@@ -2602,10 +3040,50 @@ static void CreateScreenScrollbars()
 
 void CreateScreenGadgets()
 {
+#if defined(TARGET_X11_NATIVE_PERFORMANCE_WORKAROUND)
+  int i;
+
+  for (i=0; i<4; i++)
+  {
+    scrollbar_bitmap[i] = CreateBitmap(TILEX, TILEY, DEFAULT_DEPTH);
+
+    /* copy pointers to clip mask and GC */
+    scrollbar_bitmap[i]->clip_mask =
+      graphic_info[IMG_SCROLLBAR_BLUE + i].clip_mask;
+    scrollbar_bitmap[i]->stored_clip_gc =
+      graphic_info[IMG_SCROLLBAR_BLUE + i].clip_gc;
+
+    BlitBitmap(graphic_info[IMG_SCROLLBAR_BLUE + i].bitmap,
+              scrollbar_bitmap[i],
+              graphic_info[IMG_SCROLLBAR_BLUE + i].src_x,
+              graphic_info[IMG_SCROLLBAR_BLUE + i].src_y,
+              TILEX, TILEY, 0, 0);
+  }
+#endif
+
   CreateScreenScrollbuttons();
   CreateScreenScrollbars();
 }
 
+void FreeScreenGadgets()
+{
+  int i;
+
+#if defined(TARGET_X11_NATIVE_PERFORMANCE_WORKAROUND)
+  for (i=0; i<4; i++)
+  {
+    /* prevent freeing clip mask and GC twice */
+    scrollbar_bitmap[i]->clip_mask = None;
+    scrollbar_bitmap[i]->stored_clip_gc = None;
+
+    FreeBitmap(scrollbar_bitmap[i]);
+  }
+#endif
+
+  for (i=0; i<NUM_SCREEN_GADGETS; i++)
+    FreeGadget(screen_gadget[i]);
+}
+
 void MapChooseTreeGadgets(TreeInfo *ti)
 {
   int num_entries = numTreeInfoInGroup(ti);