#pragma once #include "IHID.hpp" #include "../helpers/WLListener.hpp" #include "../macros.hpp" #include "../helpers/math/Math.hpp" #include AQUAMARINE_FORWARD(IKeyboard); class IKeyboard : public IHID { public: virtual ~IKeyboard(); virtual uint32_t getCapabilities(); virtual eHIDType getType(); virtual bool isVirtual() = 0; virtual SP aq() = 0; struct SKeyEvent { uint32_t timeMs = 0; uint32_t keycode = 0; bool updateMods = false; wl_keyboard_key_state state = WL_KEYBOARD_KEY_STATE_PRESSED; }; struct SKeymapEvent { xkb_keymap* keymap = nullptr; }; struct SModifiersEvent { uint32_t depressed = 0; uint32_t latched = 0; uint32_t locked = 0; uint32_t group = 0; }; struct { CSignal key; CSignal modifiers; CSignal keymap; CSignal repeatInfo; } keyboardEvents; struct SStringRuleNames { std::string layout = ""; std::string model = ""; std::string variant = ""; std::string options = ""; std::string rules = ""; }; void setKeymap(const SStringRuleNames& rules); void updateXKBTranslationState(xkb_keymap* const keymap = nullptr); std::string getActiveLayout(); void updateLEDs(); void updateLEDs(uint32_t leds); uint32_t getModifiers(); void updateModifiers(uint32_t depressed, uint32_t latched, uint32_t locked, uint32_t group); bool active = false; bool enabled = true; xkb_layout_index_t activeLayout = 0; xkb_state * xkbTranslationState = nullptr, *xkbInternalTranslationState = nullptr; xkb_keymap* xkbKeymap = nullptr; struct { uint32_t depressed = 0, latched = 0, locked = 0, group = 0; } modifiersState; std::array ledIndexes; std::array modIndexes; uint32_t leds = 0; std::string hlName = ""; std::string xkbFilePath = ""; std::string xkbKeymapString = ""; int xkbKeymapFD = -1; SStringRuleNames currentRules; int repeatRate = 0; int repeatDelay = 0; int numlockOn = -1; bool resolveBindsBySym = false; WP self; private: void clearManuallyAllocd(); bool updateModifiersState(); // rets whether changed };