You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
74 lines
2.8 KiB
C++
74 lines
2.8 KiB
C++
#include "keyboardmanager.hpp"
|
|
|
|
#include <cctype>
|
|
|
|
#include <MyGUI_InputManager.h>
|
|
|
|
#include "../mwbase/environment.hpp"
|
|
#include "../mwbase/inputmanager.hpp"
|
|
#include "../mwbase/windowmanager.hpp"
|
|
|
|
#include "../mwworld/player.hpp"
|
|
|
|
#include "actions.hpp"
|
|
#include "bindingsmanager.hpp"
|
|
#include "sdlmappings.hpp"
|
|
|
|
namespace MWInput
|
|
{
|
|
KeyboardManager::KeyboardManager(BindingsManager* bindingsManager)
|
|
: mBindingsManager(bindingsManager)
|
|
{
|
|
}
|
|
|
|
void KeyboardManager::textInput(const SDL_TextInputEvent &arg)
|
|
{
|
|
MyGUI::UString ustring(&arg.text[0]);
|
|
MyGUI::UString::utf32string utf32string = ustring.asUTF32();
|
|
for (MyGUI::UString::utf32string::const_iterator it = utf32string.begin(); it != utf32string.end(); ++it)
|
|
MyGUI::InputManager::getInstance().injectKeyPress(MyGUI::KeyCode::None, *it);
|
|
}
|
|
|
|
void KeyboardManager::keyPressed(const SDL_KeyboardEvent &arg)
|
|
{
|
|
// HACK: to make default keybinding for the console work without printing an extra "^" upon closing
|
|
// This assumes that SDL_TextInput events always come *after* the key event
|
|
// (which is somewhat reasonable, and hopefully true for all SDL platforms)
|
|
auto kc = sdlKeyToMyGUI(arg.keysym.sym);
|
|
if (mBindingsManager->getKeyBinding(A_Console) == arg.keysym.scancode
|
|
&& MWBase::Environment::get().getWindowManager()->isConsoleMode())
|
|
SDL_StopTextInput();
|
|
|
|
bool consumed = SDL_IsTextInputActive() && // Little trick to check if key is printable
|
|
(!(SDLK_SCANCODE_MASK & arg.keysym.sym) &&
|
|
(std::isprint(arg.keysym.sym) ||
|
|
// Don't trust isprint for symbols outside the extended ASCII range
|
|
(kc == MyGUI::KeyCode::None && arg.keysym.sym > 0xff)));
|
|
if (kc != MyGUI::KeyCode::None && !mBindingsManager->isDetectingBindingState())
|
|
{
|
|
if (MWBase::Environment::get().getWindowManager()->injectKeyPress(kc, 0, arg.repeat))
|
|
consumed = true;
|
|
mBindingsManager->setPlayerControlsEnabled(!consumed);
|
|
}
|
|
|
|
if (arg.repeat)
|
|
return;
|
|
|
|
MWBase::InputManager* input = MWBase::Environment::get().getInputManager();
|
|
if (!input->controlsDisabled() && !consumed)
|
|
mBindingsManager->keyPressed(arg);
|
|
|
|
input->setJoystickLastUsed(false);
|
|
}
|
|
|
|
void KeyboardManager::keyReleased(const SDL_KeyboardEvent &arg)
|
|
{
|
|
MWBase::Environment::get().getInputManager()->setJoystickLastUsed(false);
|
|
auto kc = sdlKeyToMyGUI(arg.keysym.sym);
|
|
|
|
if (!mBindingsManager->isDetectingBindingState())
|
|
mBindingsManager->setPlayerControlsEnabled(!MyGUI::InputManager::getInstance().injectKeyRelease(kc));
|
|
mBindingsManager->keyReleased(arg);
|
|
}
|
|
}
|