fixed variable type
[rocksndiamonds.git] / src / screens.c
index e20f4deb67a8fe729b207733fdf6dfc5d83ad83b..87f1908cce8117f0d3971212a74e412b7cdec320 100644 (file)
 
 /* for input setup functions */
 #define SETUPINPUT_SCREEN_POS_START    0
-#define SETUPINPUT_SCREEN_POS_END      (SCR_FIELDY - 4)
-#define SETUPINPUT_SCREEN_POS_EMPTY1   (SETUPINPUT_SCREEN_POS_START + 3)
-#define SETUPINPUT_SCREEN_POS_EMPTY2   (SETUPINPUT_SCREEN_POS_END - 1)
+#define SETUPINPUT_SCREEN_POS_EMPTY1   3
+#define SETUPINPUT_SCREEN_POS_EMPTY2   12
+#define SETUPINPUT_SCREEN_POS_END      13
 
 #define MENU_SETUP_FONT_TITLE          FONT_TEXT_1
 #define MENU_SETUP_FONT_TEXT           FONT_TITLE_2
 #define MENU_INFO_FONT_TEXT            FONT_TEXT_3
 #define MENU_INFO_FONT_FOOT            FONT_TEXT_4
 #define MENU_INFO_SPACE_HEAD           (menu.headline2_spacing_info[info_mode])
-#define MENU_SCREEN_INFO_XSTART                16
-#define MENU_SCREEN_INFO_YSTART1       100
+#define MENU_SCREEN_INFO_SPACE_LEFT    (menu.left_spacing_info[info_mode])
+#define MENU_SCREEN_INFO_SPACE_RIGHT   (menu.right_spacing_info[info_mode])
+#define MENU_SCREEN_INFO_SPACE_TOP     (menu.top_spacing_info[info_mode])
+#define MENU_SCREEN_INFO_SPACE_BOTTOM  (menu.bottom_spacing_info[info_mode])
+#define MENU_SCREEN_INFO_YSTART1       MENU_SCREEN_INFO_SPACE_TOP
 #define MENU_SCREEN_INFO_YSTART2       (MENU_SCREEN_INFO_YSTART1 +            \
                                         getMenuTextStep(MENU_INFO_SPACE_HEAD, \
                                                         MENU_INFO_FONT_TITLE))
 #define MENU_SCREEN_INFO_YSTEP         (TILEY + 4)
-#define MENU_SCREEN_INFO_YBOTTOM       (SYSIZE - 20)
+#define MENU_SCREEN_INFO_YBOTTOM       (SYSIZE - MENU_SCREEN_INFO_SPACE_BOTTOM)
 #define MENU_SCREEN_INFO_YSIZE         (MENU_SCREEN_INFO_YBOTTOM -     \
                                         MENU_SCREEN_INFO_YSTART2 -     \
                                         TILEY / 2)
@@ -2142,7 +2145,7 @@ static void DrawCursorAndText_Menu_Ext(struct TokenInfo *token_info,
   int ypos = MENU_SCREEN_START_YPOS + screen_pos;
   int font_nr = getMenuTextFont(ti->type);
 
-  if (token_info == setup_info_input)
+  if (setup_mode == SETUP_MODE_INPUT)
     font_nr = FONT_MENU_1;
 
   if (active)
@@ -2600,9 +2603,9 @@ void DrawInfoScreen_NotAvailable(char *text_title, char *text_error)
   int font_foot  = MENU_INFO_FONT_FOOT;
   int spacing_title = menu.headline1_spacing_info[info_mode];
   int ystep_title = getMenuTextStep(spacing_title, font_title);
-  int ystart1 = mSY - SY + 100;
+  int ystart1 = mSY - SY + MENU_SCREEN_INFO_YSTART1;
   int ystart2 = ystart1 + ystep_title;
-  int ybottom = mSY - SY + SYSIZE - 20;
+  int ybottom = mSY - SY + MENU_SCREEN_INFO_YBOTTOM;
 
   SetMainBackgroundImageIfDefined(IMG_BACKGROUND_INFO);
 
@@ -2626,7 +2629,7 @@ void DrawInfoScreen_HelpAnim(int start, int max_anims, boolean init)
   static int infoscreen_frame[MAX_INFO_ELEMENTS_ON_SCREEN];
   int font_title = MENU_INFO_FONT_TITLE;
   int font_foot  = MENU_INFO_FONT_FOOT;
-  int xstart = mSX + MENU_SCREEN_INFO_XSTART;
+  int xstart  = mSX + MENU_SCREEN_INFO_SPACE_LEFT;
   int ystart1 = mSY - SY + MENU_SCREEN_INFO_YSTART1;
   int ystart2 = mSY + MENU_SCREEN_INFO_YSTART2;
   int ybottom = mSY - SY + MENU_SCREEN_INFO_YBOTTOM;
@@ -2756,11 +2759,12 @@ void DrawInfoScreen_HelpText(int element, int action, int direction, int ypos)
   int font_width = getFontWidth(font_nr);
   int font_height = getFontHeight(font_nr);
   int yoffset = (TILEX - 2 * font_height) / 2;
-  int xstart = mSX + MINI_TILEX + TILEX + MINI_TILEX;
+  int xstart = mSX + MENU_SCREEN_INFO_SPACE_LEFT + TILEX + MINI_TILEX;
   int ystart = mSY + MENU_SCREEN_INFO_YSTART2 + yoffset;
   int ystep = TILEY + 4;
-  int pad_x = xstart - SX;
-  int max_chars_per_line = (SXSIZE - pad_x - MINI_TILEX) / font_width;
+  int pad_left = xstart - SX;
+  int pad_right = MENU_SCREEN_INFO_SPACE_RIGHT;
+  int max_chars_per_line = (SXSIZE - pad_left - pad_right) / font_width;
   int max_lines_per_text = 2;    
   char *text = NULL;
 
@@ -2919,8 +2923,8 @@ void HandleInfoScreen_Music(int button)
   int spacing_head  = menu.headline2_spacing_info[info_mode];
   int ystep_title = getMenuTextStep(spacing_title, font_title);
   int ystep_head  = getMenuTextStep(spacing_head,  font_head);
-  int ystart = mSY - SY + 100;
-  int ybottom = mSY - SY + SYSIZE - 20;
+  int ystart  = mSY - SY + MENU_SCREEN_INFO_YSTART1;
+  int ybottom = mSY - SY + MENU_SCREEN_INFO_YBOTTOM;
 
   if (button == MB_MENU_INITIALIZE)
   {
@@ -3081,8 +3085,8 @@ static void DrawInfoScreen_CreditsScreen(int screen_nr)
   int ystep_head  = getMenuTextStep(spacing_head,  font_head);
   int ystep_para  = getMenuTextStep(spacing_para,  font_text);
   int ystep_line  = getMenuTextStep(spacing_line,  font_text);
-  int ystart = mSY - SY + 100;
-  int ybottom = mSY - SY + SYSIZE - 20;
+  int ystart  = mSY - SY + MENU_SCREEN_INFO_YSTART1;
+  int ybottom = mSY - SY + MENU_SCREEN_INFO_YBOTTOM;
 
   ClearField();
   DrawHeadline();
@@ -3382,8 +3386,8 @@ void DrawInfoScreen_Program()
   int ystep_head  = getMenuTextStep(spacing_head,  font_head);
   int ystep_para  = getMenuTextStep(spacing_para,  font_text);
   int ystep_line  = getMenuTextStep(spacing_line,  font_text);
-  int ystart = mSY - SY + 100;
-  int ybottom = mSY - SY + SYSIZE - 20;
+  int ystart  = mSY - SY + MENU_SCREEN_INFO_YSTART1;
+  int ybottom = mSY - SY + MENU_SCREEN_INFO_YBOTTOM;
 
   SetMainBackgroundImageIfDefined(IMG_BACKGROUND_INFO_PROGRAM);
 
@@ -3468,8 +3472,8 @@ void DrawInfoScreen_Version()
   int ystep_head  = getMenuTextStep(spacing_head,  font_head);
   int ystep_para  = getMenuTextStep(spacing_para,  font_text);
   int ystep_line  = getMenuTextStep(spacing_line,  font_text);
-  int ystart  = mSY - SY + 100;
-  int ybottom = mSY - SY + SYSIZE - 20;
+  int ystart  = mSY - SY + MENU_SCREEN_INFO_YSTART1;
+  int ybottom = mSY - SY + MENU_SCREEN_INFO_YBOTTOM;
   int xstart1 = mSX - SX + 2 * xstep;
   int xstart2 = mSX - SX + 18 * xstep;
   int xstart3 = mSX - SX + 28 * xstep;
@@ -3655,8 +3659,8 @@ void DrawInfoScreen_LevelSet()
   struct TitleMessageInfo *tmi = &readme;
   char *filename = getLevelSetInfoFilename();
   char *title = "Level Set Information:";
-  int ystart = mSY - SY + 100;
-  int ybottom = mSY - SY + SYSIZE - 20;
+  int ystart  = mSY - SY + MENU_SCREEN_INFO_YSTART1;
+  int ybottom = mSY - SY + MENU_SCREEN_INFO_YBOTTOM;
 
   if (filename == NULL)
   {
@@ -3688,7 +3692,7 @@ void DrawInfoScreen_LevelSet()
 
   /* if height set to "-1", automatically determine by playfield height */
   if (tmi->height == -1)
-    tmi->height = SYSIZE - 20 - tmi->y - 10;
+    tmi->height = MENU_SCREEN_INFO_YBOTTOM - tmi->y - 10;
 
   /* if chars set to "-1", automatically determine by text and font width */
   if (tmi->chars == -1)
@@ -4970,7 +4974,6 @@ static void execSetupGraphics()
 #endif
 }
 
-#if defined(TARGET_SDL2) && !defined(PLATFORM_ANDROID)
 static void execSetupChooseWindowSize()
 {
   setup_mode = SETUP_MODE_CHOOSE_WINDOW_SIZE;
@@ -4991,7 +4994,6 @@ static void execSetupChooseRenderingMode()
 
   DrawSetupScreen();
 }
-#endif
 
 static void execSetupChooseVolumeSimple()
 {
@@ -5508,6 +5510,69 @@ static void execSaveAndExitSetup()
   execExitSetup();
 }
 
+static struct
+{
+  void *value;
+  void *related_value;
+} hide_related_entry_list[] =
+{
+  { &setup.game_frame_delay,           execSetupChooseGameSpeed        },
+  { &setup.game_frame_delay,           &game_speed_text                },
+
+  { &setup.scroll_delay_value,         execSetupChooseScrollDelay      },
+  { &setup.scroll_delay_value,         &scroll_delay_text              },
+
+  { &setup.engine_snapshot_mode,       execSetupChooseSnapshotMode     },
+  { &setup.engine_snapshot_mode,       &snapshot_mode_text             },
+
+  { &setup.window_scaling_percent,     execSetupChooseWindowSize       },
+  { &setup.window_scaling_percent,     &window_size_text               },
+
+  { &setup.window_scaling_quality,     execSetupChooseScalingType      },
+  { &setup.window_scaling_quality,     &scaling_type_text              },
+
+  { &setup.screen_rendering_mode,      execSetupChooseRenderingMode    },
+  { &setup.screen_rendering_mode,      &rendering_mode_text            },
+
+  { &setup.graphics_set,               execSetupChooseGraphics         },
+  { &setup.graphics_set,               &graphics_set_name              },
+
+  { &setup.sounds_set,                 execSetupChooseSounds           },
+  { &setup.sounds_set,                 &sounds_set_name                },
+
+  { &setup.music_set,                  execSetupChooseMusic            },
+  { &setup.music_set,                  &music_set_name                 },
+
+  { &setup.volume_simple,              execSetupChooseVolumeSimple     },
+  { &setup.volume_simple,              &volume_simple_text             },
+
+  { &setup.volume_loops,               execSetupChooseVolumeLoops      },
+  { &setup.volume_loops,               &volume_loops_text              },
+
+  { &setup.volume_music,               execSetupChooseVolumeMusic      },
+  { &setup.volume_music,               &volume_music_text              },
+
+  { &setup.touch.control_type,         execSetupChooseTouchControls    },
+  { &setup.touch.control_type,         &touch_controls_text            },
+
+  { &setup.touch.move_distance,                execSetupChooseMoveDistance     },
+  { &setup.touch.move_distance,                &move_distance_text             },
+
+  { &setup.touch.drop_distance,                execSetupChooseDropDistance     },
+  { &setup.touch.drop_distance,                &drop_distance_text             },
+
+  { NULL,                              NULL                            }
+};
+
+void setHideRelatedSetupEntries()
+{
+  int i;
+
+  for (i = 0; hide_related_entry_list[i].value != NULL; i++)
+    if (hideSetupEntry(hide_related_entry_list[i].value))
+      setHideSetupEntry(hide_related_entry_list[i].related_value);
+}
+
 static struct TokenInfo setup_info_main[] =
 {
   { TYPE_ENTER_MENU,   execSetupGame,          STR_SETUP_GAME          },
@@ -5653,6 +5718,7 @@ static struct TokenInfo setup_info_input[] =
   { TYPE_SWITCH,       NULL,                   "Player:"               },
   { TYPE_SWITCH,       NULL,                   "Device:"               },
   { TYPE_SWITCH,       NULL,                   ""                      },
+  { TYPE_SKIPPABLE,    NULL,                   ""                      },
   { TYPE_EMPTY,                NULL,                   ""                      },
   { TYPE_EMPTY,                NULL,                   ""                      },
   { TYPE_EMPTY,                NULL,                   ""                      },
@@ -5661,8 +5727,7 @@ static struct TokenInfo setup_info_input[] =
   { TYPE_EMPTY,                NULL,                   ""                      },
   { TYPE_EMPTY,                NULL,                   ""                      },
   { TYPE_EMPTY,                NULL,                   ""                      },
-  { TYPE_EMPTY,                NULL,                   ""                      },
-  { TYPE_EMPTY,                NULL,                   ""                      },
+  { TYPE_SKIPPABLE,    NULL,                   ""                      },
   { TYPE_LEAVE_MENU,   execSetupMain,          "Back"                  },
 
   { 0,                 NULL,                   NULL                    }
@@ -6016,7 +6081,7 @@ static void changeSetupValue(int screen_pos, int setup_info_pos_raw, int dx)
 
 static struct TokenInfo *getSetupInfoFinal(struct TokenInfo *setup_info_orig)
 {
-  static struct TokenInfo *setup_info_hide = NULL;
+  static struct TokenInfo *setup_info_final = NULL;
   int list_size = 0;
   int list_pos = 0;
   int i;
@@ -6025,15 +6090,25 @@ static struct TokenInfo *getSetupInfoFinal(struct TokenInfo *setup_info_orig)
   while (setup_info_orig[list_size++].type != 0);
 
   /* free, allocate and clear memory for target list */
-  checked_free(setup_info_hide);
-  setup_info_hide = checked_calloc(list_size * sizeof(struct TokenInfo));
+  checked_free(setup_info_final);
+  setup_info_final = checked_calloc(list_size * sizeof(struct TokenInfo));
 
   /* copy setup info list without setup entries marked as hidden */
   for (i = 0; setup_info_orig[i].type != 0; i++)
-    if (!hideSetupEntry(setup_info_orig[i].value))
-      setup_info_hide[list_pos++] = setup_info_orig[i];
+  {
+    /* skip setup entries configured to be hidden */
+    if (hideSetupEntry(setup_info_orig[i].value))
+      continue;
+
+    /* skip skippable setup entries if screen is lower than usual */
+    if (SCR_FIELDY < SCR_FIELDY_DEFAULT &&
+       setup_info_orig[i].type == TYPE_SKIPPABLE)
+      continue;
 
-  return setup_info_hide;
+    setup_info_final[list_pos++] = setup_info_orig[i];
+  }
+
+  return setup_info_final;
 }
 
 static void DrawSetupScreen_Generic()
@@ -6178,11 +6253,11 @@ void DrawSetupScreen_Input()
 
   ClearField();
 
-  setup_info = setup_info_input;
+  setup_info = getSetupInfoFinal(setup_info_input);
 
   DrawTextSCentered(mSY - SY + 16, FONT_TITLE_1, STR_SETUP_INPUT);
 
-  for (i = 0; setup_info[i].type != 0 && i < MAX_MENU_ENTRIES_ON_SCREEN; i++)
+  for (i = 0; setup_info[i].type != 0; i++)
   {
     if (setup_info[i].type & (TYPE_ENTER_MENU|TYPE_ENTER_LIST))
       initCursor(i, IMG_MENU_BUTTON_ENTER_MENU);
@@ -6251,7 +6326,19 @@ static void drawPlayerSetupInputInfo(int player_nr, boolean active)
     "Joystick3",
     "Joystick4"
   };
-  int text_font_nr = (active ? FONT_MENU_1_ACTIVE : FONT_MENU_1);
+  int font_nr_menu = (active ? FONT_MENU_1_ACTIVE : FONT_MENU_1);
+  int font_nr_info = FONT_MENU_1;
+  int font_nr_name = FONT_VALUE_OLD;
+  int font_nr_on   = FONT_VALUE_1;
+  int font_nr_off  = FONT_VALUE_OLD;
+  int pos = 4;
+
+  if (SCR_FIELDX < SCR_FIELDX_DEFAULT)
+  {
+    font_nr_info = FONT_MENU_2;
+    font_nr_on   = FONT_VALUE_NARROW;
+    font_nr_off  = FONT_VALUE_OLD_NARROW;
+  }
 
   custom_key = setup.input[player_nr].key;
 
@@ -6269,41 +6356,44 @@ static void drawPlayerSetupInputInfo(int player_nr, boolean active)
     int joystick_nr = getJoystickNrFromDeviceName(device_name);
     boolean joystick_active = CheckJoystickOpened(joystick_nr);
     char *text = joystick_name[joystick_nr];
-    int font_nr = (joystick_active ? FONT_VALUE_1 : FONT_VALUE_OLD);
+    int font_nr = (joystick_active ? font_nr_on : font_nr_off);
 
     DrawText(mSX + 8 * 32, mSY + 3 * 32, text, font_nr);
-    DrawText(mSX + 32, mSY + 4 * 32, "Configure", text_font_nr);
+    DrawText(mSX + 32, mSY + 4 * 32, "Configure", font_nr_menu);
   }
   else
   {
-    DrawText(mSX + 8 * 32, mSY + 3 * 32, "Keyboard ", FONT_VALUE_1);
-    DrawText(mSX + 1 * 32, mSY + 4 * 32, "Customize", text_font_nr);
+    DrawText(mSX + 8 * 32, mSY + 3 * 32, "Keyboard ", font_nr_on);
+    DrawText(mSX + 1 * 32, mSY + 4 * 32, "Customize", font_nr_menu);
   }
 
-  DrawText(mSX + 32, mSY + 5 * 32, "Actual Settings:", FONT_MENU_1);
+  if (SCR_FIELDY >= SCR_FIELDY_DEFAULT)
+    DrawText(mSX + 32, mSY + 5 * 32, "Actual Settings:", font_nr_info);
+  else
+    pos = 3;
 
-  drawCursorXY(1, 4, IMG_MENU_BUTTON_LEFT);
-  drawCursorXY(1, 5, IMG_MENU_BUTTON_RIGHT);
-  drawCursorXY(1, 6, IMG_MENU_BUTTON_UP);
-  drawCursorXY(1, 7, IMG_MENU_BUTTON_DOWN);
+  drawCursorXY(1, pos + 0, IMG_MENU_BUTTON_LEFT);
+  drawCursorXY(1, pos + 1, IMG_MENU_BUTTON_RIGHT);
+  drawCursorXY(1, pos + 2, IMG_MENU_BUTTON_UP);
+  drawCursorXY(1, pos + 3, IMG_MENU_BUTTON_DOWN);
 
-  DrawText(mSX + 2 * 32, mSY +  6 * 32, ":", FONT_VALUE_OLD);
-  DrawText(mSX + 2 * 32, mSY +  7 * 32, ":", FONT_VALUE_OLD);
-  DrawText(mSX + 2 * 32, mSY +  8 * 32, ":", FONT_VALUE_OLD);
-  DrawText(mSX + 2 * 32, mSY +  9 * 32, ":", FONT_VALUE_OLD);
-  DrawText(mSX + 1 * 32, mSY + 10 * 32, "Snap Field:", FONT_VALUE_OLD);
-  DrawText(mSX + 1 * 32, mSY + 12 * 32, "Drop Element:", FONT_VALUE_OLD);
+  DrawText(mSX + 2 * 32, mSY + (pos + 2) * 32, ":", font_nr_name);
+  DrawText(mSX + 2 * 32, mSY + (pos + 3) * 32, ":", font_nr_name);
+  DrawText(mSX + 2 * 32, mSY + (pos + 4) * 32, ":", font_nr_name);
+  DrawText(mSX + 2 * 32, mSY + (pos + 5) * 32, ":", font_nr_name);
+  DrawText(mSX + 1 * 32, mSY + (pos + 6) * 32, "Snap Field:", font_nr_name);
+  DrawText(mSX + 1 * 32, mSY + (pos + 8) * 32, "Drop Element:", font_nr_name);
 
   for (i = 0; i < 6; i++)
   {
-    int ypos = 6 + i + (i > 3 ? i-3 : 0);
+    int ypos = (pos + 2) + i + (i > 3 ? i - 3 : 0);
 
     DrawText(mSX + 3 * 32, mSY + ypos * 32,
-            "              ", FONT_VALUE_1);
+            "              ", font_nr_on);
     DrawText(mSX + 3 * 32, mSY + ypos * 32,
             (setup.input[player_nr].use_joystick ?
              custom[i].text :
-             getKeyNameFromKey(*custom[i].key)), FONT_VALUE_1);
+             getKeyNameFromKey(*custom[i].key)), font_nr_on);
   }
 }
 
@@ -6338,8 +6428,27 @@ void HandleSetupScreen_Input(int mx, int my, int dx, int dy, int button)
   int pos_empty2 = SETUPINPUT_SCREEN_POS_EMPTY2;
   int pos_end    = SETUPINPUT_SCREEN_POS_END;
 
+  if (SCR_FIELDY < SCR_FIELDY_DEFAULT)
+  {
+    int i;
+
+    for (i = 0; setup_info_input[i].type != 0; i++)
+    {
+      /* adjust menu structure according to skipped setup entries */
+      if (setup_info_input[i].type == TYPE_SKIPPABLE)
+      {
+       pos_empty2--;
+       pos_end--;
+      }
+    }
+  }
+
   if (button == MB_MENU_INITIALIZE)
   {
+    /* input setup menu may have changed size due to graphics configuration */
+    if (choice >= pos_empty1)
+      choice = pos_end;
+
     drawPlayerSetupInputInfo(input_player_nr, (choice == 2));
 
     DrawCursorAndText_Setup(choice, -1, TRUE);
@@ -6440,7 +6549,7 @@ void HandleSetupScreen_Input(int mx, int my, int dx, int dy, int button)
   }
 }
 
-void CustomizeKeyboard(int player_nr)
+static boolean CustomizeKeyboardMain(int player_nr)
 {
   int i;
   int step_nr;
@@ -6459,6 +6568,15 @@ void CustomizeKeyboard(int player_nr)
     { &custom_key.snap,  "Snap Field"  },
     { &custom_key.drop,  "Drop Element"        }
   };
+  int font_nr_old = FONT_VALUE_OLD;
+  int font_nr_new = FONT_VALUE_1;
+  boolean success = FALSE;
+
+  if (SCR_FIELDX < SCR_FIELDX_DEFAULT)
+  {
+    font_nr_old = FONT_VALUE_OLD_NARROW;
+    font_nr_new = FONT_VALUE_NARROW;
+  }
 
   /* read existing key bindings from player setup */
   custom_key = setup.input[player_nr].key;
@@ -6476,7 +6594,7 @@ void CustomizeKeyboard(int player_nr)
   DrawText(mSX, mSY + (2 + 2 * step_nr + 1) * 32,
           "Key:", FONT_INPUT_1_ACTIVE);
   DrawText(mSX + 4 * 32, mSY + (2 + 2 * step_nr + 1) * 32,
-          getKeyNameFromKey(*customize_step[step_nr].key), FONT_VALUE_OLD);
+          getKeyNameFromKey(*customize_step[step_nr].key), font_nr_old);
 
   FadeIn(REDRAW_FIELD);
 
@@ -6492,18 +6610,15 @@ void CustomizeKeyboard(int player_nr)
          {
            Key key = GetEventKey((KeyEvent *)&event, FALSE);
 
-           if (key == KSYM_Escape || (key == KSYM_Return && step_nr == 6))
+           /* press 'Escape' to abort and keep the old key bindings */
+           if (key == KSYM_Escape)
            {
-             if (key == KSYM_Escape)
-               FadeSkipNextFadeIn();
+             FadeSkipNextFadeIn();
 
              finished = TRUE;
-             break;
-           }
 
-           /* all keys configured -- wait for "Escape" or "Return" key */
-           if (step_nr == 6)
              break;
+           }
 
            /* press 'Enter' to keep the existing key binding */
            if (key == KSYM_Return)
@@ -6519,9 +6634,9 @@ void CustomizeKeyboard(int player_nr)
            /* got new key binding */
            *customize_step[step_nr].key = key;
            DrawText(mSX + 4 * 32, mSY + (2 + 2 * step_nr + 1) * 32,
-                    "             ", FONT_VALUE_1);
+                    "             ", font_nr_new);
            DrawText(mSX + 4 * 32, mSY + (2 + 2 * step_nr + 1) * 32,
-                    getKeyNameFromKey(key), FONT_VALUE_1);
+                    getKeyNameFromKey(key), font_nr_new);
            step_nr++;
 
            /* un-highlight last query */
@@ -6530,11 +6645,12 @@ void CustomizeKeyboard(int player_nr)
            DrawText(mSX, mSY + (2 + 2 * (step_nr - 1) + 1) * 32,
                     "Key:", FONT_MENU_1);
 
-           /* press 'Enter' to leave */
+           /* all keys configured */
            if (step_nr == 6)
            {
-             DrawText(mSX + 16, mSY + 15 * 32 + 16,
-                      "Press Enter", FONT_TITLE_1);
+             finished = TRUE;
+             success = TRUE;
+
              break;
            }
 
@@ -6545,7 +6661,7 @@ void CustomizeKeyboard(int player_nr)
                     "Key:", FONT_INPUT_1_ACTIVE);
            DrawText(mSX + 4 * 32, mSY + (2 + 2 * step_nr + 1) * 32,
                     getKeyNameFromKey(*customize_step[step_nr].key),
-                    FONT_VALUE_OLD);
+                    font_nr_old);
          }
          break;
 
@@ -6562,8 +6678,38 @@ void CustomizeKeyboard(int player_nr)
     BackToFront();
   }
 
-  /* write new key bindings back to player setup */
-  setup.input[player_nr].key = custom_key;
+  /* write new key bindings back to player setup, if successfully finished */
+  if (success)
+    setup.input[player_nr].key = custom_key;
+
+  return success;
+}
+
+void CustomizeKeyboard(int player_nr)
+{
+  boolean success = CustomizeKeyboardMain(player_nr);
+
+  if (success)
+  {
+    int font_nr = FONT_TITLE_1;
+    int font_height = getFontHeight(font_nr);
+    int ypos1 = SYSIZE / 2 - font_height * 2;
+    int ypos2 = SYSIZE / 2 - font_height * 1;
+    unsigned int wait_frame_delay = 0;
+    unsigned int wait_frame_delay_value = 2000;
+
+    ResetDelayCounter(&wait_frame_delay);
+
+    ClearField();
+
+    DrawTextSCentered(ypos1, font_nr, "Keyboard");
+    DrawTextSCentered(ypos2, font_nr, "configured!");
+
+    while (!DelayReached(&wait_frame_delay, wait_frame_delay_value))
+      BackToFront();
+
+    ClearEventQueue();
+  }
 
   DrawSetupScreen_Input();
 }
@@ -6975,11 +7121,14 @@ void ConfigureJoystick(int player_nr)
   if (state != JOYSTICK_NOT_CONFIGURED)
   {
     boolean success = (state == JOYSTICK_CONFIGURED);
-    char *message = (success ? " IS CONFIGURED! " : " NOT AVAILABLE! ");
+    char message1[MAX_OUTPUT_LINESIZE + 1];
+    char *message2 = (success ? "configured!" : "not available!");
     char *device_name = setup.input[player_nr].joy.device_name;
     int nr = getJoystickNrFromDeviceName(device_name) + 1;
-    int xpos = mSX - SX;
-    int ypos = mSY - SY;
+    int font_nr = FONT_TITLE_1;
+    int font_height = getFontHeight(font_nr);
+    int ypos1 = SYSIZE / 2 - font_height * 2;
+    int ypos2 = SYSIZE / 2 - font_height * 1;
     unsigned int wait_frame_delay = 0;
     unsigned int wait_frame_delay_value = 2000;
 
@@ -6987,8 +7136,10 @@ void ConfigureJoystick(int player_nr)
 
     ClearField();
 
-    DrawTextF(xpos + 16, ypos + 6 * 32, FONT_TITLE_1, "   JOYSTICK %d   ", nr);
-    DrawTextF(xpos + 16, ypos + 7 * 32, FONT_TITLE_1, message);
+    sprintf(message1, "Joystick %d", nr);
+
+    DrawTextSCentered(ypos1, font_nr, message1);
+    DrawTextSCentered(ypos2, font_nr, message2);
 
     while (!DelayReached(&wait_frame_delay, wait_frame_delay_value))
       BackToFront();