Files
CLK/Machines/Enterprise/Keyboard.cpp
T

148 lines
5.0 KiB
C++

//
// Keyboard.cpp
// Clock Signal
//
// Created by Thomas Harte on 17/06/2021.
// Copyright © 2021 Thomas Harte. All rights reserved.
//
#include "Keyboard.hpp"
using namespace Enterprise;
uint16_t KeyboardMapper::mapped_key_for_key(const Inputs::Keyboard::Key key) const {
#define BIND(source, dest) case Inputs::Keyboard::Key::source: return uint16_t(Key::dest)
switch(key) {
default: break;
BIND(Backslash, Backslash);
BIND(CapsLock, Lock);
BIND(Tab, Tab);
BIND(Escape, Escape);
BIND(Hyphen, Hyphen);
BIND(Equals, Caret);
BIND(Backspace, Erase);
BIND(Delete, Delete);
BIND(Semicolon, Semicolon);
BIND(Quote, Colon);
BIND(OpenSquareBracket, OpenSquareBracket);
BIND(CloseSquareBracket, CloseSquareBracket);
BIND(End, Stop);
BIND(Insert, Insert);
BIND(BackTick, At);
BIND(k1, k1); BIND(k2, k2); BIND(k3, k3); BIND(k4, k4); BIND(k5, k5);
BIND(k6, k6); BIND(k7, k7); BIND(k8, k8); BIND(k9, k9); BIND(k0, k0);
BIND(F1, F1); BIND(F2, F2); BIND(F3, F3); BIND(F4, F4);
BIND(F5, F5); BIND(F6, F6); BIND(F7, F7); BIND(F8, F8);
BIND(Keypad1, F1); BIND(Keypad2, F2); BIND(Keypad3, F3); BIND(Keypad4, F4);
BIND(Keypad5, F5); BIND(Keypad6, F6); BIND(Keypad7, F7); BIND(Keypad8, F8);
BIND(Q, Q); BIND(W, W); BIND(E, E); BIND(R, R); BIND(T, T);
BIND(Y, Y); BIND(U, U); BIND(I, I); BIND(O, O); BIND(P, P);
BIND(A, A); BIND(S, S); BIND(D, D); BIND(F, F); BIND(G, G);
BIND(H, H); BIND(J, J); BIND(K, K); BIND(L, L);
BIND(Z, Z); BIND(X, X); BIND(C, C); BIND(V, V);
BIND(B, B); BIND(N, N); BIND(M, M);
BIND(FullStop, FullStop);
BIND(Comma, Comma);
BIND(ForwardSlash, ForwardSlash);
BIND(Space, Space); BIND(Enter, Enter);
BIND(LeftShift, LeftShift);
BIND(RightShift, RightShift);
BIND(LeftOption, Alt);
BIND(RightOption, Alt);
BIND(LeftControl, Control);
BIND(RightControl, Control);
BIND(Left, Left);
BIND(Right, Right);
BIND(Up, Up);
BIND(Down, Down);
}
#undef BIND
return MachineTypes::MappedKeyboardMachine::KeyNotMapped;
}
namespace {
const std::unordered_map<wchar_t, const std::vector<uint16_t>> sequences = {
{L'\b', {Key::Erase}}, {L'\t', {Key::Tab}},
{L'\n', {Key::Enter}}, {L'\r', {Key::Enter}},
{L'\e', {Key::Escape}},
{L' ', {Key::Space}},
{L'!', {Key::LeftShift, Key::k1}},
{L'"', {Key::LeftShift, Key::k2}},
{L'£', {Key::LeftShift, Key::k3}},
{L'$', {Key::LeftShift, Key::k4}},
{L'%', {Key::LeftShift, Key::k5}},
{L'&', {Key::LeftShift, Key::k6}},
{L'\'', {Key::LeftShift, Key::k7}},
{L'(', {Key::LeftShift, Key::k8}},
{L')', {Key::LeftShift, Key::k9}},
{L'_', {Key::LeftShift, Key::k0}},
{L'=', {Key::LeftShift, Key::Hyphen}},
{L'-', {Key::Hyphen}},
{L'~', {Key::LeftShift, Key::Caret}},
{L'^', {Key::Caret}},
{L'`', {Key::LeftShift, Key::At}},
{L'@', {Key::At}},
{L'{', {Key::LeftShift, Key::OpenSquareBracket}},
{L'[', {Key::OpenSquareBracket}},
{L'+', {Key::LeftShift, Key::Semicolon}},
{L';', {Key::Semicolon}},
{L'*', {Key::LeftShift, Key::Colon}},
{L':', {Key::Colon}},
{L'}', {Key::LeftShift, Key::CloseSquareBracket}},
{L']', {Key::CloseSquareBracket}},
{L'|', {Key::LeftShift, Key::Backslash}},
{L'\\', {Key::Backslash}},
{L'<', {Key::LeftShift, Key::Comma}},
{L',', {Key::Comma}},
{L'>', {Key::LeftShift, Key::FullStop}},
{L'.', {Key::FullStop}},
{L'?', {Key::LeftShift, Key::ForwardSlash}},
{L'/', {Key::ForwardSlash}},
{L'0', {Key::k0}}, {L'1', {Key::k1}}, {L'2', {Key::k2}}, {L'3', {Key::k3}}, {L'4', {Key::k4}},
{L'5', {Key::k5}}, {L'6', {Key::k6}}, {L'7', {Key::k7}}, {L'8', {Key::k8}}, {L'9', {Key::k9}},
{L'A', {Key::LeftShift, Key::A}}, {L'B', {Key::LeftShift, Key::B}}, {L'C', {Key::LeftShift, Key::C}},
{L'D', {Key::LeftShift, Key::D}}, {L'E', {Key::LeftShift, Key::E}}, {L'F', {Key::LeftShift, Key::F}},
{L'G', {Key::LeftShift, Key::G}}, {L'H', {Key::LeftShift, Key::H}}, {L'I', {Key::LeftShift, Key::I}},
{L'J', {Key::LeftShift, Key::J}}, {L'K', {Key::LeftShift, Key::K}}, {L'L', {Key::LeftShift, Key::L}},
{L'M', {Key::LeftShift, Key::M}}, {L'N', {Key::LeftShift, Key::N}}, {L'O', {Key::LeftShift, Key::O}},
{L'P', {Key::LeftShift, Key::P}}, {L'Q', {Key::LeftShift, Key::Q}}, {L'R', {Key::LeftShift, Key::R}},
{L'S', {Key::LeftShift, Key::S}}, {L'T', {Key::LeftShift, Key::T}}, {L'U', {Key::LeftShift, Key::U}},
{L'V', {Key::LeftShift, Key::V}}, {L'W', {Key::LeftShift, Key::W}}, {L'X', {Key::LeftShift, Key::X}},
{L'Y', {Key::LeftShift, Key::Y}}, {L'Z', {Key::LeftShift, Key::Z}},
{L'a', {Key::A}}, {L'b', {Key::B}}, {L'c', {Key::C}},
{L'd', {Key::D}}, {L'e', {Key::E}}, {L'f', {Key::F}},
{L'g', {Key::G}}, {L'h', {Key::H}}, {L'i', {Key::I}},
{L'j', {Key::J}}, {L'k', {Key::K}}, {L'l', {Key::L}},
{L'm', {Key::M}}, {L'n', {Key::N}}, {L'o', {Key::O}},
{L'p', {Key::P}}, {L'q', {Key::Q}}, {L'r', {Key::R}},
{L's', {Key::S}}, {L't', {Key::T}}, {L'u', {Key::U}},
{L'v', {Key::V}}, {L'w', {Key::W}}, {L'x', {Key::X}},
{L'y', {Key::Y}}, {L'z', {Key::Z}},
};
}
std::span<const uint16_t> CharacterMapper::sequence_for_character(const wchar_t character) const {
return lookup_sequence(sequences, character);
}