diff --git a/source/Platform/Unix/X11Keyboard.cpp b/source/Platform/Unix/X11Keyboard.cpp index adc7e08..e2184ad 100644 --- a/source/Platform/Unix/X11Keyboard.cpp +++ b/source/Platform/Unix/X11Keyboard.cpp @@ -1,7 +1,204 @@ + #include "X11Keyboard.h" +#include +#include +#include namespace sp { +static Keyboard::Key KeySymToKeyboardKey(KeySym key) { + + switch(key) { + // Letters + case XK_A: case XK_a: + return Keyboard::Key::A; + case XK_B: case XK_b: + return Keyboard::Key::B; + case XK_C: case XK_c: + return Keyboard::Key::C; + case XK_D: case XK_d: + return Keyboard::Key::D; + case XK_E: case XK_e: + return Keyboard::Key::E; + case XK_F: case XK_f: + return Keyboard::Key::F; + case XK_G: case XK_g: + return Keyboard::Key::G; + case XK_H: case XK_h: + return Keyboard::Key::H; + case XK_I: case XK_i: + return Keyboard::Key::I; + case XK_J: case XK_j: + return Keyboard::Key::J; + case XK_K: case XK_k: + return Keyboard::Key::K; + case XK_L: case XK_l: + return Keyboard::Key::L; + case XK_M: case XK_m: + return Keyboard::Key::M; + case XK_N: case XK_n: + return Keyboard::Key::N; + case XK_O: case XK_o: + return Keyboard::Key::O; + case XK_P: case XK_p: + return Keyboard::Key::P; + case XK_Q: case XK_q: + return Keyboard::Key::Q; + case XK_R: case XK_r: + return Keyboard::Key::R; + case XK_S: case XK_s: + return Keyboard::Key::S; + case XK_T: case XK_t: + return Keyboard::Key::T; + case XK_U: case XK_u: + return Keyboard::Key::U; + case XK_V: case XK_v: + return Keyboard::Key::V; + case XK_W: case XK_w: + return Keyboard::Key::W; + case XK_X: case XK_x: + return Keyboard::Key::X; + case XK_Y: case XK_y: + return Keyboard::Key::Y; + case XK_Z: case XK_z: + return Keyboard::Key::Z; + + // Numbers + case XK_1: + return Keyboard::Key::One; + case XK_2: + return Keyboard::Key::Two; + case XK_3: + return Keyboard::Key::Three; + case XK_4: + return Keyboard::Key::Four; + case XK_5: + return Keyboard::Key::Five; + case XK_6: + return Keyboard::Key::Six; + case XK_7: + return Keyboard::Key::Seven; + case XK_8: + return Keyboard::Key::Eight; + case XK_9: + return Keyboard::Key::Nine; + case XK_0: + return Keyboard::Key::Zero; + + case XK_period : + return Keyboard::Key::Period; + case XK_comma : + return Keyboard::Key::Comma; + case XK_Return : + return Keyboard::Key::Enter; + case XK_BackSpace : + return Keyboard::Key::Backspace; + case XK_Escape : + return Keyboard::Key::Escape; + case XK_space : + return Keyboard::Key::Space; + case XK_Caps_Lock : + return Keyboard::Key::Capslock; + + // Arrows + case XK_Up : + return Keyboard::Key::Up; + case XK_Down : + return Keyboard::Key::Down; + case XK_Left : + return Keyboard::Key::Left; + case XK_Right : + return Keyboard::Key::Right; + + // Numpad + + case XK_KP_1 : case XK_KP_End : + return Keyboard::Key::Numpad1; + case XK_KP_2 : case XK_KP_Down : + return Keyboard::Key::Numpad2; + case XK_KP_3 : case XK_KP_Page_Down : + return Keyboard::Key::Numpad3; + case XK_KP_4 : case XK_KP_Left : + return Keyboard::Key::Numpad4; + case XK_KP_5 : case XK_KP_Begin : + return Keyboard::Key::Numpad5; + case XK_KP_6 : case XK_KP_Right : + return Keyboard::Key::Numpad6; + case XK_KP_7 : case XK_KP_Home : + return Keyboard::Key::Numpad7; + case XK_KP_8 : case XK_KP_Up : + return Keyboard::Key::Numpad8; + case XK_KP_9 : case XK_KP_Page_Up : + return Keyboard::Key::Numpad9; + case XK_KP_0 : case XK_KP_Insert : + return Keyboard::Key::Numpad0; + + case XK_Home : + return Keyboard::Key::Home; + case XK_End : + return Keyboard::Key::End; + case XK_Insert : + return Keyboard::Key::Insert; + case XK_Delete : + return Keyboard::Key::Delete; + case XK_Page_Up : + return Keyboard::Key::PageUp; + case XK_Page_Down : + return Keyboard::Key::PageDown; + case XK_Pause : + return Keyboard::Key::Pause; + + + // Function keys + case XK_F1 : + return Keyboard::Key::F1; + case XK_F2 : + return Keyboard::Key::F2; + case XK_F3 : + return Keyboard::Key::F3; + case XK_F4 : + return Keyboard::Key::F4; + case XK_F5 : + return Keyboard::Key::F5; + case XK_F6 : + return Keyboard::Key::F6; + case XK_F7 : + return Keyboard::Key::F7; + case XK_F8 : + return Keyboard::Key::F8; + case XK_F9 : + return Keyboard::Key::F9; + case XK_F10 : + return Keyboard::Key::F10; + case XK_F11 : + return Keyboard::Key::F11; + case XK_F12 : + return Keyboard::Key::F12; + + case XK_Tab : + return Keyboard::Key::Tab; + case XK_Shift_L : + return Keyboard::Key::LShift; + case XK_Shift_R : + return Keyboard::Key::RShift; + case XK_Control_L : + return Keyboard::Key::LCtrl; + case XK_Control_R : + return Keyboard::Key::RCtrl; + case XK_Alt_L : + return Keyboard::Key::LAlt; + case XK_Alt_R : +#ifdef XK_XKB_KEYS + case XK_ISO_Level3_Shift : +#endif /* XK_XKB_KEYS */ + return Keyboard::Key::RAlt; + + default: + sp::Log::debug("X11Keyboard - Unknown keycode: 0x%X", key); + return Keyboard::Key::Unknown; + }; +} + void X11Keyboard::init() { @@ -12,9 +209,22 @@ bool X11Keyboard::isKeyDown(Keyboard::Key key) return false; } +bool X11Keyboard::handleMessage(XKeyEvent* xkeyevent, Event& event) +{ + KeySym sym = ::XLookupKeysym(xkeyevent, 0); + Keyboard::Key code = KeySymToKeyboardKey(sym); + + if (code != Keyboard::Key::Unknown) { + event.type = Event::Key; + event.key.code = code; + event.key.pressed = xkeyevent->type == KeyPress; + return true; + } + return false; +} + void X11Keyboard::update(InputModule *input) { - } } // namespace sp diff --git a/source/Platform/Unix/X11Keyboard.h b/source/Platform/Unix/X11Keyboard.h index 7f7485c..c0cda41 100644 --- a/source/Platform/Unix/X11Keyboard.h +++ b/source/Platform/Unix/X11Keyboard.h @@ -2,8 +2,9 @@ #ifndef PLATFORM_UNIX_X11KEYBOARD_H #define PLATFORM_UNIX_X11KEYBOARD_H +#include #include - +#include namespace sp { class X11Keyboard : public Keyboard @@ -15,6 +16,9 @@ public : bool isKeyDown(Keyboard::Key key); + // Translate a XKeyEvent to sp::Event, Called from X11EventQueue + static bool handleMessage(XKeyEvent* xkeyevent, Event& event); + protected : virtual void update(InputModule *input);