/* Copyright (C) 2019 Nunuhara Cabbage * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, see . */ #include #include "system4.h" #include "sdl_private.h" #include "input.h" #include "vm.h" bool key_state[VK_NR_KEYCODES]; static enum sact_keycode sdl_keytable[]; bool mouse_focus = true; bool keyboard_focus = true; static enum sact_keycode sdl_to_sact_button(int button) { switch (button) { case SDL_BUTTON_LEFT: return VK_LBUTTON; case SDL_BUTTON_RIGHT: return VK_RBUTTON; case SDL_BUTTON_MIDDLE: return VK_MBUTTON; default: return 0; } } bool key_is_down(enum sact_keycode code) { return key_state[code]; } void key_clear_flag(void) { for (int i = 0; i < VK_NR_KEYCODES; i++) { key_state[i] = false; } } void mouse_get_pos(int *x, int *y) { SDL_GetMouseState(x, y); } static void key_event(SDL_KeyboardEvent *e, bool pressed) { enum sact_keycode code = sdl_keytable[e->keysym.scancode]; if (code) key_state[code] = pressed; } static void mouse_event(SDL_MouseButtonEvent *e) { enum sact_keycode code = sdl_to_sact_button(e->button); if (code) key_state[code] = e->state == SDL_PRESSED; } void handle_events(void) { SDL_Event e; while (SDL_PollEvent(&e)) { switch (e.type) { case SDL_QUIT: vm_exit(0); break; case SDL_WINDOWEVENT: switch (e.window.event) { case SDL_WINDOWEVENT_EXPOSED: sdl.dirty = true; break; case SDL_WINDOWEVENT_ENTER: mouse_focus = true; break; case SDL_WINDOWEVENT_LEAVE: mouse_focus = false; break; case SDL_WINDOWEVENT_FOCUS_GAINED: keyboard_focus = true; break; case SDL_WINDOWEVENT_FOCUS_LOST: keyboard_focus = false; break; } break; case SDL_KEYDOWN: key_event(&e.key, true); break; case SDL_KEYUP: key_event(&e.key, false); break; case SDL_MOUSEBUTTONUP: case SDL_MOUSEBUTTONDOWN: mouse_event(&e.button); break; default: break; } } } static enum sact_keycode sdl_keytable[] = { [SDL_SCANCODE_0] = VK_0, [SDL_SCANCODE_1] = VK_1, [SDL_SCANCODE_2] = VK_2, [SDL_SCANCODE_3] = VK_3, [SDL_SCANCODE_4] = VK_4, [SDL_SCANCODE_5] = VK_5, [SDL_SCANCODE_6] = VK_6, [SDL_SCANCODE_7] = VK_7, [SDL_SCANCODE_8] = VK_8, [SDL_SCANCODE_9] = VK_9, [SDL_SCANCODE_A] = VK_A, [SDL_SCANCODE_B] = VK_B, [SDL_SCANCODE_C] = VK_C, [SDL_SCANCODE_D] = VK_D, [SDL_SCANCODE_E] = VK_E, [SDL_SCANCODE_F] = VK_F, [SDL_SCANCODE_G] = VK_G, [SDL_SCANCODE_H] = VK_H, [SDL_SCANCODE_I] = VK_I, [SDL_SCANCODE_J] = VK_J, [SDL_SCANCODE_K] = VK_K, [SDL_SCANCODE_L] = VK_L, [SDL_SCANCODE_M] = VK_M, [SDL_SCANCODE_N] = VK_N, [SDL_SCANCODE_O] = VK_O, [SDL_SCANCODE_P] = VK_P, [SDL_SCANCODE_Q] = VK_Q, [SDL_SCANCODE_R] = VK_R, [SDL_SCANCODE_S] = VK_S, [SDL_SCANCODE_T] = VK_T, [SDL_SCANCODE_U] = VK_U, [SDL_SCANCODE_V] = VK_V, [SDL_SCANCODE_W] = VK_W, [SDL_SCANCODE_X] = VK_X, [SDL_SCANCODE_Y] = VK_Y, [SDL_SCANCODE_Z] = VK_Z, [SDL_SCANCODE_BACKSPACE] = VK_BACK, [SDL_SCANCODE_TAB] = VK_TAB, [SDL_SCANCODE_CLEAR] = VK_CLEAR, [SDL_SCANCODE_RETURN] = VK_RETURN, [SDL_SCANCODE_LSHIFT] = VK_SHIFT, [SDL_SCANCODE_RSHIFT] = VK_SHIFT, [SDL_SCANCODE_LCTRL] = VK_CONTROL, [SDL_SCANCODE_RCTRL] = VK_CONTROL, [SDL_SCANCODE_LALT] = VK_MENU, [SDL_SCANCODE_RALT] = VK_MENU, [SDL_SCANCODE_PAUSE] = VK_PAUSE, [SDL_SCANCODE_CAPSLOCK] = VK_CAPITAL, [SDL_SCANCODE_ESCAPE] = VK_ESCAPE, [SDL_SCANCODE_SPACE] = VK_SPACE, [SDL_SCANCODE_PAGEUP] = VK_PRIOR, [SDL_SCANCODE_PAGEDOWN] = VK_NEXT, [SDL_SCANCODE_END] = VK_END, [SDL_SCANCODE_HOME] = VK_HOME, [SDL_SCANCODE_LEFT] = VK_LEFT, [SDL_SCANCODE_UP] = VK_UP, [SDL_SCANCODE_RIGHT] = VK_RIGHT, [SDL_SCANCODE_DOWN] = VK_DOWN, [SDL_SCANCODE_SELECT] = VK_SELECT, [SDL_SCANCODE_EXECUTE] = VK_EXECUTE, [SDL_SCANCODE_PRINTSCREEN] = VK_SNAPSHOT, [SDL_SCANCODE_INSERT] = VK_INSERT, [SDL_SCANCODE_DELETE] = VK_DELETE, [SDL_SCANCODE_HELP] = VK_HELP, [SDL_SCANCODE_KP_0] = VK_NUMPAD0, [SDL_SCANCODE_KP_1] = VK_NUMPAD1, [SDL_SCANCODE_KP_2] = VK_NUMPAD2, [SDL_SCANCODE_KP_3] = VK_NUMPAD3, [SDL_SCANCODE_KP_4] = VK_NUMPAD4, [SDL_SCANCODE_KP_5] = VK_NUMPAD5, [SDL_SCANCODE_KP_6] = VK_NUMPAD6, [SDL_SCANCODE_KP_7] = VK_NUMPAD7, [SDL_SCANCODE_KP_8] = VK_NUMPAD8, [SDL_SCANCODE_KP_9] = VK_NUMPAD9, [SDL_SCANCODE_KP_MULTIPLY] = VK_MULTIPLY, [SDL_SCANCODE_KP_PLUS] = VK_ADD, [SDL_SCANCODE_KP_VERTICALBAR] = VK_SEPARATOR, // ??? [SDL_SCANCODE_KP_MINUS] = VK_SUBTRACT, [SDL_SCANCODE_KP_PERIOD] = VK_DECIMAL, [SDL_SCANCODE_KP_DIVIDE] = VK_DIVIDE, [SDL_SCANCODE_F1] = VK_F1, [SDL_SCANCODE_F2] = VK_F2, [SDL_SCANCODE_F3] = VK_F3, [SDL_SCANCODE_F4] = VK_F4, [SDL_SCANCODE_F5] = VK_F5, [SDL_SCANCODE_F6] = VK_F6, [SDL_SCANCODE_F7] = VK_F7, [SDL_SCANCODE_F8] = VK_F8, [SDL_SCANCODE_F9] = VK_F9, [SDL_SCANCODE_F10] = VK_F10, [SDL_SCANCODE_F11] = VK_F11, [SDL_SCANCODE_F12] = VK_F12, [SDL_SCANCODE_F13] = VK_F13, [SDL_SCANCODE_F14] = VK_F14, [SDL_SCANCODE_F15] = VK_F15, [SDL_SCANCODE_F16] = VK_F16, [SDL_SCANCODE_F17] = VK_F17, [SDL_SCANCODE_F18] = VK_F18, [SDL_SCANCODE_F19] = VK_F19, [SDL_SCANCODE_F20] = VK_F20, [SDL_SCANCODE_F21] = VK_F21, [SDL_SCANCODE_F22] = VK_F22, [SDL_SCANCODE_F23] = VK_F23, [SDL_SCANCODE_F24] = VK_F24, [SDL_SCANCODE_NUMLOCKCLEAR] = VK_NUMLOCK, [SDL_SCANCODE_SCROLLLOCK] = VK_SCROLL, };