fixed ignoring clicks on global animations after executing event actions
[rocksndiamonds.git] / src / screens.c
index 3dd571fe857cb912493d9dc0105a0a559103d2fe..89b9d3d48c515478dc2894924fd96ef9de463004 100644 (file)
 #define SETUP_MODE_CHOOSE_TOUCH_CONTROL        28
 #define SETUP_MODE_CHOOSE_MOVE_DISTANCE        29
 #define SETUP_MODE_CHOOSE_DROP_DISTANCE        30
+#define SETUP_MODE_CHOOSE_TRANSPARENCY 31
+#define SETUP_MODE_CHOOSE_GRID_XSIZE_0 32
+#define SETUP_MODE_CHOOSE_GRID_YSIZE_0 33
+#define SETUP_MODE_CHOOSE_GRID_XSIZE_1 34
+#define SETUP_MODE_CHOOSE_GRID_YSIZE_1 35
+#define SETUP_MODE_CONFIG_VIRT_BUTTONS 36
 
-#define MAX_SETUP_MODES                        31
+#define MAX_SETUP_MODES                        37
 
 #define MAX_MENU_MODES                 MAX(MAX_INFO_MODES, MAX_SETUP_MODES)
 
 #define STR_SETUP_CHOOSE_TOUCH_CONTROL "Control Type"
 #define STR_SETUP_CHOOSE_MOVE_DISTANCE "Move Distance"
 #define STR_SETUP_CHOOSE_DROP_DISTANCE "Drop Distance"
+#define STR_SETUP_CHOOSE_TRANSPARENCY  "Transparency"
+#define STR_SETUP_CHOOSE_GRID_XSIZE_0  "Horiz. Buttons"
+#define STR_SETUP_CHOOSE_GRID_YSIZE_0  "Vert. Buttons"
+#define STR_SETUP_CHOOSE_GRID_XSIZE_1  "Horiz. Buttons"
+#define STR_SETUP_CHOOSE_GRID_YSIZE_1  "Vert. Buttons"
 
 /* for input setup functions */
 #define SETUPINPUT_SCREEN_POS_START    0
@@ -276,6 +287,12 @@ static TreeInfo *move_distance_current = NULL;
 static TreeInfo *drop_distances = NULL;
 static TreeInfo *drop_distance_current = NULL;
 
+static TreeInfo *transparencies = NULL;
+static TreeInfo *transparency_current = NULL;
+
+static TreeInfo *grid_sizes[2][2] = { { NULL, NULL }, { NULL, NULL } };
+static TreeInfo *grid_size_current[2][2] = { { NULL, NULL }, { NULL, NULL } };
+
 static TreeInfo *level_number = NULL;
 static TreeInfo *level_number_current = NULL;
 
@@ -452,6 +469,67 @@ static struct
   {    -1,     NULL                            },
 };
 
+static struct
+{
+  int value;
+  char *text;
+} transparencies_list[] =
+{
+  {    0,      "0 % (Opaque)"                  },
+  {    10,     "10 %"                          },
+  {    20,     "20 %"                          },
+  {    30,     "30 %"                          },
+  {    40,     "40 %"                          },
+  {    50,     "50 %"                          },
+  {    60,     "60 %"                          },
+  {    70,     "70 %"                          },
+  {    80,     "80 %"                          },
+  {    90,     "90 %"                          },
+  {    100,    "100 % (Invisible)"             },
+
+  {    -1,     NULL                            },
+};
+
+static struct
+{
+  int value;
+  char *text;
+} grid_sizes_list[] =
+{
+  {    3,      "3"                             },
+  {    4,      "4"                             },
+  {    5,      "5"                             },
+  {    6,      "6"                             },
+  {    7,      "7"                             },
+  {    8,      "8"                             },
+  {    9,      "9"                             },
+  {    10,     "10"                            },
+  {    11,     "11"                            },
+  {    12,     "12"                            },
+  {    13,     "13"                            },
+  {    14,     "14"                            },
+  {    15,     "15"                            },
+  {    16,     "16"                            },
+  {    17,     "17"                            },
+  {    18,     "18"                            },
+  {    19,     "19"                            },
+  {    20,     "20"                            },
+  {    21,     "21"                            },
+  {    22,     "22"                            },
+  {    23,     "23"                            },
+  {    24,     "24"                            },
+  {    25,     "25"                            },
+  {    26,     "26"                            },
+  {    27,     "27"                            },
+  {    28,     "28"                            },
+  {    29,     "29"                            },
+  {    30,     "30"                            },
+  {    31,     "31"                            },
+  {    32,     "32"                            },
+
+  {    -1,     NULL                            },
+};
+
 #define DRAW_MODE(s)           ((s) >= GAME_MODE_MAIN &&               \
                                 (s) <= GAME_MODE_SETUP ? (s) :         \
                                 (s) == GAME_MODE_PSEUDO_TYPENAME ?     \
@@ -671,19 +749,19 @@ static struct MainControlInfo main_controls[] =
 #endif
   {
     MAIN_CONTROL_FIRST_LEVEL,
-    NULL,                              -1,
+    &menu.main.button.first_level,     IMG_MENU_BUTTON_FIRST_LEVEL,
     &menu.main.text.first_level,       &main_text_first_level,
     NULL,                              NULL,
   },
   {
     MAIN_CONTROL_LAST_LEVEL,
-    NULL,                              -1,
+    &menu.main.button.last_level,      IMG_MENU_BUTTON_LAST_LEVEL,
     &menu.main.text.last_level,                &main_text_last_level,
     NULL,                              NULL,
   },
   {
     MAIN_CONTROL_LEVEL_NUMBER,
-    NULL,                              -1,
+    &menu.main.button.level_number,    IMG_MENU_BUTTON_LEVEL_NUMBER,
     &menu.main.text.level_number,      &main_text_level_number,
     NULL,                              NULL,
   },
@@ -1070,8 +1148,8 @@ static void InitializeMainControls()
 
     if (pos_text != NULL)              /* (x/y may be -1/-1 here) */
     {
-      /* calculate size for non-clickable text -- needed for text alignment */
-      boolean calculate_text_size = (pos_button == NULL && text != NULL);
+      /* calculate text size -- needed for text alignment */
+      boolean calculate_text_size = (text != NULL);
 
       if (pos_text->width == -1 || calculate_text_size)
        pos_text->width = text_width;
@@ -1573,6 +1651,10 @@ void DrawMainMenu()
   FreeScreenGadgets();
   CreateScreenGadgets();
 
+  /* may be required if audio buttons shown on tape and changed in setup menu */
+  FreeGameButtons();
+  CreateGameButtons();
+
   /* map gadgets for main menu screen */
   MapTapeButtons();
   MapScreenMenuGadgets(SCREEN_MASK_MAIN);
@@ -4076,7 +4158,12 @@ static void HandleChooseTree(int mx, int my, int dx, int dy, int button,
        execSetupSound();
       else if (setup_mode == SETUP_MODE_CHOOSE_TOUCH_CONTROL ||
               setup_mode == SETUP_MODE_CHOOSE_MOVE_DISTANCE ||
-              setup_mode == SETUP_MODE_CHOOSE_DROP_DISTANCE)
+              setup_mode == SETUP_MODE_CHOOSE_DROP_DISTANCE ||
+              setup_mode == SETUP_MODE_CHOOSE_TRANSPARENCY ||
+              setup_mode == SETUP_MODE_CHOOSE_GRID_XSIZE_0 ||
+              setup_mode == SETUP_MODE_CHOOSE_GRID_YSIZE_0 ||
+              setup_mode == SETUP_MODE_CHOOSE_GRID_XSIZE_1 ||
+              setup_mode == SETUP_MODE_CHOOSE_GRID_YSIZE_1)
        execSetupTouch();
       else
        execSetupArtwork();
@@ -4228,7 +4315,12 @@ static void HandleChooseTree(int mx, int my, int dx, int dy, int button,
            execSetupSound();
          else if (setup_mode == SETUP_MODE_CHOOSE_TOUCH_CONTROL ||
                   setup_mode == SETUP_MODE_CHOOSE_MOVE_DISTANCE ||
-                  setup_mode == SETUP_MODE_CHOOSE_DROP_DISTANCE)
+                  setup_mode == SETUP_MODE_CHOOSE_DROP_DISTANCE ||
+                  setup_mode == SETUP_MODE_CHOOSE_TRANSPARENCY ||
+                  setup_mode == SETUP_MODE_CHOOSE_GRID_XSIZE_0 ||
+                  setup_mode == SETUP_MODE_CHOOSE_GRID_YSIZE_0 ||
+                  setup_mode == SETUP_MODE_CHOOSE_GRID_XSIZE_1 ||
+                  setup_mode == SETUP_MODE_CHOOSE_GRID_YSIZE_1)
            execSetupTouch();
          else
            execSetupArtwork();
@@ -4294,7 +4386,12 @@ static void HandleChooseTree(int mx, int my, int dx, int dy, int button,
            execSetupSound();
          else if (setup_mode == SETUP_MODE_CHOOSE_TOUCH_CONTROL ||
                   setup_mode == SETUP_MODE_CHOOSE_MOVE_DISTANCE ||
-                  setup_mode == SETUP_MODE_CHOOSE_DROP_DISTANCE)
+                  setup_mode == SETUP_MODE_CHOOSE_DROP_DISTANCE ||
+                  setup_mode == SETUP_MODE_CHOOSE_TRANSPARENCY ||
+                  setup_mode == SETUP_MODE_CHOOSE_GRID_XSIZE_0 ||
+                  setup_mode == SETUP_MODE_CHOOSE_GRID_YSIZE_0 ||
+                  setup_mode == SETUP_MODE_CHOOSE_GRID_XSIZE_1 ||
+                  setup_mode == SETUP_MODE_CHOOSE_GRID_YSIZE_1)
            execSetupTouch();
          else
            execSetupArtwork();
@@ -4561,6 +4658,8 @@ static char *volume_music_text;
 static char *touch_controls_text;
 static char *move_distance_text;
 static char *drop_distance_text;
+static char *transparency_text;
+static char *grid_size_text[2][2];
 
 static void execSetupMain()
 {
@@ -5258,19 +5357,58 @@ static void execSetupChooseDropDistance()
   DrawSetupScreen();
 }
 
+static void execSetupChooseTransparency()
+{
+  setup_mode = SETUP_MODE_CHOOSE_TRANSPARENCY;
+
+  DrawSetupScreen();
+}
+
+static void execSetupChooseGridXSize_0()
+{
+  setup_mode = SETUP_MODE_CHOOSE_GRID_XSIZE_0;
+
+  DrawSetupScreen();
+}
+
+static void execSetupChooseGridYSize_0()
+{
+  setup_mode = SETUP_MODE_CHOOSE_GRID_YSIZE_0;
+
+  DrawSetupScreen();
+}
+
+static void execSetupChooseGridXSize_1()
+{
+  setup_mode = SETUP_MODE_CHOOSE_GRID_XSIZE_1;
+
+  DrawSetupScreen();
+}
+
+static void execSetupChooseGridYSize_1()
+{
+  setup_mode = SETUP_MODE_CHOOSE_GRID_YSIZE_1;
+
+  DrawSetupScreen();
+}
+
 static void execSetupConfigureVirtualButtons()
 {
+  setup_mode = SETUP_MODE_CONFIG_VIRT_BUTTONS;
+
   ConfigureVirtualButtons();
 
+  setup_mode = SETUP_MODE_TOUCH;
+
   DrawSetupScreen();
 }
 
 static void execSetupTouch()
 {
+  int i, j, k;
+
   if (touch_controls == NULL)
   {
-    int i;
-
     for (i = 0; touch_controls_list[i].value != NULL; i++)
     {
       TreeInfo *ti = newTreeInfo_setDefaults(TREE_TYPE_UNDEFINED);
@@ -5311,8 +5449,6 @@ static void execSetupTouch()
 
   if (move_distances == NULL)
   {
-    int i;
-
     for (i = 0; distances_list[i].value != -1; i++)
     {
       TreeInfo *ti = newTreeInfo_setDefaults(TREE_TYPE_UNDEFINED);
@@ -5345,7 +5481,8 @@ static void execSetupTouch()
     /* if that fails, set current distance to reliable default value */
     if (move_distance_current == NULL)
       move_distance_current =
-       getTreeInfoFromIdentifier(move_distances, i_to_a(1));
+       getTreeInfoFromIdentifier(move_distances,
+                                 i_to_a(TOUCH_MOVE_DISTANCE_DEFAULT));
 
     /* if that also fails, set current distance to first available value */
     if (move_distance_current == NULL)
@@ -5354,8 +5491,6 @@ static void execSetupTouch()
 
   if (drop_distances == NULL)
   {
-    int i;
-
     for (i = 0; distances_list[i].value != -1; i++)
     {
       TreeInfo *ti = newTreeInfo_setDefaults(TREE_TYPE_UNDEFINED);
@@ -5388,21 +5523,141 @@ static void execSetupTouch()
     /* if that fails, set current distance to reliable default value */
     if (drop_distance_current == NULL)
       drop_distance_current =
-       getTreeInfoFromIdentifier(drop_distances, i_to_a(1));
+       getTreeInfoFromIdentifier(drop_distances,
+                                 i_to_a(TOUCH_DROP_DISTANCE_DEFAULT));
 
     /* if that also fails, set current distance to first available value */
     if (drop_distance_current == NULL)
       drop_distance_current = drop_distances;
   }
 
+  if (transparencies == NULL)
+  {
+    for (i = 0; transparencies_list[i].value != -1; i++)
+    {
+      TreeInfo *ti = newTreeInfo_setDefaults(TREE_TYPE_UNDEFINED);
+      char identifier[32], name[32];
+      int value = transparencies_list[i].value;
+      char *text = transparencies_list[i].text;
+
+      ti->node_top = &transparencies;
+      ti->sort_priority = value;
+
+      sprintf(identifier, "%d", value);
+      sprintf(name, "%s", text);
+
+      setString(&ti->identifier, identifier);
+      setString(&ti->name, name);
+      setString(&ti->name_sorting, name);
+      setString(&ti->infotext, STR_SETUP_CHOOSE_TRANSPARENCY);
+
+      pushTreeInfo(&transparencies, ti);
+    }
+
+    /* sort transparency values to start with lowest transparency value */
+    sortTreeInfo(&transparencies);
+
+    /* set current transparency value to configured transparency value */
+    transparency_current =
+      getTreeInfoFromIdentifier(transparencies,
+                               i_to_a(setup.touch.transparency));
+
+    /* if that fails, set current transparency to reliable default value */
+    if (transparency_current == NULL)
+      transparency_current =
+       getTreeInfoFromIdentifier(transparencies,
+                                 i_to_a(TOUCH_TRANSPARENCY_DEFAULT));
+
+    /* if that also fails, set current transparency to first available value */
+    if (transparency_current == NULL)
+      transparency_current = transparencies;
+  }
+
+  for (i = 0; i < 2; i++)
+  {
+    for (j = 0; j < 2; j++)
+    {
+      if (grid_sizes[i][j] == NULL)
+      {
+       for (k = 0; grid_sizes_list[k].value != -1; k++)
+       {
+         TreeInfo *ti = newTreeInfo_setDefaults(TREE_TYPE_UNDEFINED);
+         char identifier[32], name[32];
+         int value = grid_sizes_list[k].value;
+         char *text = grid_sizes_list[k].text;
+
+         ti->node_top = &grid_sizes[i][j];
+         ti->sort_priority = value;
+
+         sprintf(identifier, "%d", value);
+         sprintf(name, "%s", text);
+
+         setString(&ti->identifier, identifier);
+         setString(&ti->name, name);
+         setString(&ti->name_sorting, name);
+         setString(&ti->infotext,
+                   (i == 0 ?
+                    (j == 0 ?
+                     STR_SETUP_CHOOSE_GRID_XSIZE_0 :
+                     STR_SETUP_CHOOSE_GRID_YSIZE_0) :
+                    (j == 0 ?
+                     STR_SETUP_CHOOSE_GRID_XSIZE_1 :
+                     STR_SETUP_CHOOSE_GRID_YSIZE_1)));
+
+         pushTreeInfo(&grid_sizes[i][j], ti);
+       }
+
+       /* sort grid size values to start with lowest grid size value */
+       sortTreeInfo(&grid_sizes[i][j]);
+
+       /* set current grid size value to configured grid size value */
+       grid_size_current[i][j] =
+         getTreeInfoFromIdentifier(grid_sizes[i][j],
+                                   i_to_a(j == 0 ?
+                                          setup.touch.grid_xsize[i] :
+                                          setup.touch.grid_ysize[i]));
+
+       /* if that fails, set current grid size to reliable default value */
+       if (grid_size_current[i][j] == NULL)
+         grid_size_current[i][j] =
+           getTreeInfoFromIdentifier(grid_sizes[i][j],
+                                     i_to_a(j == 0 ?
+                                            DEFAULT_GRID_XSIZE(i) :
+                                            DEFAULT_GRID_YSIZE(i)));
+
+       /* if that also fails, set current grid size to first available value */
+       if (grid_size_current[i][j] == NULL)
+         grid_size_current[i][j] = grid_sizes[i][j];
+      }
+    }
+  }
+
   setup.touch.control_type = touch_control_current->identifier;
   setup.touch.move_distance = atoi(move_distance_current->identifier);
   setup.touch.drop_distance = atoi(drop_distance_current->identifier);
+  setup.touch.transparency = atoi(transparency_current->identifier);
 
-  /* needed for displaying volume text instead of identifier */
+  for (i = 0; i < 2; i++)
+  {
+    setup.touch.grid_xsize[i] = atoi(grid_size_current[i][0]->identifier);
+    setup.touch.grid_ysize[i] = atoi(grid_size_current[i][1]->identifier);
+
+    if (i == GRID_ACTIVE_NR())
+    {
+      overlay.grid_xsize = setup.touch.grid_xsize[i];
+      overlay.grid_ysize = setup.touch.grid_ysize[i];
+    }
+  }
+
+  /* needed for displaying value text instead of identifier */
   touch_controls_text = touch_control_current->name;
   move_distance_text = move_distance_current->name;
   drop_distance_text = drop_distance_current->name;
+  transparency_text = transparency_current->name;
+
+  for (i = 0; i < 2; i++)
+    for (j = 0; j < 2; j++)
+      grid_size_text[i][j] = grid_size_current[i][j]->name;
 
   setup_mode = SETUP_MODE_TOUCH;
 
@@ -5569,6 +5824,21 @@ static struct
   { &setup.touch.drop_distance,                execSetupChooseDropDistance     },
   { &setup.touch.drop_distance,                &drop_distance_text             },
 
+  { &setup.touch.transparency,         execSetupChooseTransparency     },
+  { &setup.touch.transparency,         &transparency_text              },
+
+  { &setup.touch.grid_xsize[0],                execSetupChooseGridXSize_0      },
+  { &setup.touch.grid_xsize[0],                &grid_size_text[0][0]           },
+
+  { &setup.touch.grid_ysize[0],                execSetupChooseGridYSize_0      },
+  { &setup.touch.grid_ysize[0],                &grid_size_text[0][1]           },
+
+  { &setup.touch.grid_xsize[1],                execSetupChooseGridXSize_1      },
+  { &setup.touch.grid_xsize[1],                &grid_size_text[1][0]           },
+
+  { &setup.touch.grid_ysize[1],                execSetupChooseGridYSize_1      },
+  { &setup.touch.grid_ysize[1],                &grid_size_text[1][1]           },
+
   { NULL,                              NULL                            }
 };
 
@@ -5751,11 +6021,20 @@ static struct TokenInfo setup_info_touch[] =
   { 0,                 NULL,                   NULL                    }
 };
 
-static struct TokenInfo setup_info_touch_virtual_buttons[] =
+static struct TokenInfo setup_info_touch_virtual_buttons_0[] =
 {
   { TYPE_ENTER_LIST,   execSetupChooseTouchControls, "Touch Control Type:" },
   { TYPE_STRING,       &touch_controls_text,   ""                      },
   { TYPE_EMPTY,                NULL,                   ""                      },
+  { TYPE_ENTER_LIST,   execSetupChooseGridXSize_0, "Horizontal Buttons (Landscape):"   },
+  { TYPE_STRING,       &grid_size_text[0][0],  ""                      },
+  { TYPE_ENTER_LIST,   execSetupChooseGridYSize_0, "Vertical Buttons (Landscape):"     },
+  { TYPE_STRING,       &grid_size_text[0][1],  ""                      },
+  { TYPE_ENTER_LIST,   execSetupChooseTransparency, "Button Transparency:" },
+  { TYPE_STRING,       &transparency_text,     ""                      },
+  { TYPE_SWITCH,       &setup.touch.draw_outlined, "Draw Buttons Outlined:" },
+  { TYPE_SWITCH,       &setup.touch.draw_pressed, "Highlight Pressed Buttons:" },
+  { TYPE_EMPTY,                NULL,                   ""                      },
   { TYPE_ENTER_LIST,   execSetupConfigureVirtualButtons, "Configure Virtual Buttons" },
   { TYPE_EMPTY,                NULL,                   ""                      },
   { TYPE_LEAVE_MENU,   execSetupMain,          "Back"                  },
@@ -5763,6 +6042,33 @@ static struct TokenInfo setup_info_touch_virtual_buttons[] =
   { 0,                 NULL,                   NULL                    }
 };
 
+static struct TokenInfo setup_info_touch_virtual_buttons_1[] =
+{
+  { TYPE_ENTER_LIST,   execSetupChooseTouchControls, "Touch Control Type:" },
+  { TYPE_STRING,       &touch_controls_text,   ""                      },
+  { TYPE_EMPTY,                NULL,                   ""                      },
+  { TYPE_ENTER_LIST,   execSetupChooseGridXSize_1, "Horizontal Buttons (Portrait):"    },
+  { TYPE_STRING,       &grid_size_text[1][0],  ""                      },
+  { TYPE_ENTER_LIST,   execSetupChooseGridYSize_1, "Vertical Buttons (Portrait):"      },
+  { TYPE_STRING,       &grid_size_text[1][1],  ""                      },
+  { TYPE_ENTER_LIST,   execSetupChooseTransparency, "Button Transparency:" },
+  { TYPE_STRING,       &transparency_text,     ""                      },
+  { TYPE_SWITCH,       &setup.touch.draw_outlined, "Draw Buttons Outlined:" },
+  { TYPE_SWITCH,       &setup.touch.draw_pressed, "Highlight Pressed Buttons:" },
+  { TYPE_EMPTY,                NULL,                   ""                      },
+  { TYPE_ENTER_LIST,   execSetupConfigureVirtualButtons, "Configure Virtual Buttons" },
+  { TYPE_EMPTY,                NULL,                   ""                      },
+  { TYPE_LEAVE_MENU,   execSetupMain,          "Back"                  },
+
+  { 0,                 NULL,                   NULL                    }
+};
+
+static struct TokenInfo *setup_info_touch_virtual_buttons[] =
+{
+  setup_info_touch_virtual_buttons_0,
+  setup_info_touch_virtual_buttons_1
+};
+
 static struct TokenInfo setup_info_touch_wipe_gestures[] =
 {
   { TYPE_ENTER_LIST,   execSetupChooseTouchControls, "Touch Control Type:" },
@@ -6197,7 +6503,7 @@ static void DrawSetupScreen_Generic()
     title_string = STR_SETUP_TOUCH;
 
     if (strEqual(setup.touch.control_type, TOUCH_CONTROL_VIRTUAL_BUTTONS))
-      setup_info = setup_info_touch_virtual_buttons;
+      setup_info = setup_info_touch_virtual_buttons[GRID_ACTIVE_NR()];
     else if (strEqual(setup.touch.control_type, TOUCH_CONTROL_WIPE_GESTURES))
       setup_info = setup_info_touch_wipe_gestures;
   }
@@ -7256,13 +7562,19 @@ boolean ConfigureVirtualButtonsMain()
 
            /* press 'Enter' to keep the existing key binding */
            if (key == KSYM_Return ||
+#if defined(TARGET_SDL2)
                key == KSYM_Menu ||
+#endif
                key == KSYM_space)
            {
              step_nr++;
            }
-           else if (key == KSYM_BackSpace ||
-                    key == KSYM_Back)
+           else if (key == KSYM_BackSpace
+#if defined(TARGET_SDL2)
+                    ||
+                    key == KSYM_Back
+#endif
+                    )
            {
              if (step_nr == 0)
              {
@@ -7351,6 +7663,31 @@ boolean ConfigureVirtualButtonsMain()
          }
          break;
 
+#if defined(TARGET_SDL2)
+       case SDL_WINDOWEVENT:
+         HandleWindowEvent((WindowEvent *) &event);
+
+         // check if device has been rotated
+         if (nr != GRID_ACTIVE_NR())
+         {
+           nr = GRID_ACTIVE_NR();
+
+           for (x = 0; x < MAX_GRID_XSIZE; x++)
+             for (y = 0; y < MAX_GRID_YSIZE; y++)
+               grid_button_old[x][y] = grid_button_tmp[x][y] =
+                 overlay.grid_button[x][y];
+         }
+
+         break;
+
+       case SDL_APP_WILLENTERBACKGROUND:
+       case SDL_APP_DIDENTERBACKGROUND:
+       case SDL_APP_WILLENTERFOREGROUND:
+       case SDL_APP_DIDENTERFOREGROUND:
+         HandlePauseResumeEvent((PauseResumeEvent *) &event);
+         break;
+#endif
+
         default:
          HandleOtherEvents(&event);
          break;
@@ -7372,7 +7709,7 @@ boolean ConfigureVirtualButtonsMain()
 
   for (x = 0; x < MAX_GRID_XSIZE; x++)
     for (y = 0; y < MAX_GRID_YSIZE; y++)
-      overlay.grid_button_all[nr][x][y] = overlay.grid_button[x][y];
+      setup.touch.grid_button[nr][x][y] = overlay.grid_button[x][y];
 
   overlay.grid_button_highlight = CHAR_GRID_BUTTON_NONE;
 
@@ -7442,6 +7779,16 @@ void DrawSetupScreen()
     DrawChooseTree(&move_distance_current);
   else if (setup_mode == SETUP_MODE_CHOOSE_DROP_DISTANCE)
     DrawChooseTree(&drop_distance_current);
+  else if (setup_mode == SETUP_MODE_CHOOSE_TRANSPARENCY)
+    DrawChooseTree(&transparency_current);
+  else if (setup_mode == SETUP_MODE_CHOOSE_GRID_XSIZE_0)
+    DrawChooseTree(&grid_size_current[0][0]);
+  else if (setup_mode == SETUP_MODE_CHOOSE_GRID_YSIZE_0)
+    DrawChooseTree(&grid_size_current[0][1]);
+  else if (setup_mode == SETUP_MODE_CHOOSE_GRID_XSIZE_1)
+    DrawChooseTree(&grid_size_current[1][0]);
+  else if (setup_mode == SETUP_MODE_CHOOSE_GRID_YSIZE_1)
+    DrawChooseTree(&grid_size_current[1][1]);
   else
     DrawSetupScreen_Generic();
 
@@ -7460,6 +7807,24 @@ void RedrawSetupScreenAfterFullscreenToggle()
   }
 }
 
+void RedrawSetupScreenAfterScreenRotation(int nr)
+{
+  int x, y;
+
+  if (setup_mode == SETUP_MODE_TOUCH)
+  {
+    // update virtual button settings (depending on screen orientation)
+    DrawSetupScreen();
+  }
+  else if (setup_mode == SETUP_MODE_CONFIG_VIRT_BUTTONS)
+  {
+    // save already configured virtual buttons
+    for (x = 0; x < MAX_GRID_XSIZE; x++)
+      for (y = 0; y < MAX_GRID_YSIZE; y++)
+       setup.touch.grid_button[nr][x][y] = overlay.grid_button[x][y];
+  }
+}
+
 void HandleSetupScreen(int mx, int my, int dx, int dy, int button)
 {
   if (setup_mode == SETUP_MODE_INPUT)
@@ -7494,6 +7859,16 @@ void HandleSetupScreen(int mx, int my, int dx, int dy, int button)
     HandleChooseTree(mx, my, dx, dy, button, &move_distance_current);
   else if (setup_mode == SETUP_MODE_CHOOSE_DROP_DISTANCE)
     HandleChooseTree(mx, my, dx, dy, button, &drop_distance_current);
+  else if (setup_mode == SETUP_MODE_CHOOSE_TRANSPARENCY)
+    HandleChooseTree(mx, my, dx, dy, button, &transparency_current);
+  else if (setup_mode == SETUP_MODE_CHOOSE_GRID_XSIZE_0)
+    HandleChooseTree(mx, my, dx, dy, button, &grid_size_current[0][0]);
+  else if (setup_mode == SETUP_MODE_CHOOSE_GRID_YSIZE_0)
+    HandleChooseTree(mx, my, dx, dy, button, &grid_size_current[0][1]);
+  else if (setup_mode == SETUP_MODE_CHOOSE_GRID_XSIZE_1)
+    HandleChooseTree(mx, my, dx, dy, button, &grid_size_current[1][0]);
+  else if (setup_mode == SETUP_MODE_CHOOSE_GRID_YSIZE_1)
+    HandleChooseTree(mx, my, dx, dy, button, &grid_size_current[1][1]);
   else
     HandleSetupScreen_Generic(mx, my, dx, dy, button);
 }
@@ -7657,6 +8032,7 @@ static void CreateScreenMenubuttons()
 
     gi = CreateGadget(GDI_CUSTOM_ID, id,
                      GDI_CUSTOM_TYPE_ID, i,
+                     GDI_IMAGE_ID, gfx_unpressed,
                      GDI_INFO_TEXT, menubutton_info[i].infotext,
                      GDI_X, x,
                      GDI_Y, y,
@@ -7724,6 +8100,7 @@ static void CreateScreenScrollbuttons()
 
     gi = CreateGadget(GDI_CUSTOM_ID, id,
                      GDI_CUSTOM_TYPE_ID, i,
+                     GDI_IMAGE_ID, gfx_unpressed,
                      GDI_INFO_TEXT, scrollbutton_info[i].infotext,
                      GDI_X, x,
                      GDI_Y, y,
@@ -7796,6 +8173,7 @@ static void CreateScreenScrollbars()
 
     gi = CreateGadget(GDI_CUSTOM_ID, id,
                      GDI_CUSTOM_TYPE_ID, i,
+                     GDI_IMAGE_ID, gfx_unpressed,
                      GDI_INFO_TEXT, scrollbar_info[i].infotext,
                      GDI_X, x,
                      GDI_Y, y,