#include #include #include "controller_api.h" #ifdef TARGET_WEB #include "controller_emscripten_keyboard.h" #endif #include "../configfile.h" #include "controller_keyboard.h" static int keyboard_buttons_down; #define MAX_KEYBINDS 64 static int keyboard_mapping[MAX_KEYBINDS][2]; static int num_keybinds = 0; static u32 keyboard_lastkey = VK_INVALID; static int keyboard_map_scancode(int scancode) { int ret = 0; for (int i = 0; i < num_keybinds; i++) { if (keyboard_mapping[i][0] == scancode) { ret |= keyboard_mapping[i][1]; } } return ret; } bool keyboard_on_key_down(int scancode) { int mapped = keyboard_map_scancode(scancode); keyboard_buttons_down |= mapped; keyboard_lastkey = scancode; return mapped != 0; } bool keyboard_on_key_up(int scancode) { int mapped = keyboard_map_scancode(scancode); keyboard_buttons_down &= ~mapped; if (keyboard_lastkey == (u32) scancode) keyboard_lastkey = VK_INVALID; return mapped != 0; } void keyboard_on_all_keys_up(void) { keyboard_buttons_down = 0; } static void keyboard_add_binds(int mask, unsigned int *scancode) { for (int i = 0; i < MAX_BINDS && num_keybinds < MAX_KEYBINDS; ++i) { if (scancode[i] < VK_BASE_KEYBOARD + VK_SIZE) { keyboard_mapping[num_keybinds][0] = scancode[i]; keyboard_mapping[num_keybinds][1] = mask; num_keybinds++; } } } static void keyboard_bindkeys(void) { bzero(keyboard_mapping, sizeof(keyboard_mapping)); num_keybinds = 0; keyboard_add_binds(0x80000, configKeyStickUp); keyboard_add_binds(0x10000, configKeyStickLeft); keyboard_add_binds(0x40000, configKeyStickDown); keyboard_add_binds(0x20000, configKeyStickRight); keyboard_add_binds(A_BUTTON, configKeyA); keyboard_add_binds(B_BUTTON, configKeyB); keyboard_add_binds(Z_TRIG, configKeyZ); keyboard_add_binds(U_CBUTTONS, configKeyCUp); keyboard_add_binds(L_CBUTTONS, configKeyCLeft); keyboard_add_binds(D_CBUTTONS, configKeyCDown); keyboard_add_binds(R_CBUTTONS, configKeyCRight); keyboard_add_binds(L_TRIG, configKeyL); keyboard_add_binds(R_TRIG, configKeyR); keyboard_add_binds(START_BUTTON, configKeyStart); } static void keyboard_init(void) { keyboard_bindkeys(); #ifdef TARGET_WEB controller_emscripten_keyboard_init(); #endif } static void keyboard_read(OSContPad *pad) { pad->button |= keyboard_buttons_down; if ((keyboard_buttons_down & 0x30000) == 0x10000) { pad->stick_x = -128; } if ((keyboard_buttons_down & 0x30000) == 0x20000) { pad->stick_x = 127; } if ((keyboard_buttons_down & 0xc0000) == 0x40000) { pad->stick_y = -128; } if ((keyboard_buttons_down & 0xc0000) == 0x80000) { pad->stick_y = 127; } } static u32 keyboard_rawkey(void) { const u32 ret = keyboard_lastkey; keyboard_lastkey = VK_INVALID; return ret; } struct ControllerAPI controller_keyboard = { VK_BASE_KEYBOARD, keyboard_init, keyboard_read, keyboard_rawkey, keyboard_bindkeys, };