Program Listing for File windows_keyboard_fill.hpp

Return to documentation for file (include/input/windows/windows_keyboard_fill.hpp)

#pragma once
#include <WinUser.h>
#include <Windows.h>

namespace PDJE_RAWINPUT {
static inline void
FillMouseInput(PDJE_Input_Event &tempEv, const RAWINPUT *ri)
{
    tempEv.mouse.button_type = ri->data.mouse.usButtonFlags;
    tempEv.mouse.wheel_move  = ri->data.mouse.usButtonData;
    if (ri->data.mouse.usFlags & MOUSE_MOVE_ABSOLUTE) {
        if (ri->data.mouse.usFlags & MOUSE_VIRTUAL_DESKTOP) {
            tempEv.mouse.axis_type = PDJE_Mouse_Axis_Type::VIRTUAL_DESKTOP_ABS;
        } else {
            tempEv.mouse.axis_type = PDJE_Mouse_Axis_Type::ABS;
        }
    } else {
        tempEv.mouse.axis_type = PDJE_Mouse_Axis_Type::REL;
    }
    tempEv.mouse.x = ri->data.mouse.lLastX;
    tempEv.mouse.y = ri->data.mouse.lLastY;
}

static inline void
FillKeyboardInput(PDJE_Input_Event &tempEv, const RAWINPUT *ri)
{
    bool e0 = (ri->data.keyboard.Flags & RI_KEY_E0) != 0;
    auto k  = &tempEv.keyboard.k;
    switch (ri->data.keyboard.VKey) {
    case VK_F1:
        *k = PDJE_KEY::F_1;
        break;
    case VK_F2:
        *k = PDJE_KEY::F_2;
        break;
    case VK_F3:
        *k = PDJE_KEY::F_3;
        break;
    case VK_F4:
        *k = PDJE_KEY::F_4;
        break;
    case VK_F5:
        *k = PDJE_KEY::F_5;
        break;
    case VK_F6:
        *k = PDJE_KEY::F_6;
        break;
    case VK_F7:
        *k = PDJE_KEY::F_7;
        break;
    case VK_F8:
        *k = PDJE_KEY::F_8;
        break;
    case VK_F9:
        *k = PDJE_KEY::F_9;
        break;
    case VK_F10:
        *k = PDJE_KEY::F_10;
        break;
    case VK_F11:
        *k = PDJE_KEY::F_11;
        break;
    case VK_F12:
        *k = PDJE_KEY::F_12;
        break;

    case '0':
        *k = PDJE_KEY::D0;
        break;
    case '1':
        *k = PDJE_KEY::D1;
        break;
    case '2':
        *k = PDJE_KEY::D2;
        break;
    case '3':
        *k = PDJE_KEY::D3;
        break;
    case '4':
        *k = PDJE_KEY::D4;
        break;
    case '5':
        *k = PDJE_KEY::D5;
        break;
    case '6':
        *k = PDJE_KEY::D6;
        break;
    case '7':
        *k = PDJE_KEY::D7;
        break;
    case '8':
        *k = PDJE_KEY::D8;
        break;
    case '9':
        *k = PDJE_KEY::D9;
        break;

    case 'A':
        *k = PDJE_KEY::A;
        break;
    case 'B':
        *k = PDJE_KEY::B;
        break;
    case 'C':
        *k = PDJE_KEY::C;
        break;
    case 'D':
        *k = PDJE_KEY::D;
        break;
    case 'E':
        *k = PDJE_KEY::E;
        break;
    case 'F':
        *k = PDJE_KEY::F;
        break;
    case 'G':
        *k = PDJE_KEY::G;
        break;
    case 'H':
        *k = PDJE_KEY::H;
        break;
    case 'I':
        *k = PDJE_KEY::I;
        break;
    case 'J':
        *k = PDJE_KEY::J;
        break;
    case 'K':
        *k = PDJE_KEY::K;
        break;
    case 'L':
        *k = PDJE_KEY::L;
        break;
    case 'M':
        *k = PDJE_KEY::M;
        break;
    case 'N':
        *k = PDJE_KEY::N;
        break;
    case 'O':
        *k = PDJE_KEY::O;
        break;
    case 'P':
        *k = PDJE_KEY::P;
        break;
    case 'Q':
        *k = PDJE_KEY::Q;
        break;
    case 'R':
        *k = PDJE_KEY::R;
        break;
    case 'S':
        *k = PDJE_KEY::S;
        break;
    case 'T':
        *k = PDJE_KEY::T;
        break;
    case 'U':
        *k = PDJE_KEY::U;
        break;
    case 'V':
        *k = PDJE_KEY::V;
        break;
    case 'W':
        *k = PDJE_KEY::W;
        break;
    case 'X':
        *k = PDJE_KEY::X;
        break;
    case 'Y':
        *k = PDJE_KEY::Y;
        break;
    case 'Z':
        *k = PDJE_KEY::Z;
        break;

    case VK_OEM_MINUS:
        *k = PDJE_KEY::MINUS;
        break;
    case VK_OEM_PLUS:
        *k = PDJE_KEY::EQUAL;
        break;
    case VK_OEM_4:
        *k = PDJE_KEY::LBRACKET;
        break;
    case VK_OEM_6:
        *k = PDJE_KEY::RBRACKET;
        break;
    case VK_OEM_5:
        *k = PDJE_KEY::BACKSLASH;
        break;
    case VK_OEM_102:
        *k = PDJE_KEY::NONUS_BACKSLASH;
        break;
    case VK_OEM_1:
        *k = PDJE_KEY::SEMICOLON;
        break;
    case VK_OEM_7:
        *k = PDJE_KEY::APOSTROPHE;
        break;
    case VK_OEM_3:
        *k = PDJE_KEY::GRAVE;
        break;
    case VK_OEM_2:
        *k = PDJE_KEY::SLASH;
        break;
    case VK_OEM_COMMA:
        *k = PDJE_KEY::COMMA;
        break;
    case VK_OEM_PERIOD:
        *k = PDJE_KEY::PERIOD;
        break;

    case VK_RETURN:
        *k = e0 ? PDJE_KEY::KP_ENTER : PDJE_KEY::ENTER;
        break;
    case VK_ESCAPE:
        *k = PDJE_KEY::ESC;
        break;
    case VK_BACK:
        *k = PDJE_KEY::BACKSPACE;
        break;
    case VK_TAB:
        *k = PDJE_KEY::TAB;
        break;
    case VK_SPACE:
        *k = PDJE_KEY::SPACE;
        break;
    case VK_CAPITAL:
        *k = PDJE_KEY::CAPSLK;
        break;

    case VK_LEFT:
        *k = PDJE_KEY::LEFT;
        break;
    case VK_RIGHT:
        *k = PDJE_KEY::RIGHT;
        break;
    case VK_UP:
        *k = PDJE_KEY::UP;
        break;
    case VK_DOWN:
        *k = PDJE_KEY::DOWN;
        break;

    case VK_SHIFT:
        *k = (ri->data.keyboard.MakeCode == 0x36) ? PDJE_KEY::RSHIFT
                                                  : PDJE_KEY::LSHIFT;
        break;
    case VK_LSHIFT:
        *k = PDJE_KEY::LSHIFT;
        break;
    case VK_RSHIFT:
        *k = PDJE_KEY::RSHIFT;
        break;

    case VK_CONTROL:
        *k = e0 ? PDJE_KEY::RCTRL : PDJE_KEY::LCTRL;
        break;
    case VK_LCONTROL:
        *k = PDJE_KEY::LCTRL;
        break;
    case VK_RCONTROL:
        *k = PDJE_KEY::RCTRL;
        break;
    case VK_MENU:
        *k = e0 ? PDJE_KEY::RALT : PDJE_KEY::LALT;
        break;
    case VK_LMENU:
        *k = PDJE_KEY::LALT;
        break;
    case VK_RMENU:
        *k = PDJE_KEY::RALT;
        break;

    case VK_NUMPAD0:
        *k = PDJE_KEY::KP_0;
        break;
    case VK_NUMPAD1:
        *k = PDJE_KEY::KP_1;
        break;
    case VK_NUMPAD2:
        *k = PDJE_KEY::KP_2;
        break;
    case VK_NUMPAD3:
        *k = PDJE_KEY::KP_3;
        break;
    case VK_NUMPAD4:
        *k = PDJE_KEY::KP_4;
        break;
    case VK_NUMPAD5:
        *k = PDJE_KEY::KP_5;
        break;
    case VK_NUMPAD6:
        *k = PDJE_KEY::KP_6;
        break;
    case VK_NUMPAD7:
        *k = PDJE_KEY::KP_7;
        break;
    case VK_NUMPAD8:
        *k = PDJE_KEY::KP_8;
        break;
    case VK_NUMPAD9:
        *k = PDJE_KEY::KP_9;
        break;

    case VK_DECIMAL:
        *k = PDJE_KEY::KP_DOT;
        break;
    case VK_ADD:
        *k = PDJE_KEY::KP_PLUS;
        break;
    case VK_SUBTRACT:
        *k = PDJE_KEY::KP_MINUS;
        break;
    case VK_MULTIPLY:
        *k = PDJE_KEY::KP_STAR;
        break;
    case VK_DIVIDE:
        *k = PDJE_KEY::KP_SLASH;
        break;
    case VK_NUMLOCK:
        *k = PDJE_KEY::KP_NUMLOCK;
        break;

    case VK_SNAPSHOT:
        *k = PDJE_KEY::SP_PRINT_SCREEN;
        break;
    case VK_SCROLL:
        *k = PDJE_KEY::SP_SCROLL_LOCK;
        break;

    case VK_INSERT:
        *k = PDJE_KEY::SP_INSERT;
        break;
    case VK_DELETE:
        *k = PDJE_KEY::SP_DELETE;
        break;
    case VK_HOME:
        *k = PDJE_KEY::SP_HOME;
        break;
    case VK_END:
        *k = PDJE_KEY::SP_END;
        break;
    case VK_PRIOR:
        *k = PDJE_KEY::SP_PAGE_UP;
        break;
    case VK_NEXT:
        *k = PDJE_KEY::SP_PAGE_DOWN;
        break;
    default:
        *k = PDJE_KEY::UNKNOWN;
        break;
    }

    tempEv.keyboard.pressed = (ri->data.keyboard.Flags & RI_KEY_BREAK) == 0;
}

static inline std::pmr::vector<uint8_t>
FillHIDInput(std::pmr::unsynchronized_pool_resource &arena,
             const RAWINPUT                         *ri,
             unsigned long                          &byteSize)
{

    std::pmr::vector<uint8_t> hidB(&arena);
    hidB.resize(ri->data.hid.dwCount * ri->data.hid.dwSizeHid);
    memcpy(hidB.data(), ri->data.hid.bRawData, hidB.size() * sizeof(uint8_t));
    byteSize = ri->data.hid.dwSizeHid;

    return hidB;
}
}; // namespace PDJE_RAWINPUT