x11/skia: Add System::isKeyPressed() impl

This commit is contained in:
David Capello 2018-08-09 11:21:05 -03:00
parent f8b193545e
commit 01bb56b50a
2 changed files with 131 additions and 3 deletions

View File

@ -10,12 +10,14 @@
#include "base/ints.h"
#include "she/x11/keys.h"
#include "she/x11/x11.h"
#include <X11/Xlib.h>
#include <X11/keysym.h>
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)

View File

@ -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);