keyboard.cpp 1.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768
  1. #if defined(Hiro_Keyboard)
  2. namespace hiro {
  3. auto pKeyboard::poll() -> vector<bool> {
  4. if(Application::state().quit) return {};
  5. vector<bool> result;
  6. char state[256];
  7. #if defined(DISPLAY_XORG)
  8. XQueryKeymap(pApplication::state().display, state);
  9. #endif
  10. for(auto& code : settings.keycodes) {
  11. result.append(_pressed(state, code));
  12. }
  13. return result;
  14. }
  15. auto pKeyboard::pressed(unsigned code) -> bool {
  16. char state[256];
  17. #if defined(DISPLAY_XORG)
  18. XQueryKeymap(pApplication::state().display, state);
  19. #endif
  20. return _pressed(state, code);
  21. }
  22. auto pKeyboard::_pressed(const char* state, uint16_t code) -> bool {
  23. uint8_t lo = code >> 0;
  24. uint8_t hi = code >> 8;
  25. #if defined(DISPLAY_XORG)
  26. if(lo && state[lo >> 3] & (1 << (lo & 7))) return true;
  27. if(hi && state[hi >> 3] & (1 << (hi & 7))) return true;
  28. #endif
  29. return false;
  30. }
  31. auto pKeyboard::initialize() -> void {
  32. auto append = [](unsigned lo, unsigned hi = 0) {
  33. #if defined(DISPLAY_XORG)
  34. lo = lo ? (uint8_t)XKeysymToKeycode(pApplication::state().display, lo) : 0;
  35. hi = hi ? (uint8_t)XKeysymToKeycode(pApplication::state().display, hi) : 0;
  36. #endif
  37. settings.keycodes.append(lo << 0 | hi << 8);
  38. };
  39. #define map(name, ...) if(key == name) { append(__VA_ARGS__); continue; }
  40. for(auto& key : Keyboard::keys) {
  41. #if defined(DISPLAY_XORG)
  42. #include <hiro/platform/xorg/keyboard.hpp>
  43. #endif
  44. //print("[hiro/qt] warning: unhandled key: ", key, "\n");
  45. append(0);
  46. }
  47. #undef map
  48. }
  49. }
  50. #endif