Browse Source

[switch] Leave TextInput running

Text mode is on by default. Calling SDL_StartTextInput() will start the
virual keyboard, but does not allow for a default value. Calling it as
well as switch_start_text_input() will start the keyboard a secound
time.
We still turn TextInput off on other platforms when it's not needed as
it can require additional resources.
pull/872/head
Anders Jenbo 6 years ago
parent
commit
88c85c54de
  1. 5
      CMakeLists.txt
  2. 3
      SourceS/sdl2_to_1_2_backports.cpp
  3. 12
      SourceS/sdl2_to_1_2_backports.h
  4. 24
      SourceX/DiabloUI/diabloui.cpp
  5. 1
      SourceX/DiabloUI/diabloui.h
  6. 5
      SourceX/DiabloUI/dialogs.cpp
  7. 3
      SourceX/controls/menu_controls.cpp

5
CMakeLists.txt

@ -301,11 +301,6 @@ set(devilutionx_SRCS
Packaging/resources/CharisSILB.ttf
Packaging/windows/devilutionx.rc)
if(USE_SDL1)
list(APPEND devilutionx_SRCS
SourceS/sdl2_to_1_2_backports.cpp)
endif()
if(NOT NONET)
list(APPEND devilutionx_SRCS
SourceX/dvlnet/tcp_client.cpp

3
SourceS/sdl2_to_1_2_backports.cpp

@ -1,3 +0,0 @@
#include "sdl2_to_1_2_backports.h"
SDL_bool SDLBackport_IsTextInputActive = SDL_FALSE;

12
SourceS/sdl2_to_1_2_backports.h

@ -59,20 +59,12 @@ inline void SDL_Log(const char *fmt, ...)
puts("");
}
extern SDL_bool SDLBackport_IsTextInputActive;
inline SDL_bool SDL_IsTextInputActive()
{
return SDLBackport_IsTextInputActive;
}
inline void SDL_StartTextInput()
{
SDLBackport_IsTextInputActive = SDL_TRUE;
}
inline void SDL_StopTextInput()
inline void SDL_SetTextInputRect(const SDL_Rect *r)
{
SDLBackport_IsTextInputActive = SDL_FALSE;
}
//== Graphics helpers

24
SourceX/DiabloUI/diabloui.cpp

@ -46,6 +46,7 @@ std::vector<UiItemBase *> gUiItems;
bool UiItemsWraps;
char *UiTextInput;
int UiTextInputLen;
bool textInputActive = true;
int SelectedItem = 0;
@ -89,15 +90,20 @@ void UiInitList(int min, int max, void (*fnFocus)(int value), void (*fnSelect)(i
if (fnFocus)
fnFocus(min);
#ifndef __SWITCH__
SDL_StopTextInput(); // input is enabled by default
#endif
textInputActive = false;
for (std::size_t i = 0; i < items.size(); i++) {
if (items[i]->m_type == UI_EDIT) {
UiEdit *pItemUIEdit = (UiEdit *)items[i];
SDL_SetTextInputRect(&items[i]->m_rect);
textInputActive = true;
#ifdef __SWITCH__
switch_start_text_input("", pItemUIEdit->m_value, pItemUIEdit->m_max_length, /*multiline=*/0);
#endif
#else
SDL_StartTextInput();
#endif
UiTextInput = pItemUIEdit->m_value;
UiTextInputLen = pItemUIEdit->m_max_length;
}
@ -272,7 +278,7 @@ void UiFocusNavigation(SDL_Event *event)
}
#endif
if (SDL_IsTextInputActive()) {
if (textInputActive) {
switch (event->type) {
case SDL_KEYDOWN: {
switch (event->key.keysym.sym) {
@ -314,7 +320,9 @@ void UiFocusNavigation(SDL_Event *event)
}
#ifndef USE_SDL1
case SDL_TEXTINPUT:
selhero_CatToName(event->text.text, UiTextInput, UiTextInputLen);
if (textInputActive) {
selhero_CatToName(event->text.text, UiTextInput, UiTextInputLen);
}
return;
#endif
default:
@ -368,11 +376,13 @@ void UiHandleEvents(SDL_Event *event)
void UiFocusNavigationSelect()
{
UiPlaySelectSound();
if (SDL_IsTextInputActive()) {
if (textInputActive) {
if (strlen(UiTextInput) == 0) {
return;
}
#ifndef __SWITCH__
SDL_StopTextInput();
#endif
UiTextInput = NULL;
UiTextInputLen = 0;
}
@ -383,8 +393,10 @@ void UiFocusNavigationSelect()
void UiFocusNavigationEsc()
{
UiPlaySelectSound();
if (SDL_IsTextInputActive()) {
if (textInputActive) {
#ifndef __SWITCH__
SDL_StopTextInput();
#endif
UiTextInput = NULL;
UiTextInputLen = 0;
}

1
SourceX/DiabloUI/diabloui.h

@ -9,6 +9,7 @@
namespace dvl {
extern int SelectedItem;
extern bool textInputActive;
typedef enum _artFocus {
FOCUS_SMALL,

5
SourceX/DiabloUI/dialogs.cpp

@ -18,7 +18,6 @@ namespace {
Art dialogArt;
bool fontWasLoaded;
bool textInputWasActive;
bool dialogEnd;
@ -204,8 +203,6 @@ void Init(const char *text, const char *caption, bool error, bool renderBehind)
fontWasLoaded = font != NULL;
if (!fontWasLoaded)
LoadTtfFont();
textInputWasActive = SDL_IsTextInputActive();
SDL_StopTextInput();
}
void Deinit()
@ -214,8 +211,6 @@ void Deinit()
UnloadSmlButtonArt();
if (!fontWasLoaded)
UnloadTtfFont();
if (textInputWasActive)
SDL_StartTextInput();
for (std::size_t i = 0; i < vecOkDialog.size(); i++) {
UiItemBase *pUIItem = vecOkDialog[i];

3
SourceX/controls/menu_controls.cpp

@ -2,6 +2,7 @@
#include "controls/controller.h"
#include "controls/remap_keyboard.h"
#include "DiabloUI/diabloui.h"
namespace dvl {
@ -71,7 +72,7 @@ MenuAction GetMenuAction(const SDL_Event &event)
case SDLK_KP_ENTER:
return MenuAction_SELECT;
case SDLK_SPACE:
if (!SDL_IsTextInputActive()) {
if (!textInputActive) {
return MenuAction_SELECT;
}
break;

Loading…
Cancel
Save