From 64266798455bb5929d5590d30a55d50be4b9c118 Mon Sep 17 00:00:00 2001 From: Henrik Hautakoski Date: Fri, 16 Oct 2020 14:41:41 +0200 Subject: [PATCH] Platform/Unix/X11Keyboard: implement isKeyDown() --- source/Platform/Unix/X11Keyboard.cpp | 129 ++++++++++++++++++++++++++- source/Platform/Unix/X11Keyboard.h | 10 ++- 2 files changed, 137 insertions(+), 2 deletions(-) diff --git a/source/Platform/Unix/X11Keyboard.cpp b/source/Platform/Unix/X11Keyboard.cpp index e2184ad..9121ebe 100644 --- a/source/Platform/Unix/X11Keyboard.cpp +++ b/source/Platform/Unix/X11Keyboard.cpp @@ -1,5 +1,7 @@ +#include #include "X11Keyboard.h" +#include "X11SharedDisplay.h" #include #include #include @@ -199,13 +201,136 @@ static Keyboard::Key KeySymToKeyboardKey(KeySym key) { }; } +X11Keyboard::X11Keyboard() : +m_disp(NULL) +{ + memset(m_key_state, 0, sizeof(m_key_state) / sizeof(m_key_state[0])); +} + +X11Keyboard::~X11Keyboard() +{ + if (m_disp) { + XReleaseDisplay(); + } +} + void X11Keyboard::init() { - + m_disp = XGetDisplay(); } bool X11Keyboard::isKeyDown(Keyboard::Key key) { + KeySym sym; + + switch(key) { + // Letters + case Keyboard::Key::A : sym = XK_a; break; + case Keyboard::Key::B : sym = XK_b; break; + case Keyboard::Key::C : sym = XK_c; break; + case Keyboard::Key::D : sym = XK_d; break; + case Keyboard::Key::E : sym = XK_e; break; + case Keyboard::Key::F : sym = XK_f; break; + case Keyboard::Key::G : sym = XK_g; break; + case Keyboard::Key::H : sym = XK_h; break; + case Keyboard::Key::I : sym = XK_i; break; + case Keyboard::Key::J : sym = XK_j; break; + case Keyboard::Key::K : sym = XK_k; break; + case Keyboard::Key::L : sym = XK_l; break; + case Keyboard::Key::M : sym = XK_m; break; + case Keyboard::Key::N : sym = XK_n; break; + case Keyboard::Key::O : sym = XK_o; break; + case Keyboard::Key::P : sym = XK_p; break; + case Keyboard::Key::Q : sym = XK_q; break; + case Keyboard::Key::R : sym = XK_r; break; + case Keyboard::Key::S : sym = XK_s; break; + case Keyboard::Key::T : sym = XK_t; break; + case Keyboard::Key::U : sym = XK_u; break; + case Keyboard::Key::V : sym = XK_v; break; + case Keyboard::Key::W : sym = XK_w; break; + case Keyboard::Key::X : sym = XK_x; break; + case Keyboard::Key::Y : sym = XK_y; break; + case Keyboard::Key::Z : sym = XK_z; break; + + // Numbers + case Keyboard::Key::One : sym = XK_1; break; + case Keyboard::Key::Two : sym = XK_2; break; + case Keyboard::Key::Three : sym = XK_3; break; + case Keyboard::Key::Four : sym = XK_4; break; + case Keyboard::Key::Five : sym = XK_5; break; + case Keyboard::Key::Six : sym = XK_6; break; + case Keyboard::Key::Seven : sym = XK_7; break; + case Keyboard::Key::Eight : sym = XK_8; break; + case Keyboard::Key::Nine : sym = XK_9; break; + case Keyboard::Key::Zero : sym = XK_0; break; + + case Keyboard::Key::Period : sym = XK_period; break; + case Keyboard::Key::Comma : sym = XK_comma; break; + case Keyboard::Key::Enter : sym = XK_Return; break; + case Keyboard::Key::Backspace : sym = XK_BackSpace; break; + case Keyboard::Key::Escape : sym = XK_Escape; break; + case Keyboard::Key::Space : sym = XK_space; break; + case Keyboard::Key::Capslock : sym = XK_Caps_Lock; break; + + // Arrows + case Keyboard::Key::Up : sym = XK_Up; break; + case Keyboard::Key::Down : sym = XK_Down; break; + case Keyboard::Key::Left : sym = XK_Left; break; + case Keyboard::Key::Right : sym = XK_Right; break; + + // Numpad + case Keyboard::Key::Numpad1 : sym = XK_KP_1; break; + case Keyboard::Key::Numpad2 : sym = XK_KP_2; break; + case Keyboard::Key::Numpad3 : sym = XK_KP_3; break; + case Keyboard::Key::Numpad4 : sym = XK_KP_4; break; + case Keyboard::Key::Numpad5 : sym = XK_KP_5; break; + case Keyboard::Key::Numpad6 : sym = XK_KP_6; break; + case Keyboard::Key::Numpad7 : sym = XK_KP_7; break; + case Keyboard::Key::Numpad8 : sym = XK_KP_8; break; + case Keyboard::Key::Numpad9 : sym = XK_KP_9; break; + case Keyboard::Key::Numpad0 : sym = XK_KP_0; break; + + case Keyboard::Key::Home : sym = XK_Home; break; + case Keyboard::Key::End : sym = XK_End; break; + case Keyboard::Key::Insert : sym = XK_Insert; break; + case Keyboard::Key::Delete : sym = XK_Delete; break; + case Keyboard::Key::PageUp : sym = XK_Page_Up; break; + case Keyboard::Key::PageDown : sym = XK_Page_Down; break; + case Keyboard::Key::Pause : sym = XK_Pause; break; + + // Function keys + case Keyboard::Key::F1 : sym = XK_F1; break; + case Keyboard::Key::F2 : sym = XK_F2; break; + case Keyboard::Key::F3 : sym = XK_F3; break; + case Keyboard::Key::F4 : sym = XK_F4; break; + case Keyboard::Key::F5 : sym = XK_F5; break; + case Keyboard::Key::F6 : sym = XK_F6; break; + case Keyboard::Key::F7 : sym = XK_F7; break; + case Keyboard::Key::F8 : sym = XK_F8; break; + case Keyboard::Key::F9 : sym = XK_F9; break; + case Keyboard::Key::F10 : sym = XK_F10; break; + case Keyboard::Key::F11 : sym = XK_F11; break; + case Keyboard::Key::F12 : sym = XK_F12; break; + + case Keyboard::Key::Tab : sym = XK_Tab; break; + case Keyboard::Key::LShift : sym = XK_Shift_L; break; + case Keyboard::Key::RShift : sym = XK_Shift_R; break; + case Keyboard::Key::LCtrl : sym = XK_Control_L; break; + case Keyboard::Key::RCtrl : sym = XK_Control_R; break; + case Keyboard::Key::LAlt : sym = XK_Alt_L; break; +#ifdef XK_XKB_KEYS + case Keyboard::Key::RAlt : sym = XK_ISO_Level3_Shift; break; +#else + case Keyboard::Key::RAlt : sym = XK_Alt_R; break; +#endif /* XK_XKB_KEYS */ + default : sym = 0; break; + } + + KeyCode keycode = ::XKeysymToKeycode(m_disp, sym); + + if (keycode) { + return m_key_state[keycode / 8] & (1 << (keycode % 8)); + } return false; } @@ -225,6 +350,8 @@ bool X11Keyboard::handleMessage(XKeyEvent* xkeyevent, Event& event) void X11Keyboard::update(InputModule *input) { + // Query keyboard state. + ::XQueryKeymap(m_disp, m_key_state); } } // namespace sp diff --git a/source/Platform/Unix/X11Keyboard.h b/source/Platform/Unix/X11Keyboard.h index c0cda41..4684bba 100644 --- a/source/Platform/Unix/X11Keyboard.h +++ b/source/Platform/Unix/X11Keyboard.h @@ -5,12 +5,14 @@ #include #include #include + namespace sp { class X11Keyboard : public Keyboard { public : - virtual ~X11Keyboard() {} + X11Keyboard(); + ~X11Keyboard(); void init(); @@ -22,6 +24,12 @@ public : protected : virtual void update(InputModule *input); + +private : + ::Display* m_disp; + + // Cached keyboard state. + char m_key_state[32]; }; } // namespace sp