diff --git a/Engine/source/platform/platformInput.h b/Engine/source/platform/platformInput.h index 6abc459e7..083e7ea85 100644 --- a/Engine/source/platform/platformInput.h +++ b/Engine/source/platform/platformInput.h @@ -118,6 +118,9 @@ public: static U8 getModifierKeys() {return smModifierKeys;} static void setModifierKeys(U8 mod) {smModifierKeys = mod;} + + static void attemptSwitchToKeyboardLayout( U32 layout ); + #ifdef LOG_INPUT static void log( const char* format, ... ); #endif diff --git a/Engine/source/platformWin32/winInput.cpp b/Engine/source/platformWin32/winInput.cpp index e4fcdba57..c5f53e7e5 100644 --- a/Engine/source/platformWin32/winInput.cpp +++ b/Engine/source/platformWin32/winInput.cpp @@ -33,6 +33,8 @@ #include #endif +#include + // Static class variables: InputManager* Input::smManager; bool Input::smActive; @@ -79,6 +81,10 @@ void Input::init() destroy(); +#ifdef TORQUE_DEFAULT_KEYBOARD_LAYOUT + attemptSwitchToKeyboardLayout( TORQUE_DEFAULT_KEYBOARD_LAYOUT ); +#endif + #ifdef LOG_INPUT struct tm* newTime; time_t aclock; @@ -487,6 +493,18 @@ InputManager* Input::getManager() return( smManager ); } +//------------------------------------------------------------------------------ +void Input::attemptSwitchToKeyboardLayout( U32 layout ) +{ + const auto lang = MAKELANGID( layout, SUBLANG_DEFAULT ); + std::wstringstream ss; + ss << std::hex << lang; + const auto hexLang = ss.str().c_str(); + ActivateKeyboardLayout( LoadKeyboardLayout( + hexLang, KLF_ACTIVATE | KLF_REPLACELANG + ), KLF_REORDER ); +} + #ifdef LOG_INPUT //------------------------------------------------------------------------------ void Input::log( const char* format, ... ) diff --git a/Engine/source/sim/actionMap.cpp b/Engine/source/sim/actionMap.cpp index 43169f471..05feff688 100644 --- a/Engine/source/sim/actionMap.cpp +++ b/Engine/source/sim/actionMap.cpp @@ -458,8 +458,12 @@ bool ActionMap::createEventDescriptor(const char* pEventString, EventDescriptor* } // Now we need to map the key string to the proper KEY code from event.h - // - AssertFatal(dStrlen(pObjectString) != 0, "Error, no key was specified!"); + AssertFatal( + dStrlen( pObjectString ) > 0, + "Error, no key was specified!\n" + "Review file 'scripts/client/config.cs' and remove symbols" + " which is not latin. Or delete this file." + ); if (dStrlen(pObjectString) == 1) { diff --git a/Templates/Empty/source/torqueConfig.h b/Templates/Empty/source/torqueConfig.h index d9de1b1d1..e18b00f63 100644 --- a/Templates/Empty/source/torqueConfig.h +++ b/Templates/Empty/source/torqueConfig.h @@ -148,6 +148,13 @@ /// texture manager. #define TORQUE_FRAME_SIZE 16 << 20 +// Default keyboard layout for launching the game. It's fixed crash when a +// game running with the extend unicode keyboard (cyrillic, for example). +// Windows only. +// @see For choice language > +// http://msdn.microsoft.com/en-us/library/windows/desktop/dd318693%28v=vs.85%29.aspx +#define TORQUE_DEFAULT_KEYBOARD_LAYOUT LANG_ENGLISH + // Finally, we define some dependent #defines. This enables some subsidiary // functionality to get automatically turned on in certain configurations. diff --git a/Templates/Full/source/torqueConfig.h b/Templates/Full/source/torqueConfig.h index 4d8f124f2..775fa91f4 100644 --- a/Templates/Full/source/torqueConfig.h +++ b/Templates/Full/source/torqueConfig.h @@ -169,6 +169,13 @@ /// texture manager. #define TORQUE_FRAME_SIZE 16 << 20 +// Default keyboard layout for launching the game. It's fixed crash when a +// game running with the extend unicode keyboard (cyrillic, for example). +// Windows only. +// @see For choice language > +// http://msdn.microsoft.com/en-us/library/windows/desktop/dd318693%28v=vs.85%29.aspx +#define TORQUE_DEFAULT_KEYBOARD_LAYOUT LANG_ENGLISH + // Finally, we define some dependent #defines. This enables some subsidiary // functionality to get automatically turned on in certain configurations.