Keyboard input

This commit is contained in:
elasota
2019-12-25 22:20:10 -05:00
parent 5cb9b85396
commit ac3929fb1f
34 changed files with 1003 additions and 708 deletions

View File

@@ -1,6 +1,9 @@
#include "InputManager.h"
#include "MacRoman.h"
#include "PLKeyEncoding.h"
#include <string.h>
#include <assert.h>
namespace PortabilityLayer
{
@@ -9,19 +12,68 @@ namespace PortabilityLayer
public:
InputManagerImpl();
void GetKeys(unsigned char *keys16) const override;
void GetKeys(KeyMap &keyMap) const override;
void ApplyEvent(const GpKeyboardInputEvent &vosEvent) override;
static InputManagerImpl *GetInstance();
private:
unsigned char m_keys[16];
void ApplyEventAsKey(const GpKeyboardInputEvent &vosEvent, bool bit);
KeyMap m_keyMap;
static InputManagerImpl ms_instance;
};
void InputManagerImpl::GetKeys(unsigned char *keys16) const
void InputManagerImpl::GetKeys(KeyMap &keyMap) const
{
memcpy(keys16, m_keys, 16);
keyMap = m_keyMap;
}
void InputManagerImpl::ApplyEvent(const GpKeyboardInputEvent &vosEvent)
{
if (vosEvent.m_eventType == GpKeyboardInputEventTypes::kDown)
ApplyEventAsKey(vosEvent, true);
else if (vosEvent.m_eventType == GpKeyboardInputEventTypes::kUp)
ApplyEventAsKey(vosEvent, false);
}
void InputManagerImpl::ApplyEventAsKey(const GpKeyboardInputEvent &vosEvent, bool bit)
{
switch (vosEvent.m_keyIDSubset)
{
case GpKeyIDSubsets::kASCII:
assert(vosEvent.m_key.m_asciiChar >= 0 && vosEvent.m_key.m_asciiChar < 128);
m_keyMap.m_ascii.Set(vosEvent.m_key.m_asciiChar, bit);
break;
case GpKeyIDSubsets::kUnicode:
for (int i = 0; i < 256; i++)
{
if (MacRoman::g_toUnicode[i] == vosEvent.m_key.m_unicodeChar)
{
if (i < 128)
m_keyMap.m_ascii.Set(i, bit);
else
m_keyMap.m_macRoman.Set(i - 128, bit);
break;
}
}
break;
case GpKeyIDSubsets::kSpecial:
m_keyMap.m_special.Set(vosEvent.m_key.m_specialKey, bit);
break;
case GpKeyIDSubsets::kNumPadNumber:
m_keyMap.m_numPadNumber.Set(vosEvent.m_key.m_numPadNumber, bit);
break;
case GpKeyIDSubsets::kNumPadSpecial:
m_keyMap.m_numPadSpecial.Set(vosEvent.m_key.m_numPadSpecialKey, bit);
break;
case GpKeyIDSubsets::kFKey:
m_keyMap.m_fKey.Set(vosEvent.m_key.m_fKey - 1, bit);
break;
default:
assert(false);
break;
}
}
InputManagerImpl *InputManagerImpl::GetInstance()
@@ -31,8 +83,6 @@ namespace PortabilityLayer
InputManagerImpl::InputManagerImpl()
{
for (int i = 0; i < sizeof(m_keys) / sizeof(m_keys[0]); i++)
m_keys[i] = 0;
}
InputManagerImpl InputManagerImpl::ms_instance;