diff --git a/src/keycodes.inl b/src/keycodes.inl index 4400fe3..9f44e5d 100644 --- a/src/keycodes.inl +++ b/src/keycodes.inl @@ -1,82 +1,233 @@ -[tic_key_unknown] = SDLK_UNKNOWN, -[tic_key_a] = SDLK_a, -[tic_key_b] = SDLK_b, -[tic_key_c] = SDLK_c, -[tic_key_d] = SDLK_d, -[tic_key_e] = SDLK_e, -[tic_key_f] = SDLK_f, -[tic_key_g] = SDLK_g, -[tic_key_h] = SDLK_h, -[tic_key_i] = SDLK_i, -[tic_key_j] = SDLK_j, -[tic_key_k] = SDLK_k, -[tic_key_l] = SDLK_l, -[tic_key_m] = SDLK_m, -[tic_key_n] = SDLK_n, -[tic_key_o] = SDLK_o, -[tic_key_p] = SDLK_p, -[tic_key_q] = SDLK_q, -[tic_key_r] = SDLK_r, -[tic_key_s] = SDLK_s, -[tic_key_t] = SDLK_t, -[tic_key_u] = SDLK_u, -[tic_key_v] = SDLK_v, -[tic_key_w] = SDLK_w, -[tic_key_x] = SDLK_x, -[tic_key_y] = SDLK_y, -[tic_key_z] = SDLK_z, - -[tic_key_0] = SDLK_0, -[tic_key_1] = SDLK_1, -[tic_key_2] = SDLK_2, -[tic_key_3] = SDLK_3, -[tic_key_4] = SDLK_4, -[tic_key_5] = SDLK_5, -[tic_key_6] = SDLK_6, -[tic_key_7] = SDLK_7, -[tic_key_8] = SDLK_8, -[tic_key_9] = SDLK_9, - -[tic_key_minus] = SDLK_MINUS, -[tic_key_equals] = SDLK_EQUALS, -[tic_key_leftbracket] = SDLK_LEFTBRACKET, -[tic_key_rightbracket] = SDLK_RIGHTBRACKET, -[tic_key_backslash] = SDLK_BACKSLASH, -[tic_key_semicolon] = SDLK_SEMICOLON, -[tic_key_apostrophe] = SDLK_QUOTE, -[tic_key_grave] = SDLK_BACKQUOTE, -[tic_key_comma] = SDLK_COMMA, -[tic_key_period] = SDLK_PERIOD, -[tic_key_slash] = SDLK_SLASH, -[tic_key_space] = SDLK_SPACE, -[tic_key_tab] = SDLK_TAB, -[tic_key_return] = SDLK_RETURN, -[tic_key_backspace] = SDLK_BACKSPACE, -[tic_key_delete] = SDLK_DELETE, -[tic_key_insert] = SDLK_INSERT, -[tic_key_pageup] = SDLK_PAGEUP, -[tic_key_pagedown] = SDLK_PAGEDOWN, -[tic_key_home] = SDLK_HOME, -[tic_key_end] = SDLK_END, -[tic_key_up] = SDLK_UP, -[tic_key_down] = SDLK_DOWN, -[tic_key_left] = SDLK_LEFT, -[tic_key_right] = SDLK_RIGHT, -[tic_key_capslock] = SDLK_CAPSLOCK, -[tic_key_ctrl] = SDLK_LCTRL, -[tic_key_shift] = SDLK_LSHIFT, -[tic_key_alt] = SDLK_LALT, -[tic_key_escape] = SDLK_ESCAPE, - -[tic_key_f1] = SDLK_F1, -[tic_key_f2] = SDLK_F2, -[tic_key_f3] = SDLK_F3, -[tic_key_f4] = SDLK_F4, -[tic_key_f5] = SDLK_F5, -[tic_key_f6] = SDLK_F6, -[tic_key_f7] = SDLK_F7, -[tic_key_f8] = SDLK_F8, -[tic_key_f9] = SDLK_F9, -[tic_key_f10] = SDLK_F10, -[tic_key_f11] = SDLK_F11, -[tic_key_f12] = SDLK_F12, +[0] = tic_key_unknown, +[1] = tic_key_unknown, +[2] = tic_key_unknown, +[3] = tic_key_unknown, +[SDL_SCANCODE_A] = tic_key_a, +[SDL_SCANCODE_B] = tic_key_b, +[SDL_SCANCODE_C] = tic_key_c, +[SDL_SCANCODE_D] = tic_key_d, +[SDL_SCANCODE_E] = tic_key_e, +[SDL_SCANCODE_F] = tic_key_f, +[SDL_SCANCODE_G] = tic_key_g, +[SDL_SCANCODE_H] = tic_key_h, +[SDL_SCANCODE_I] = tic_key_i, +[SDL_SCANCODE_J] = tic_key_j, +[SDL_SCANCODE_K] = tic_key_k, +[SDL_SCANCODE_L] = tic_key_l, +[SDL_SCANCODE_M] = tic_key_m, +[SDL_SCANCODE_N] = tic_key_n, +[SDL_SCANCODE_O] = tic_key_o, +[SDL_SCANCODE_P] = tic_key_p, +[SDL_SCANCODE_Q] = tic_key_q, +[SDL_SCANCODE_R] = tic_key_r, +[SDL_SCANCODE_S] = tic_key_s, +[SDL_SCANCODE_T] = tic_key_t, +[SDL_SCANCODE_U] = tic_key_u, +[SDL_SCANCODE_V] = tic_key_v, +[SDL_SCANCODE_W] = tic_key_w, +[SDL_SCANCODE_X] = tic_key_x, +[SDL_SCANCODE_Y] = tic_key_y, +[SDL_SCANCODE_Z] = tic_key_z, +[SDL_SCANCODE_1] = tic_key_1, +[SDL_SCANCODE_2] = tic_key_2, +[SDL_SCANCODE_3] = tic_key_3, +[SDL_SCANCODE_4] = tic_key_4, +[SDL_SCANCODE_5] = tic_key_5, +[SDL_SCANCODE_6] = tic_key_6, +[SDL_SCANCODE_7] = tic_key_7, +[SDL_SCANCODE_8] = tic_key_8, +[SDL_SCANCODE_9] = tic_key_9, +[SDL_SCANCODE_0] = tic_key_0, +[SDL_SCANCODE_RETURN] = tic_key_return, +[SDL_SCANCODE_ESCAPE] = tic_key_escape, +[SDL_SCANCODE_AC_BACK] = tic_key_escape, +[SDL_SCANCODE_BACKSPACE] = tic_key_backspace, +[SDL_SCANCODE_TAB] = tic_key_tab, +[SDL_SCANCODE_SPACE] = tic_key_space, +[SDL_SCANCODE_MINUS] = tic_key_minus, +[SDL_SCANCODE_EQUALS] = tic_key_equals, +[SDL_SCANCODE_LEFTBRACKET] = tic_key_leftbracket, +[SDL_SCANCODE_RIGHTBRACKET] = tic_key_rightbracket, +[SDL_SCANCODE_BACKSLASH] = tic_key_backslash, +[50] = tic_key_unknown, +[SDL_SCANCODE_SEMICOLON] = tic_key_semicolon, +[SDL_SCANCODE_APOSTROPHE] = tic_key_apostrophe, +[SDL_SCANCODE_GRAVE] = tic_key_grave, +[SDL_SCANCODE_COMMA] = tic_key_comma, +[SDL_SCANCODE_PERIOD] = tic_key_period, +[SDL_SCANCODE_SLASH] = tic_key_slash, +[SDL_SCANCODE_CAPSLOCK] = tic_key_capslock, +[SDL_SCANCODE_F1] = tic_key_f1, +[SDL_SCANCODE_F2] = tic_key_f2, +[SDL_SCANCODE_F3] = tic_key_f3, +[SDL_SCANCODE_F4] = tic_key_f4, +[SDL_SCANCODE_F5] = tic_key_f5, +[SDL_SCANCODE_F6] = tic_key_f6, +[SDL_SCANCODE_F7] = tic_key_f7, +[SDL_SCANCODE_F8] = tic_key_f8, +[SDL_SCANCODE_F9] = tic_key_f9, +[SDL_SCANCODE_F10] = tic_key_f10, +[SDL_SCANCODE_F11] = tic_key_f11, +[SDL_SCANCODE_F12] = tic_key_f12, +[70] = tic_key_unknown, +[71] = tic_key_unknown, +[72] = tic_key_unknown, +[SDL_SCANCODE_INSERT] = tic_key_insert, +[SDL_SCANCODE_HOME] = tic_key_home, +[SDL_SCANCODE_PAGEUP] = tic_key_pageup, +[SDL_SCANCODE_DELETE] = tic_key_delete, +[SDL_SCANCODE_END] = tic_key_end, +[SDL_SCANCODE_PAGEDOWN] = tic_key_pagedown, +[SDL_SCANCODE_RIGHT] = tic_key_right, +[SDL_SCANCODE_LEFT] = tic_key_left, +[SDL_SCANCODE_DOWN] = tic_key_down, +[SDL_SCANCODE_UP] = tic_key_up, +[83] = tic_key_unknown, +[84] = tic_key_unknown, +[85] = tic_key_unknown, +[86] = tic_key_unknown, +[87] = tic_key_unknown, +[88] = tic_key_unknown, +[89] = tic_key_unknown, +[90] = tic_key_unknown, +[91] = tic_key_unknown, +[92] = tic_key_unknown, +[93] = tic_key_unknown, +[94] = tic_key_unknown, +[95] = tic_key_unknown, +[96] = tic_key_unknown, +[97] = tic_key_unknown, +[98] = tic_key_unknown, +[99] = tic_key_unknown, +[100] = tic_key_unknown, +[101] = tic_key_unknown, +[102] = tic_key_unknown, +[103] = tic_key_unknown, +[104] = tic_key_unknown, +[105] = tic_key_unknown, +[106] = tic_key_unknown, +[107] = tic_key_unknown, +[108] = tic_key_unknown, +[109] = tic_key_unknown, +[110] = tic_key_unknown, +[111] = tic_key_unknown, +[112] = tic_key_unknown, +[113] = tic_key_unknown, +[114] = tic_key_unknown, +[115] = tic_key_unknown, +[116] = tic_key_unknown, +[117] = tic_key_unknown, +[118] = tic_key_unknown, +[119] = tic_key_unknown, +[120] = tic_key_unknown, +[121] = tic_key_unknown, +[122] = tic_key_unknown, +[123] = tic_key_unknown, +[124] = tic_key_unknown, +[125] = tic_key_unknown, +[126] = tic_key_unknown, +[127] = tic_key_unknown, +[128] = tic_key_unknown, +[129] = tic_key_unknown, +[130] = tic_key_unknown, +[131] = tic_key_unknown, +[132] = tic_key_unknown, +[133] = tic_key_unknown, +[134] = tic_key_unknown, +[135] = tic_key_unknown, +[136] = tic_key_unknown, +[137] = tic_key_unknown, +[138] = tic_key_unknown, +[139] = tic_key_unknown, +[140] = tic_key_unknown, +[141] = tic_key_unknown, +[142] = tic_key_unknown, +[143] = tic_key_unknown, +[144] = tic_key_unknown, +[145] = tic_key_unknown, +[146] = tic_key_unknown, +[147] = tic_key_unknown, +[148] = tic_key_unknown, +[149] = tic_key_unknown, +[150] = tic_key_unknown, +[151] = tic_key_unknown, +[152] = tic_key_unknown, +[153] = tic_key_unknown, +[154] = tic_key_unknown, +[155] = tic_key_unknown, +[156] = tic_key_unknown, +[157] = tic_key_unknown, +[158] = tic_key_unknown, +[159] = tic_key_unknown, +[160] = tic_key_unknown, +[161] = tic_key_unknown, +[162] = tic_key_unknown, +[163] = tic_key_unknown, +[164] = tic_key_unknown, +[165] = tic_key_unknown, +[166] = tic_key_unknown, +[167] = tic_key_unknown, +[168] = tic_key_unknown, +[169] = tic_key_unknown, +[170] = tic_key_unknown, +[171] = tic_key_unknown, +[172] = tic_key_unknown, +[173] = tic_key_unknown, +[174] = tic_key_unknown, +[175] = tic_key_unknown, +[176] = tic_key_unknown, +[177] = tic_key_unknown, +[178] = tic_key_unknown, +[179] = tic_key_unknown, +[180] = tic_key_unknown, +[181] = tic_key_unknown, +[182] = tic_key_unknown, +[183] = tic_key_unknown, +[184] = tic_key_unknown, +[185] = tic_key_unknown, +[186] = tic_key_unknown, +[187] = tic_key_unknown, +[188] = tic_key_unknown, +[189] = tic_key_unknown, +[190] = tic_key_unknown, +[191] = tic_key_unknown, +[192] = tic_key_unknown, +[193] = tic_key_unknown, +[194] = tic_key_unknown, +[195] = tic_key_unknown, +[196] = tic_key_unknown, +[197] = tic_key_unknown, +[198] = tic_key_unknown, +[199] = tic_key_unknown, +[200] = tic_key_unknown, +[201] = tic_key_unknown, +[202] = tic_key_unknown, +[203] = tic_key_unknown, +[204] = tic_key_unknown, +[205] = tic_key_unknown, +[206] = tic_key_unknown, +[207] = tic_key_unknown, +[208] = tic_key_unknown, +[209] = tic_key_unknown, +[210] = tic_key_unknown, +[211] = tic_key_unknown, +[212] = tic_key_unknown, +[213] = tic_key_unknown, +[214] = tic_key_unknown, +[215] = tic_key_unknown, +[216] = tic_key_unknown, +[217] = tic_key_unknown, +[218] = tic_key_unknown, +[219] = tic_key_unknown, +[220] = tic_key_unknown, +[221] = tic_key_unknown, +[222] = tic_key_unknown, +[223] = tic_key_unknown, +[SDL_SCANCODE_LCTRL] = tic_key_ctrl, +[SDL_SCANCODE_LSHIFT] = tic_key_shift, +[SDL_SCANCODE_LALT] = tic_key_alt, +[SDL_SCANCODE_LGUI] = tic_key_ctrl, +[SDL_SCANCODE_RCTRL] = tic_key_ctrl, +[SDL_SCANCODE_RSHIFT] = tic_key_shift, +[SDL_SCANCODE_RALT] = tic_key_alt, +[SDL_SCANCODE_RGUI] = tic_key_ctrl, diff --git a/src/studio.c b/src/studio.c index 8368cb1..cb1b756 100644 --- a/src/studio.c +++ b/src/studio.c @@ -237,6 +237,10 @@ static struct char getKeyboardText() { + char text = getSystem()->getKeyboardText(); + + if(text) return text; + tic_mem* tic = impl.studio.tic; static const char Symbols[] = " abcdefghijklmnopqrstuvwxyz0123456789-=[]\\;'`,./ "; diff --git a/src/system.c b/src/system.c index bfd161f..e783433 100644 --- a/src/system.c +++ b/src/system.c @@ -65,8 +65,7 @@ static struct GPU_Image* down; } texture; - u8 text; - + char text; } keyboard; u32 touchCounter; @@ -396,107 +395,41 @@ static void processMouse() } } -static void appendKeycode(tic_keycode code) +// TODO: ugly hack, but I didn't find a better solution +// will try to fix it later +static char getKeyboardText() { - tic80_input* input = &platform.studio->tic->ram.input; - - enum{BufSize = COUNT_OF(input->keyboard.keys)}; - - for(s32 i = 0; i < BufSize; i++) - { - if(input->keyboard.keys[i] == tic_key_unknown) - { - input->keyboard.keys[i] = code; - return; - } - else if(input->keyboard.keys[i] == code) return; - } + char text = platform.keyboard.text; + platform.keyboard.text = 0; + return text; } static void processKeyboard() { - tic80_input* input = &platform.studio->tic->ram.input; - input->keyboard.data = 0; - - SDL_Keymod mod = SDL_GetModState(); - - if(mod & KMOD_RALT) - { - static const struct {tic_keycode code; tic_keycode shift;} TextCodes[] = - { - ['-'] = {tic_key_minus, tic_key_unknown}, - ['='] = {tic_key_equals, tic_key_unknown}, - ['['] = {tic_key_leftbracket, tic_key_unknown}, - [']'] = {tic_key_rightbracket, tic_key_unknown}, - ['\\'] = {tic_key_backslash, tic_key_unknown}, - [';'] = {tic_key_semicolon, tic_key_unknown}, - ['\''] = {tic_key_apostrophe, tic_key_unknown}, - ['`'] = {tic_key_grave, tic_key_unknown}, - [','] = {tic_key_comma, tic_key_unknown}, - ['.'] = {tic_key_period, tic_key_unknown}, - ['/'] = {tic_key_slash, tic_key_unknown}, - [')'] = {tic_key_0, tic_key_shift}, - ['!'] = {tic_key_1, tic_key_shift}, - ['@'] = {tic_key_2, tic_key_shift}, - ['#'] = {tic_key_3, tic_key_shift}, - ['$'] = {tic_key_4, tic_key_shift}, - ['%'] = {tic_key_5, tic_key_shift}, - ['^'] = {tic_key_6, tic_key_shift}, - ['&'] = {tic_key_7, tic_key_shift}, - ['*'] = {tic_key_8, tic_key_shift}, - ['('] = {tic_key_9, tic_key_shift}, - ['_'] = {tic_key_minus, tic_key_shift}, - ['+'] = {tic_key_equals, tic_key_shift}, - ['{'] = {tic_key_leftbracket, tic_key_shift}, - ['}'] = {tic_key_rightbracket, tic_key_shift}, - ['|'] = {tic_key_backslash, tic_key_shift}, - [':'] = {tic_key_semicolon, tic_key_shift}, - ['"'] = {tic_key_apostrophe, tic_key_shift}, - ['~'] = {tic_key_grave, tic_key_shift}, - ['<'] = {tic_key_comma, tic_key_shift}, - ['>'] = {tic_key_period, tic_key_shift}, - ['?'] = {tic_key_slash, tic_key_shift}, - }; - - if(platform.keyboard.text && platform.keyboard.text < COUNT_OF(TextCodes)) - { - appendKeycode(TextCodes[platform.keyboard.text].code); - appendKeycode(TextCodes[platform.keyboard.text].shift); - platform.keyboard.text = 0; - } - - return; - } - - const u8* keyboard = SDL_GetKeyboardState(NULL); - - if(mod & KMOD_SHIFT) appendKeycode(tic_key_shift); - if(mod & (KMOD_CTRL | KMOD_GUI)) appendKeycode(tic_key_ctrl); - if(mod & KMOD_CAPS) appendKeycode(tic_key_capslock); - - static const SDL_Keycode KeyboardCodes[tic_keys_count] = + static const u8 KeyboardCodes[] = { #include "keycodes.inl" }; - for(s32 i = 0; i < SDL_NUM_SCANCODES; i++) - { - if(keyboard[i]) - { - SDL_Keycode keycode = i == SDL_SCANCODE_AC_BACK - ? SDLK_ESCAPE - : SDL_GetKeyFromScancode(i); + tic80_input* input = &platform.studio->tic->ram.input; + input->keyboard.data = 0; - for(s32 k = 0; k < COUNT_OF(KeyboardCodes); k++) - { - if(KeyboardCodes[k] == keycode) - { - appendKeycode(k); - break; - } - } - } + enum{BufSize = COUNT_OF(input->keyboard.keys)}; + + s32 c = 0; + { + SDL_Keymod mod = SDL_GetModState(); + if(mod & KMOD_SHIFT) input->keyboard.keys[c++] = tic_key_shift; + if(mod & (KMOD_CTRL | KMOD_GUI)) input->keyboard.keys[c++] = tic_key_ctrl; + if(mod & KMOD_ALT) input->keyboard.keys[c++] = tic_key_alt; + if(mod & KMOD_CAPS) input->keyboard.keys[c++] = tic_key_capslock; } + + const u8* keyboard = SDL_GetKeyboardState(NULL); + + for(s32 i = 0; i < COUNT_OF(KeyboardCodes) && c < COUNT_OF(input->keyboard.keys); i++) + if(keyboard[i] && KeyboardCodes[i] > tic_key_unknown) + input->keyboard.keys[c++] = KeyboardCodes[i]; } #if !defined(__EMSCRIPTEN__) && !defined(__MACOSX__) @@ -864,15 +797,12 @@ static void pollEvent() break; case SDL_TEXTINPUT: { - const char* symbol = event.text.text; - if(strlen(symbol) == 1) - platform.keyboard.text = *symbol; + const char* text = event.text.text; + + if(strlen(text) == 1) + platform.keyboard.text = *text; } break; - case SDL_KEYDOWN: - if(event.key.keysym.sym == SDLK_RALT) - platform.keyboard.text = 0; - break; case SDL_QUIT: platform.studio->exit(); break; @@ -1248,7 +1178,7 @@ static void preseed() static char* prepareShader(const char* code) { GPU_Renderer* renderer = GPU_GetCurrentRenderer(); - const char* header = ""; + const char* header = ""; if(renderer->shader_language == GPU_LANGUAGE_GLSL) { @@ -1366,6 +1296,7 @@ static System systemInterface = .preseed = preseed, .poll = pollEvent, .updateConfig = updateConfig, + .getKeyboardText = getKeyboardText, }; static void gpuTick() diff --git a/src/system.h b/src/system.h index 7473064..cb34d5b 100644 --- a/src/system.h +++ b/src/system.h @@ -29,6 +29,8 @@ typedef struct void (*updateConfig)(); + char (*getKeyboardText)(); + } System; typedef struct