Platform/Unix/X11Keyboard: implement isKeyDown()
This commit is contained in:
parent
cdea7e238c
commit
6426679845
2 changed files with 137 additions and 2 deletions
|
|
@ -1,5 +1,7 @@
|
|||
|
||||
#include <string.h>
|
||||
#include "X11Keyboard.h"
|
||||
#include "X11SharedDisplay.h"
|
||||
#include <X11/Xlib.h>
|
||||
#include <X11/keysym.h>
|
||||
#include <Spectre/System/Log.h>
|
||||
|
|
@ -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
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue