added shifting up video display when activating screen keyboard (Android)
authorHolger Schemel <info@artsoft.org>
Wed, 26 Oct 2016 06:57:46 +0000 (08:57 +0200)
committerHolger Schemel <info@artsoft.org>
Wed, 26 Oct 2016 06:57:46 +0000 (08:57 +0200)
src/events.c
src/libgame/gadgets.c
src/libgame/sdl.c
src/libgame/system.c
src/libgame/system.h
src/screens.c

index 2d1e0659a3dc2fb73449d40f9b4462c25aae9601..e197be5cef3039e9111ea89e021a4cfd09dfad6e 100644 (file)
@@ -867,21 +867,16 @@ void HandleTextEvent(TextEvent *event)
        GetKeyModState());
 #endif
 
-#if defined(PLATFORM_ANDROID)
-  if (game_status == GAME_MODE_PSEUDO_TYPENAME)
-  {
-    HandleTypeName(0, key);
-
+#if !defined(HAS_SCREEN_KEYBOARD)
+  // non-mobile devices: only handle key input with modifier keys pressed here
+  // (every other key input is handled directly as physical key input event)
+  if (!checkTextInputKeyModState())
     return;
-  }
 #endif
 
-  // only handle key input with text modifier keys pressed
-  if (checkTextInputKeyModState())
-  {
-    HandleKey(key, KEY_PRESSED);
-    HandleKey(key, KEY_RELEASED);
-  }
+  // process text input as "classic" (with uppercase etc.) key input event
+  HandleKey(key, KEY_PRESSED);
+  HandleKey(key, KEY_RELEASED);
 }
 
 void HandlePauseResumeEvent(PauseResumeEvent *event)
index ce939a75de69cbad9d507d3a0a34f6c8cc1a422d..736f1465fb2d381b5a07419f4f28759ff55de656 100644 (file)
@@ -1605,6 +1605,8 @@ boolean HandleGadgets(int mx, int my, int button)
 
     if (gadget_pressed_inside_select_line)
       new_gi = NULL;
+
+    StopTextInput();
   }
 
   gadget_pressed =
@@ -1706,6 +1708,8 @@ boolean HandleGadgets(int mx, int my, int button)
 
       if (gi->textinput.cursor_position != old_cursor_position)
        DrawGadget(gi, DG_PRESSED, gi->direct_draw);
+
+      StartTextInput(gi->x, gi->y);
     }
     else if (gi->type & GD_TYPE_TEXT_AREA && button != 0 && !motion_status)
     {
@@ -1720,6 +1724,8 @@ boolean HandleGadgets(int mx, int my, int button)
 
       if (gi->textarea.cursor_position != old_cursor_position)
        DrawGadget(gi, DG_PRESSED, gi->direct_draw);
+
+      StartTextInput(gi->x, gi->y);
     }
     else if (gi->type & GD_TYPE_SELECTBOX && gi->selectbox.open &&
             !keep_selectbox_open)
@@ -2082,7 +2088,11 @@ boolean HandleGadgetsKeyInput(Key key)
        gi->type & GD_TYPE_SELECTBOX))
     return FALSE;
 
-  if (key == KSYM_Return)      /* valid for both text input and selectbox */
+  if (key == KSYM_Escape)
+  {
+    StopTextInput();
+  }
+  else if (key == KSYM_Return) /* valid for both text input and selectbox */
   {
     boolean gadget_changed = ((gi->event_mask & GD_EVENT_TEXT_RETURN) != 0);
 
@@ -2094,6 +2104,8 @@ boolean HandleGadgetsKeyInput(Key key)
        strcpy(gi->textinput.last_value, gi->textinput.value);
       else
        gadget_changed = FALSE;
+
+      StopTextInput();
     }
     else if (gi->type & GD_TYPE_SELECTBOX)
     {
index f805ddfd6c1ef5a213a805026bd935648478aea1..ba3b6ac41eb601a9623acaa9d2b65b49da8037ac 100644 (file)
@@ -129,6 +129,28 @@ static void UpdateScreenExt(SDL_Rect *rect, boolean with_frame_delay)
     SDL_UpdateTexture(sdl_texture, NULL, screen->pixels, screen->pitch);
   }
 
+  SDL_Rect *src_rect1 = NULL, *dst_rect1 = NULL;
+  SDL_Rect *src_rect2 = NULL, *dst_rect2 = NULL;
+#if defined(HAS_SCREEN_KEYBOARD)
+  SDL_Rect src_rect_up = { 0, video.height / 2, video.width, video.height / 2 };
+  SDL_Rect dst_rect_up = { 0, 0,                video.width, video.height / 2 };
+
+  if (video.shifted_up)
+  {
+    if (video.screen_rendering_mode == SPECIAL_RENDERING_TARGET ||
+       video.screen_rendering_mode == SPECIAL_RENDERING_DOUBLE)
+    {
+      src_rect2 = &src_rect_up;
+      dst_rect2 = &dst_rect_up;
+    }
+    else
+    {
+      src_rect1 = &src_rect_up;
+      dst_rect1 = &dst_rect_up;
+    }
+  }
+#endif
+
   // clear render target buffer
   SDL_RenderClear(sdl_renderer);
 
@@ -139,7 +161,7 @@ static void UpdateScreenExt(SDL_Rect *rect, boolean with_frame_delay)
 
   // copy backbuffer texture to render target buffer
   if (video.screen_rendering_mode != SPECIAL_RENDERING_TARGET)
-    SDL_RenderCopy(sdl_renderer, sdl_texture_stream, NULL, NULL);
+    SDL_RenderCopy(sdl_renderer, sdl_texture_stream, src_rect1, dst_rect1);
 
   if (video.screen_rendering_mode != SPECIAL_RENDERING_BITMAP)
     FinalizeScreen(DRAW_TO_SCREEN);
@@ -149,7 +171,7 @@ static void UpdateScreenExt(SDL_Rect *rect, boolean with_frame_delay)
       video.screen_rendering_mode == SPECIAL_RENDERING_DOUBLE)
   {
     SDL_SetRenderTarget(sdl_renderer, NULL);
-    SDL_RenderCopy(sdl_renderer, sdl_texture_target, NULL, NULL);
+    SDL_RenderCopy(sdl_renderer, sdl_texture_target, src_rect2, dst_rect2);
   }
 #endif
 
index d8c79937451ab0b05fa4b517a54c225c54c5fb21..df401b5a57a6ebea20d8f539f6eedff4be5076b9 100644 (file)
@@ -386,6 +386,8 @@ void InitVideoBuffer(int width, int height, int depth, boolean fullscreen)
   video.frame_delay = 0;
   video.frame_delay_value = GAME_FRAME_DELAY;
 
+  video.shifted_up = FALSE;
+
   SDLInitVideoBuffer(fullscreen);
 
   video.initialized = TRUE;
@@ -1511,6 +1513,29 @@ KeyMod GetKeyModStateFromEvents()
   return HandleKeyModState(KSYM_UNDEFINED, 0);
 }
 
+void StartTextInput(int x, int y)
+{
+#if defined(TARGET_SDL2)
+  SDL_StartTextInput();
+
+#if defined(HAS_SCREEN_KEYBOARD)
+  if (y > video.height / 2)
+    video.shifted_up = TRUE;
+#endif
+#endif
+}
+
+void StopTextInput()
+{
+#if defined(TARGET_SDL2)
+  SDL_StopTextInput();
+
+#if defined(HAS_SCREEN_KEYBOARD)
+  video.shifted_up = FALSE;
+#endif
+#endif
+}
+
 boolean CheckCloseWindowEvent(ClientMessageEvent *event)
 {
   if (event->type != EVENT_CLIENTMESSAGE)
index 48e06ae1d3394aabac4916e46af371210df2b848..009cbf81bc9dda05036e1ffaae98499be7ed3809 100644 (file)
 #define TOUCH_DROP_DISTANCE_DEFAULT    5
 
 
+/* values for screen keyboard on mobile devices */
+#if defined(PLATFORM_ANDROID)
+#define HAS_SCREEN_KEYBOARD
+#endif
+
+
 /* default input keys */
 #define DEFAULT_KEY_LEFT               KSYM_Left
 #define DEFAULT_KEY_RIGHT              KSYM_Right
@@ -801,6 +807,8 @@ struct VideoSystemInfo
   unsigned int frame_delay;
   unsigned int frame_delay_value;
 
+  boolean shifted_up;
+
   boolean initialized;
 };
 
@@ -1488,6 +1496,8 @@ Key GetEventKey(KeyEvent *, boolean);
 KeyMod HandleKeyModState(Key, int);
 KeyMod GetKeyModState();
 KeyMod GetKeyModStateFromEvents();
+void StartTextInput(int, int);
+void StopTextInput();
 boolean CheckCloseWindowEvent(ClientMessageEvent *);
 
 void InitJoysticks();
index 236361866c8f39fa7256e8ae5c4f4527d12b540c..d38878c320e33c53c66577debb3b1148b1bfa6b5 100644 (file)
@@ -3585,9 +3585,7 @@ void HandleTypeName(int newxpos, Key key)
 
     xpos = newxpos;
 
-#if defined(TARGET_SDL2)
-    SDL_StartTextInput();
-#endif
+    StartTextInput(startx, starty);
   }
   else if (is_valid_key_char && xpos < MAX_PLAYER_NAME_LEN)
   {
@@ -3634,9 +3632,7 @@ void HandleTypeName(int newxpos, Key key)
 
     DrawText(startx, starty, setup.player_name, font_nr);
 
-#if defined(TARGET_SDL2)
-    SDL_StopTextInput();
-#endif
+    StopTextInput();
   }
 }