Improve screen keyboard handling for android (tv)

And remove some android ifdef for wayland on screen keyboard later
This commit is contained in:
Benau 2019-05-21 12:43:20 +08:00
parent f14d8fd921
commit 1814472214
8 changed files with 58 additions and 35 deletions

View File

@ -262,7 +262,13 @@ namespace irr
virtual bool activateJoysticks(core::array<SJoystickInfo>& joystickInfo) =0; virtual bool activateJoysticks(core::array<SJoystickInfo>& joystickInfo) =0;
//! Returns true if system has touch device //! Returns true if system has touch device
virtual bool supportsTouchDevice() =0; virtual bool supportsTouchDevice() const = 0;
//! Returns true if system has hardware keyboard attached
virtual bool hasHardwareKeyboard() const = 0;
//! Returns true if system has native on screen keyboard
virtual bool hasOnScreenKeyboard() const = 0;
//! Set the current Gamma Value for the Display //! Set the current Gamma Value for the Display
virtual bool setGammaRamp(f32 red, f32 green, f32 blue, virtual bool setGammaRamp(f32 red, f32 green, f32 blue,
@ -290,11 +296,11 @@ namespace irr
virtual E_DEVICE_TYPE getType() const = 0; virtual E_DEVICE_TYPE getType() const = 0;
/** Onscreen keyboard addition, to determine how much to move vertically. */ /** Onscreen keyboard addition, to determine how much to move vertically. */
virtual u32 getScreenHeight() const { return 0; } virtual u32 getScreenHeight() const = 0;
virtual u32 getOnScreenKeyboardHeight() const { return 0; } virtual u32 getOnScreenKeyboardHeight() const = 0;
virtual s32 getMovedHeight() const { return 0; } virtual s32 getMovedHeight() const = 0;
virtual void toggleOnScreenKeyboard(bool show) { } virtual void toggleOnScreenKeyboard(bool show) = 0;
virtual void registerGetMovedHeightFunction(HeightFunc) { } virtual void registerGetMovedHeightFunction(HeightFunc) = 0;
//! Check if a driver type is supported by the engine. //! Check if a driver type is supported by the engine.
/** Even if true is returned the driver may not be available /** Even if true is returned the driver may not be available

View File

@ -1754,6 +1754,11 @@ bool CIrrDeviceAndroid::isGyroscopeAvailable()
return (Gyroscope != NULL); return (Gyroscope != NULL);
} }
bool CIrrDeviceAndroid::hasHardwareKeyboard() const
{
int32_t keyboard = AConfiguration_getKeyboard(Android->config);
return (keyboard == ACONFIGURATION_KEYBOARD_QWERTY);
}
} // end namespace irr } // end namespace irr

View File

@ -75,7 +75,11 @@ namespace irr
virtual bool isGyroscopeAvailable(); virtual bool isGyroscopeAvailable();
virtual void setTextInputEnabled(bool enabled) {TextInputEnabled = enabled;} virtual void setTextInputEnabled(bool enabled) {TextInputEnabled = enabled;}
virtual void toggleOnScreenKeyboard(bool show); virtual void toggleOnScreenKeyboard(bool show);
virtual bool supportsTouchDevice() { return HasTouchDevice; } virtual bool supportsTouchDevice() const { return HasTouchDevice; }
virtual bool hasHardwareKeyboard() const;
// ATM if there is touch device we assume native screen keyboard is
// available which for example android tv doesn't
virtual bool hasOnScreenKeyboard() const { return HasTouchDevice; }
virtual u32 getScreenHeight() const { return m_screen_height; } virtual u32 getScreenHeight() const { return m_screen_height; }
virtual u32 getOnScreenKeyboardHeight() const; virtual u32 getOnScreenKeyboardHeight() const;
virtual s32 getMovedHeight() const { return m_moved_height; } virtual s32 getMovedHeight() const { return m_moved_height; }

View File

@ -118,9 +118,22 @@ namespace irr
//! Activate any joysticks, and generate events for them. //! Activate any joysticks, and generate events for them.
virtual bool activateJoysticks(core::array<SJoystickInfo> & joystickInfo); virtual bool activateJoysticks(core::array<SJoystickInfo> & joystickInfo);
/** Onscreen keyboard addition, to determine how much to move vertically. */
virtual u32 getScreenHeight() const { return 0; }
virtual u32 getOnScreenKeyboardHeight() const { return 0; }
virtual s32 getMovedHeight() const { return 0; }
virtual void toggleOnScreenKeyboard(bool show) {}
virtual void registerGetMovedHeightFunction(HeightFunc) {}
//! Returns true if system has touch device //! Returns true if system has touch device
virtual bool supportsTouchDevice() { return false; } virtual bool supportsTouchDevice() const { return false; }
//! Returns true if system has hardware keyboard attached
virtual bool hasHardwareKeyboard() const { return true; }
//! Returns true if system has native on screen keyboard
virtual bool hasOnScreenKeyboard() const { return false; }
//! Set the current Gamma Value for the Display //! Set the current Gamma Value for the Display
virtual bool setGammaRamp( f32 red, f32 green, f32 blue, f32 brightness, f32 contrast ); virtual bool setGammaRamp( f32 red, f32 green, f32 blue, f32 brightness, f32 contrast );

View File

@ -535,7 +535,7 @@ namespace UserConfigParams
PARAM_DEFAULT( IntUserConfigParam(0, "screen_keyboard_mode", PARAM_DEFAULT( IntUserConfigParam(0, "screen_keyboard_mode",
&m_multitouch_group, &m_multitouch_group,
"Screen keyboard mode: 0 = disabled, 1 = enabled if no hardware " "Screen keyboard mode: 0 = disabled, 1 = enabled if no hardware "
"keyboard, 2 = always enabled, 3 = android keyboard (experimental)") ); "keyboard, 2 = always enabled") );
// ---- GP start order // ---- GP start order
PARAM_PREFIX GroupUserConfigParam m_gp_start_order PARAM_PREFIX GroupUserConfigParam m_gp_start_order

View File

@ -737,7 +737,6 @@ void IrrDriver::initDevice()
#endif #endif
m_pointer_shown = true; m_pointer_shown = true;
#ifdef ANDROID
if (ProfileWorld::isNoGraphics()) if (ProfileWorld::isNoGraphics())
return; return;
@ -768,7 +767,6 @@ void IrrDriver::initDevice()
} }
return screen_keyboard_height - element_height; return screen_keyboard_height - element_height;
}); });
#endif
} // initDevice } // initDevice
// ---------------------------------------------------------------------------- // ----------------------------------------------------------------------------

View File

@ -503,21 +503,20 @@ bool ScreenKeyboard::onEscapePressed()
} // onEscapePressed } // onEscapePressed
// ---------------------------------------------------------------------------- // ----------------------------------------------------------------------------
/** A function that determines if screen keyboard should be activated /** A function that determines if (native) screen keyboard should be activated
*/ */
bool ScreenKeyboard::shouldUseScreenKeyboard() bool ScreenKeyboard::shouldUseScreenKeyboard()
{ {
bool use_screen_keyboard = UserConfigParams::m_screen_keyboard == 2; bool always_use_screen_keyboard =
UserConfigParams::m_screen_keyboard == 2;
#ifdef ANDROID
// Enable if no hardware keyboard
if (UserConfigParams::m_screen_keyboard == 1) if (UserConfigParams::m_screen_keyboard == 1)
{ {
int32_t keyboard = AConfiguration_getKeyboard( if (irr_driver->getDevice()->hasHardwareKeyboard())
global_android_app->config); return false;
return true;
use_screen_keyboard = (keyboard != ACONFIGURATION_KEYBOARD_QWERTY);
} }
#endif
return always_use_screen_keyboard;
return use_screen_keyboard;
} }

View File

@ -127,8 +127,9 @@ CGUIEditBox::~CGUIEditBox()
irr_driver->getDevice()); irr_driver->getDevice());
dl->setTextInputEnabled(false); dl->setTextInputEnabled(false);
} }
irr_driver->getDevice()->toggleOnScreenKeyboard(false);
#endif #endif
irr_driver->getDevice()->toggleOnScreenKeyboard(false);
#endif #endif
} }
@ -610,9 +611,7 @@ bool CGUIEditBox::processKey(const SEvent& event)
} }
else else
{ {
#ifdef ANDROID
irr_driver->getDevice()->toggleOnScreenKeyboard(false); irr_driver->getDevice()->toggleOnScreenKeyboard(false);
#endif
sendGuiEvent( EGET_EDITBOX_ENTER ); sendGuiEvent( EGET_EDITBOX_ENTER );
} }
break; break;
@ -1305,14 +1304,12 @@ bool CGUIEditBox::processMouse(const SEvent& event)
if (GUIEngine::ScreenKeyboard::shouldUseScreenKeyboard()) if (GUIEngine::ScreenKeyboard::shouldUseScreenKeyboard())
{ {
openScreenKeyboard(); if (irr_driver->getDevice()->hasOnScreenKeyboard())
irr_driver->getDevice()->toggleOnScreenKeyboard(true);
else
openScreenKeyboard();
} }
#ifdef ANDROID
else if (UserConfigParams::m_screen_keyboard == 3)
{
irr_driver->getDevice()->toggleOnScreenKeyboard(true);
}
#endif
// move cursor // move cursor
CursorPos = getCursorPos(event.MouseInput.X, event.MouseInput.Y); CursorPos = getCursorPos(event.MouseInput.X, event.MouseInput.Y);
@ -1773,9 +1770,10 @@ void CGUIEditBox::deserializeAttributes(io::IAttributes* in, io::SAttributeReadW
void CGUIEditBox::openScreenKeyboard() void CGUIEditBox::openScreenKeyboard()
{ {
if (UserConfigParams::m_screen_keyboard == 3) // If the device has native on screen keyboard, always use it
if (irr_driver->getDevice()->hasOnScreenKeyboard())
return; return;
if (GUIEngine::ScreenKeyboard::getCurrent() != NULL) if (GUIEngine::ScreenKeyboard::getCurrent() != NULL)
return; return;