mirror of
https://github.com/elasota/Aerofoil.git
synced 2025-12-14 20:19:38 +00:00
Keyboard input
This commit is contained in:
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user