Program Listing for File ParseKeyboard.cpp

Return to documentation for file (include\input\DefaultDevs\linux\ParseKeyboard.cpp)

#include "InputCore.hpp"
#include "evdev_codemap.hpp"
#include <algorithm>
#include <cstring>

void
InputCore::kbRead(const input_event &evtrig, const int FD)
{
    if (evtrig.type != EV_KEY) {
        return;
    }

    PDJE_Input_Log ilog{};
    ilog.type             = PDJE_Dev_Type::KEYBOARD;
    ilog.event.keyboard.k = PDJE_EVDEV_KEYMAP::keyboard_map(evtrig.code);
    if (ilog.event.keyboard.k == PDJE_KEY::UNKNOWN) {
        return;
    }

    bool writable         = true;

    if (evtrig.value == 0) {
        ilog.event.keyboard.pressed = false;
    } else if (evtrig.value == 1) {
        ilog.event.keyboard.pressed = true;
    } else {
        writable = false;
    }
    if (writable) {
        if (id_pressed[FD].test(ilog.event.keyboard.k) ==
            ilog.event.keyboard.pressed) {
            writable = false;
        } else {
            id_pressed[FD].set(ilog.event.keyboard.k,
                               ilog.event.keyboard.pressed);
        }
    }
    if (writable) {
        auto              idstr = std::to_string(FD);
        const std::size_t id_len =
            std::min(idstr.size(), sizeof(ilog.id));
        std::memcpy(ilog.id, idstr.data(), id_len);
        ilog.id_len = static_cast<uint16_t>(id_len);

        auto name_it = id_to_name.find(FD);
        if (name_it == id_to_name.end()) {
            return;
        }
        const std::string &name = name_it->second;
        const std::size_t  name_len =
            std::min(name.size(), sizeof(ilog.name));

        ilog.microSecond = clock.ConvertToMicroSecond(evtrig.time);
        std::memcpy(ilog.name, name.data(), name_len);
        ilog.name_len = static_cast<uint16_t>(name_len);
        out->Write(ilog);
    }
}