/* TI-84+
*
* A plain TI-84 with its built-in keyboard as an input and its LCD screen
* as an output.
*
* Uses XCB to render the screen and record keystrokes.
*/
static uint8_t keycode_to_tikbd(xcb_keycode_t kc)
{
// First, change keycode into symbol
xcb_get_keyboard_mapping_reply_t* km = xcb_get_keyboard_mapping_reply(
conn, xcb_get_keyboard_mapping(conn, kc, 1), NULL);
xcb_keysym_t* keysyms = (xcb_keysym_t*)(km + 1);
uint8_t res = 0;
for (int i=0; i<km->length; i++) {
switch (keysyms[0]) {
case XK_Shift_L: res = KBD_2ND; break;
case XK_Control_L: res = KBD_ALPHA; break;
case XK_Return: res = 0x10; break;
case XK_Delete: res = 0x67; break;
case ' ': res = 0x40; break;
case '1': res = 0x41; break;
case '2': res = 0x31; break;
case '3': res = 0x21; break;
case '4': res = 0x42; break;
case '5': res = 0x32; break;
case '6': res = 0x22; break;
case '7': res = 0x43; break;
case '8': res = 0x33; break;
case '9': res = 0x23; break;
case '0': res = 0x40; break;
case '-': res = 0x12; break;
case '+': res = 0x11; break;
case 'q': res = 0x23; break;
case 'w': res = 0x12; break;
case 'e': res = 0x45; break;
case 'r': res = 0x13; break;
case 't': res = 0x42; break;
case 'y': res = 0x41; break;
case 'u': res = 0x32; break;
case 'i': res = 0x54; break;
case 'o': res = 0x43; break;
case 'p': res = 0x33; break;
case '(': res = 0x34; break;
case ')': res = 0x24; break;
case 'a': res = 0x56; break;
case 's': res = 0x52; break;
case 'd': res = 0x55; break;
case 'f': res = 0x35; break;
case 'g': res = 0x25; break;
case 'h': res = 0x15; break;
case 'j': res = 0x44; break;
case 'k': res = 0x34; break;
case 'l': res = 0x24; break;
case ':': res = 0x30; break;
case '"': res = 0x11; break;
case 'z': res = 0x31; break;
case 'x': res = 0x51; break;
case 'c': res = 0x36; break;
case 'v': res = 0x22; break;
case 'b': res = 0x46; break;
case 'n': res = 0x53; break;
case 'm': res = 0x14; break;
case ',': res = 0x44; break;
case '.': res = 0x30; break;
case '?': res = 0x20; break;
}
if (res) {
break;
}
}
free(km);
return res;
}