fixed bug with disabling overlay buttons during screen keyboard on Android
[rocksndiamonds.git] / src / events.c
index 24106461affff97d5be9f3fef5ac0134b6ea4db2..e07b8494cef2b9167b45382cb919bf5e69a3189f 100644 (file)
@@ -43,6 +43,7 @@ static boolean stop_processing_events = FALSE;
 
 
 // forward declarations for internal use
+static void ClearTouchInfo(void);
 static void HandleNoEvent(void);
 static void HandleEventActions(void);
 
@@ -213,6 +214,8 @@ static void HandleEvents(void)
 
   while (NextValidEvent(&event))
   {
+    int game_status_last = game_status;
+
     switch (event.type)
     {
       case EVENT_BUTTONPRESS:
@@ -263,6 +266,10 @@ static void HandleEvents(void)
        break;
     }
 
+    // always handle events within delay period if game status has changed
+    if (game_status != game_status_last)
+      ResetDelayCounter(&event_frame_delay);
+
     // do not handle events for longer than standard frame delay period
     if (DelayReached(&event_frame_delay, event_frame_delay_value))
       break;
@@ -407,6 +414,7 @@ void ClearEventQueue(void)
        button_status = MB_RELEASED;
        break;
 
+      case EVENT_FINGERRELEASE:
       case EVENT_KEYRELEASE:
        ClearPlayerAction();
        break;
@@ -442,6 +450,10 @@ void ClearPlayerAction(void)
     stored_player[i].snap_action = 0;
   }
 
+  // simulate finger release events for still pressed virtual buttons
+  overlay.grid_button_action = JOY_NO_ACTION;
+
+  ClearTouchInfo();
   ClearJoystickState();
   ClearPlayerMouseAction();
 }
@@ -667,19 +679,10 @@ void HandleWindowEvent(WindowEvent *event)
        // check if screen orientation has changed (should always be true here)
        if (nr != GRID_ACTIVE_NR())
        {
-         int x, y;
-
          if (game_status == GAME_MODE_SETUP)
            RedrawSetupScreenAfterScreenRotation(nr);
 
-         nr = GRID_ACTIVE_NR();
-
-         overlay.grid_xsize = setup.touch.grid_xsize[nr];
-         overlay.grid_ysize = setup.touch.grid_ysize[nr];
-
-         for (x = 0; x < MAX_GRID_XSIZE; x++)
-           for (y = 0; y < MAX_GRID_YSIZE; y++)
-             overlay.grid_button[x][y] = setup.touch.grid_button[nr][x][y];
+         SetOverlayGridSizeAndButtons();
        }
       }
     }
@@ -698,6 +701,24 @@ static struct
   byte action;
 } touch_info[NUM_TOUCH_FINGERS];
 
+static void SetTouchInfo(int pos, SDL_FingerID finger_id, int counter,
+                        Key key, byte action)
+{
+  touch_info[pos].touched = (action != JOY_NO_ACTION);
+  touch_info[pos].finger_id = finger_id;
+  touch_info[pos].counter = counter;
+  touch_info[pos].key = key;
+  touch_info[pos].action = action;
+}
+
+static void ClearTouchInfo(void)
+{
+  int i;
+
+  for (i = 0; i < NUM_TOUCH_FINGERS; i++)
+    SetTouchInfo(i, 0, 0, 0, JOY_NO_ACTION);
+}
+
 static void HandleFingerEvent_VirtualButtons(FingerEvent *event)
 {
   int x = event->x * overlay.grid_xsize;
@@ -807,11 +828,7 @@ static void HandleFingerEvent_VirtualButtons(FingerEvent *event)
        }
       }
 
-      touch_info[i].touched = TRUE;
-      touch_info[i].finger_id = event->fingerId;
-      touch_info[i].counter = Counter();
-      touch_info[i].key = key;
-      touch_info[i].action = grid_button_action;
+      SetTouchInfo(i, event->fingerId, Counter(), key, grid_button_action);
     }
     else
     {
@@ -823,11 +840,7 @@ static void HandleFingerEvent_VirtualButtons(FingerEvent *event)
              getKeyNameFromKey(touch_info[i].key), "KEY_RELEASED", i);
       }
 
-      touch_info[i].touched = FALSE;
-      touch_info[i].finger_id = 0;
-      touch_info[i].counter = 0;
-      touch_info[i].key = 0;
-      touch_info[i].action = JOY_NO_ACTION;
+      SetTouchInfo(i, 0, 0, 0, JOY_NO_ACTION);
     }
   }
 }
@@ -1386,6 +1399,10 @@ static boolean checkTextInputKey(Key key)
   if (game_status == GAME_MODE_PLAYING)
     return FALSE;
 
+  // if Shift or right Alt key is pressed, handle key as text input
+  if ((GetKeyModState() & KMOD_TextInput) != KMOD_None)
+    return TRUE;
+
   // ignore raw keys as text input when not in text input mode
   if (KSYM_RAW(key) && !textinput_status)
     return FALSE;
@@ -1459,7 +1476,7 @@ void HandleKeyEvent(KeyEvent *event)
     if (key_status == KEY_PRESSED)
       SetOverlayEnabled(!GetOverlayEnabled());
   }
-  else
+  else if (!textinput_status)
   {
     // for any other "real" key event, disable virtual buttons
     SetOverlayEnabled(FALSE);
@@ -1738,7 +1755,12 @@ void HandleButton(int mx, int my, int button, int button_nr)
       break;
 
     case GAME_MODE_PSEUDO_TYPENAME:
-      HandleTypeName(0, KSYM_Return);
+    case GAME_MODE_PSEUDO_TYPENAMES:
+      HandleTypeName(KSYM_Return);
+      break;
+
+    case GAME_MODE_NAMES:
+      HandleChoosePlayerName(mx, my, 0, 0, button);
       break;
 
     case GAME_MODE_LEVELS:
@@ -1879,6 +1901,10 @@ static void HandleKeysSpecial(Key key)
     {
       global.show_frames_per_second = !global.show_frames_per_second;
     }
+    else if (strSuffix(cheat_input, ":xsn"))
+    {
+      tile_cursor.xsn_debug = TRUE;
+    }
   }
   else if (game_status == GAME_MODE_PLAYING)
   {
@@ -2282,11 +2308,13 @@ void HandleKey(Key key, int key_status)
   switch (game_status)
   {
     case GAME_MODE_PSEUDO_TYPENAME:
-      HandleTypeName(0, key);
+    case GAME_MODE_PSEUDO_TYPENAMES:
+      HandleTypeName(key);
       break;
 
     case GAME_MODE_TITLE:
     case GAME_MODE_MAIN:
+    case GAME_MODE_NAMES:
     case GAME_MODE_LEVELS:
     case GAME_MODE_LEVELNR:
     case GAME_MODE_SETUP:
@@ -2304,6 +2332,8 @@ void HandleKey(Key key, int key_status)
            HandleTitleScreen(0, 0, 0, 0, MB_MENU_CHOICE);
          else if (game_status == GAME_MODE_MAIN)
            HandleMainMenu(0, 0, 0, 0, MB_MENU_CHOICE);
+          else if (game_status == GAME_MODE_NAMES)
+            HandleChoosePlayerName(0, 0, 0, 0, MB_MENU_CHOICE);
           else if (game_status == GAME_MODE_LEVELS)
             HandleChooseLevelSet(0, 0, 0, 0, MB_MENU_CHOICE);
           else if (game_status == GAME_MODE_LEVELNR)
@@ -2322,6 +2352,8 @@ void HandleKey(Key key, int key_status)
 
          if (game_status == GAME_MODE_TITLE)
            HandleTitleScreen(0, 0, 0, 0, MB_MENU_LEAVE);
+          else if (game_status == GAME_MODE_NAMES)
+            HandleChoosePlayerName(0, 0, 0, 0, MB_MENU_LEAVE);
           else if (game_status == GAME_MODE_LEVELS)
             HandleChooseLevelSet(0, 0, 0, 0, MB_MENU_LEAVE);
           else if (game_status == GAME_MODE_LEVELNR)
@@ -2335,7 +2367,9 @@ void HandleKey(Key key, int key_status)
          break;
 
         case KSYM_Page_Up:
-          if (game_status == GAME_MODE_LEVELS)
+          if (game_status == GAME_MODE_NAMES)
+            HandleChoosePlayerName(0, 0, 0, -1 * SCROLL_PAGE, MB_MENU_MARK);
+          else if (game_status == GAME_MODE_LEVELS)
             HandleChooseLevelSet(0, 0, 0, -1 * SCROLL_PAGE, MB_MENU_MARK);
           else if (game_status == GAME_MODE_LEVELNR)
             HandleChooseLevelNr(0, 0, 0, -1 * SCROLL_PAGE, MB_MENU_MARK);
@@ -2348,7 +2382,9 @@ void HandleKey(Key key, int key_status)
          break;
 
         case KSYM_Page_Down:
-          if (game_status == GAME_MODE_LEVELS)
+          if (game_status == GAME_MODE_NAMES)
+            HandleChoosePlayerName(0, 0, 0, +1 * SCROLL_PAGE, MB_MENU_MARK);
+          else if (game_status == GAME_MODE_LEVELS)
             HandleChooseLevelSet(0, 0, 0, +1 * SCROLL_PAGE, MB_MENU_MARK);
           else if (game_status == GAME_MODE_LEVELNR)
             HandleChooseLevelNr(0, 0, 0, +1 * SCROLL_PAGE, MB_MENU_MARK);
@@ -2532,6 +2568,7 @@ void HandleJoystick(void)
   }
 
   if (newbutton && (game_status == GAME_MODE_PSEUDO_TYPENAME ||
+                   game_status == GAME_MODE_PSEUDO_TYPENAMES ||
                    anyTextGadgetActive()))
   {
     // leave name input in main menu or text input gadget
@@ -2578,6 +2615,7 @@ void HandleJoystick(void)
   {
     case GAME_MODE_TITLE:
     case GAME_MODE_MAIN:
+    case GAME_MODE_NAMES:
     case GAME_MODE_LEVELS:
     case GAME_MODE_LEVELNR:
     case GAME_MODE_SETUP:
@@ -2591,6 +2629,8 @@ void HandleJoystick(void)
        HandleTitleScreen(0,0,dx,dy, newbutton ? MB_MENU_CHOICE : MB_MENU_MARK);
       else if (game_status == GAME_MODE_MAIN)
        HandleMainMenu(0,0,dx,dy, newbutton ? MB_MENU_CHOICE : MB_MENU_MARK);
+      else if (game_status == GAME_MODE_NAMES)
+        HandleChoosePlayerName(0,0,dx,dy,newbutton?MB_MENU_CHOICE:MB_MENU_MARK);
       else if (game_status == GAME_MODE_LEVELS)
         HandleChooseLevelSet(0,0,dx,dy,newbutton?MB_MENU_CHOICE : MB_MENU_MARK);
       else if (game_status == GAME_MODE_LEVELNR)