diff --git a/src/she/x11/keys.cpp b/src/she/x11/keys.cpp index b6cf047fa..9c6162bb9 100644 --- a/src/she/x11/keys.cpp +++ b/src/she/x11/keys.cpp @@ -10,12 +10,14 @@ #include "base/ints.h" #include "she/x11/keys.h" +#include "she/x11/x11.h" +#include #include namespace she { -KeyScancode x11_keysym_to_scancode(KeySym keysym) +KeyScancode x11_keysym_to_scancode(const KeySym keysym) { switch (keysym) { case XK_BackSpace: return kKeyBackspace; @@ -162,9 +164,134 @@ KeyScancode x11_keysym_to_scancode(KeySym keysym) return kKeyNil; } +KeySym x11_keysym_to_scancode(const KeyScancode scancode) +{ + switch (scancode) { + case kKeyBackspace: return XK_BackSpace; + case kKeyTab: return XK_Tab; + case kKeyEnter: return XK_Return; + case kKeyPause: return XK_Pause; + case kKeyScrLock: return XK_Scroll_Lock; + case kKeyEsc: return XK_Escape; + case kKeyDel: return XK_Delete; + case kKeyHome: return XK_Home; + case kKeyLeft: return XK_Left; + case kKeyUp: return XK_Up; + case kKeyRight: return XK_Right; + case kKeyDown: return XK_Down; + case kKeyPageUp: return XK_Page_Up; + case kKeyPageDown: return XK_Page_Down; + case kKeyEnd: return XK_End; + case kKeyPrtscr: return XK_Print; + case kKeyInsert: return XK_Insert; + case kKeyMenu: return XK_Menu; + case kKeyNumLock: return XK_Num_Lock; + case kKeyEnterPad: return XK_KP_Enter; + case kKey0Pad: return XK_KP_0; + case kKey1Pad: return XK_KP_1; + case kKey2Pad: return XK_KP_2; + case kKey3Pad: return XK_KP_3; + case kKey4Pad: return XK_KP_4; + case kKey5Pad: return XK_KP_5; + case kKey6Pad: return XK_KP_6; + case kKey7Pad: return XK_KP_7; + case kKey8Pad: return XK_KP_8; + case kKey9Pad: return XK_KP_9; + case kKeyDelPad: return XK_KP_Delete; + case kKeyEqualsPad: return XK_KP_Equal; + case kKeyAsterisk: return XK_KP_Multiply; + case kKeyPlusPad: return XK_KP_Add; + case kKeyMinusPad: return XK_KP_Subtract; + case kKeySlashPad: return XK_KP_Divide; + case kKeyF1: return XK_F1; + case kKeyF2: return XK_F2; + case kKeyF3: return XK_F3; + case kKeyF4: return XK_F4; + case kKeyF5: return XK_F5; + case kKeyF6: return XK_F6; + case kKeyF7: return XK_F7; + case kKeyF8: return XK_F8; + case kKeyF9: return XK_F9; + case kKeyF10: return XK_F10; + case kKeyF11: return XK_F11; + case kKeyF12: return XK_F12; + case kKeyLShift: return XK_Shift_L; + case kKeyRShift: return XK_Shift_R; + case kKeyLControl: return XK_Control_L; + case kKeyRControl: return XK_Control_R; + case kKeyCapsLock: return XK_Caps_Lock; + case kKeyAlt: return XK_Alt_L; + case kKeyAltGr: return XK_Alt_R; + case kKeyLWin: return XK_Super_L; + case kKeyRWin: return XK_Super_R; + case kKeySpace: return XK_space; + case kKeyQuote: return XK_apostrophe; + case kKeyComma: return XK_comma; + case kKeyMinus: return XK_minus; + case kKeyStop: return XK_period; + case kKeySlash: return XK_slash; + case kKey0: return XK_0; + case kKey1: return XK_1; + case kKey2: return XK_2; + case kKey3: return XK_3; + case kKey4: return XK_4; + case kKey5: return XK_5; + case kKey6: return XK_6; + case kKey7: return XK_7; + case kKey8: return XK_8; + case kKey9: return XK_9; + case kKeyColon: return XK_semicolon; + case kKeyBackslash2: return XK_less; + case kKeyOpenbrace: return XK_bracketleft; + case kKeyBackslash: return XK_backslash; + case kKeyClosebrace: return XK_bracketright; + case kKeyTilde: return XK_grave; + case kKeyA: return XK_a; + case kKeyB: return XK_b; + case kKeyC: return XK_c; + case kKeyD: return XK_d; + case kKeyE: return XK_e; + case kKeyF: return XK_f; + case kKeyG: return XK_g; + case kKeyH: return XK_h; + case kKeyI: return XK_i; + case kKeyJ: return XK_j; + case kKeyK: return XK_k; + case kKeyL: return XK_l; + case kKeyM: return XK_m; + case kKeyN: return XK_n; + case kKeyO: return XK_o; + case kKeyP: return XK_p; + case kKeyQ: return XK_q; + case kKeyR: return XK_r; + case kKeyS: return XK_s; + case kKeyT: return XK_t; + case kKeyU: return XK_u; + case kKeyV: return XK_v; + case kKeyW: return XK_w; + case kKeyX: return XK_x; + case kKeyY: return XK_y; + case kKeyZ: return XK_z; + } + return 0; +} + bool x11_is_key_pressed(KeyScancode scancode) { - return false; // TODO + ::Display* display = X11::instance()->display(); + KeySym keysym = x11_keysym_to_scancode(scancode); + KeyCode keycode = XKeysymToKeycode(display, keysym); + if (!keycode) + return false; + + // TODO several platforms have this kind of API to get the whole + // keyboard state, it would be a lot better if we expose this + // API to the user (so we don't have to call XQueryKeymap for + // each key). + char keys[32]; + XQueryKeymap(display, keys); + + return (keys[keycode/8] & (1 << (keycode%8)) ? true: false); } int x11_get_unicode_from_scancode(KeyScancode scancode) diff --git a/src/she/x11/keys.h b/src/she/x11/keys.h index 476c53612..5a8a6ac6d 100644 --- a/src/she/x11/keys.h +++ b/src/she/x11/keys.h @@ -13,7 +13,8 @@ namespace she { - KeyScancode x11_keysym_to_scancode(KeySym keysym); + KeyScancode x11_keysym_to_scancode(const KeySym keysym); + KeySym x11_keysym_to_scancode(const KeyScancode scancode); bool x11_is_key_pressed(KeyScancode scancode); int x11_get_unicode_from_scancode(KeyScancode scancode);