diff --git a/src/video/switch/SDL_switchkeyboard.c b/src/video/switch/SDL_switchkeyboard.c new file mode 100644 index 000000000..0d8f7bc6b --- /dev/null +++ b/src/video/switch/SDL_switchkeyboard.c @@ -0,0 +1,270 @@ +/* + Simple DirectMedia Layer + Copyright (C) 1997-2018 Sam Lantinga + + This software is provided 'as-is', without any express or implied + warranty. In no event will the authors be held liable for any damages + arising from the use of this software. + + Permission is granted to anyone to use this software for any purpose, + including commercial applications, and to alter it and redistribute it + freely, subject to the following restrictions: + + 1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. + 2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. + 3. This notice may not be removed or altered from any source distribution. +*/ +#include "../../SDL_internal.h" + +#if SDL_VIDEO_DRIVER_SWITCH + +#include + +#include "SDL_events.h" +#include "SDL_log.h" +#include "SDL_switchvideo.h" +#include "SDL_switchkeyboard.h" +#include "../../events/SDL_keyboard_c.h" + +#define NUM_SCANCODES_SWITCH 160 + +static uint8_t locks = 0; +static bool keystate[NUM_SCANCODES_SWITCH] = { 0 }; +static const uint8_t switch_scancodes[NUM_SCANCODES_SWITCH] = { + KBD_A, + KBD_B, + KBD_C, + KBD_D, + KBD_E, + KBD_F, + KBD_G, + KBD_H, + KBD_I, + KBD_J, + KBD_K, + KBD_L, + KBD_M, + KBD_N, + KBD_O, + KBD_P, + KBD_Q, + KBD_R, + KBD_S, + KBD_T, + KBD_U, + KBD_V, + KBD_W, + KBD_X, + KBD_Y, + KBD_Z, + KBD_1, + KBD_2, + KBD_3, + KBD_4, + KBD_5, + KBD_6, + KBD_7, + KBD_8, + KBD_9, + KBD_0, + KBD_ENTER, + KBD_ESC, + KBD_BACKSPACE, + KBD_TAB, + KBD_SPACE, + KBD_MINUS, + KBD_EQUAL, + KBD_LEFTBRACE, + KBD_RIGHTBRACE, + KBD_BACKSLASH, + KBD_HASHTILDE, + KBD_SEMICOLON, + KBD_APOSTROPHE, + KBD_GRAVE, + KBD_COMMA, + KBD_DOT, + KBD_SLASH, + KBD_CAPSLOCK, + KBD_F1, + KBD_F2, + KBD_F3, + KBD_F4, + KBD_F5, + KBD_F6, + KBD_F7, + KBD_F8, + KBD_F9, + KBD_F10, + KBD_F11, + KBD_F12, + KBD_SYSRQ, + KBD_SCROLLLOCK, + KBD_PAUSE, + KBD_INSERT, + KBD_HOME, + KBD_PAGEUP, + KBD_DELETE, + KBD_END, + KBD_PAGEDOWN, + KBD_RIGHT, + KBD_LEFT, + KBD_DOWN, + KBD_UP, + KBD_NUMLOCK, + KBD_KPSLASH, + KBD_KPASTERISK, + KBD_KPMINUS, + KBD_KPPLUS, + KBD_KPENTER, + KBD_KP1, + KBD_KP2, + KBD_KP3, + KBD_KP4, + KBD_KP5, + KBD_KP6, + KBD_KP7, + KBD_KP8, + KBD_KP9, + KBD_KP0, + KBD_KPDOT, + KBD_102ND, + KBD_COMPOSE, + KBD_POWER, + KBD_KPEQUAL, + KBD_F13, + KBD_F14, + KBD_F15, + KBD_F16, + KBD_F17, + KBD_F18, + KBD_F19, + KBD_F20, + KBD_F21, + KBD_F22, + KBD_F23, + KBD_F24, + KBD_OPEN, + KBD_HELP, + KBD_PROPS, + KBD_FRONT, + KBD_STOP, + KBD_AGAIN, + KBD_UNDO, + KBD_CUT, + KBD_COPY, + KBD_PASTE, + KBD_FIND, + KBD_MUTE, + KBD_VOLUMEUP, + KBD_VOLUMEDOWN, + KBD_CAPSLOCK_ACTIVE, + KBD_NUMLOCK_ACTIVE, + KBD_SCROLLLOCK_ACTIVE, + KBD_KPCOMMA, + KBD_KPLEFTPAREN, + KBD_KPRIGHTPAREN, + KBD_LEFTCTRL, + KBD_LEFTSHIFT, + KBD_LEFTALT, + KBD_LEFTMETA, + KBD_RIGHTCTRL, + KBD_RIGHTSHIFT, + KBD_RIGHTALT, + KBD_RIGHTMETA, + KBD_MEDIA_PLAYPAUSE, + KBD_MEDIA_STOPCD, + KBD_MEDIA_PREVIOUSSONG, + KBD_MEDIA_NEXTSONG, + KBD_MEDIA_EJECTCD, + KBD_MEDIA_VOLUMEUP, + KBD_MEDIA_VOLUMEDOWN, + KBD_MEDIA_MUTE, + KBD_MEDIA_WWW, + KBD_MEDIA_BACK, + KBD_MEDIA_FORWARD, + KBD_MEDIA_STOP, + KBD_MEDIA_FIND, + KBD_MEDIA_SCROLLUP, + KBD_MEDIA_SCROLLDOWN, + KBD_MEDIA_EDIT, + KBD_MEDIA_SLEEP, + KBD_MEDIA_COFFEE, + KBD_MEDIA_REFRESH, + KBD_MEDIA_CALC +}; + +void +SWITCH_InitKeyboard(void) +{ +} + +void +SWITCH_PollKeyboard(void) +{ + // We skip polling keyboard if no window is created + if (SDL_GetFocusWindow() == NULL) + return; + + for (int i = 0; i < NUM_SCANCODES_SWITCH; i++) { + + int keyCode = switch_scancodes[i]; + + if (hidKeyboardHeld(keyCode) && !keystate[i]) { + switch (keyCode) { + case SDL_SCANCODE_NUMLOCKCLEAR: + if (!(locks & 0x1)) { + SDL_SendKeyboardKey(SDL_PRESSED, keyCode); + locks |= 0x1; + } else { + SDL_SendKeyboardKey(SDL_RELEASED, keyCode); + locks &= ~0x1; + } + break; + case SDL_SCANCODE_CAPSLOCK: + if (!(locks & 0x2)) { + SDL_SendKeyboardKey(SDL_PRESSED, keyCode); + locks |= 0x2; + } else { + SDL_SendKeyboardKey(SDL_RELEASED, keyCode); + locks &= ~0x2; + } + break; + case SDL_SCANCODE_SCROLLLOCK: + if (!(locks & 0x4)) { + SDL_SendKeyboardKey(SDL_PRESSED, keyCode); + locks |= 0x4; + } else { + SDL_SendKeyboardKey(SDL_RELEASED, keyCode); + locks &= ~0x4; + } + break; + default: + SDL_SendKeyboardKey(SDL_PRESSED, keyCode); + } + keystate[i] = true; + } else if (!hidKeyboardHeld(keyCode) && keystate[i]) { + switch (keyCode) { + case SDL_SCANCODE_CAPSLOCK: + case SDL_SCANCODE_NUMLOCKCLEAR: + case SDL_SCANCODE_SCROLLLOCK: + break; + default: + SDL_SendKeyboardKey(SDL_RELEASED, keyCode); + } + keystate[i] = false; + } + } +} + +void +SWITCH_QuitKeyboard(void) +{ +} + +#endif /* SDL_VIDEO_DRIVER_SWITCH */ + +/* vi: set ts=4 sw=4 expandtab: */ diff --git a/src/video/switch/SDL_switchkeyboard.h b/src/video/switch/SDL_switchkeyboard.h new file mode 100644 index 000000000..a8355db78 --- /dev/null +++ b/src/video/switch/SDL_switchkeyboard.h @@ -0,0 +1,34 @@ +/* + Simple DirectMedia Layer + Copyright (C) 1997-2018 Sam Lantinga + + This software is provided 'as-is', without any express or implied + warranty. In no event will the authors be held liable for any damages + arising from the use of this software. + + Permission is granted to anyone to use this software for any purpose, + including commercial applications, and to alter it and redistribute it + freely, subject to the following restrictions: + + 1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. + 2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. + 3. This notice may not be removed or altered from any source distribution. +*/ + +#ifndef _SDL_switchkeyboard_h +#define _SDL_switchkeyboard_h + +#include "../../SDL_internal.h" + +/* Keyboard functions */ +extern void SWITCH_InitKeyboard(void); +extern void SWITCH_PollKeyboard(void); +extern void SWITCH_QuitKeyboard(void); + +#endif /* _SDL_switchkeyboard_h */ + +/* vi: set ts=4 sw=4 expandtab: */ diff --git a/src/video/switch/SDL_switchmouse.c b/src/video/switch/SDL_switchmouse.c new file mode 100644 index 000000000..a7369d5f2 --- /dev/null +++ b/src/video/switch/SDL_switchmouse.c @@ -0,0 +1,105 @@ +/* + Simple DirectMedia Layer + Copyright (C) 1997-2018 Sam Lantinga + + This software is provided 'as-is', without any express or implied + warranty. In no event will the authors be held liable for any damages + arising from the use of this software. + + Permission is granted to anyone to use this software for any purpose, + including commercial applications, and to alter it and redistribute it + freely, subject to the following restrictions: + + 1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. + 2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. + 3. This notice may not be removed or altered from any source distribution. +*/ +#include "../../SDL_internal.h" + +#if SDL_VIDEO_DRIVER_SWITCH + +#include + +#include "SDL_timer.h" +#include "SDL_events.h" +#include "SDL_log.h" +#include "SDL_mouse.h" +#include "SDL_switchvideo.h" +#include "SDL_switchmouse_c.h" +#include "../../events/SDL_mouse_c.h" + +static uint64_t prev_buttons = 0; +static uint64_t last_timestamp = 0; +const uint64_t mouse_read_interval = 15; // in ms + +void +SWITCH_InitMouse(void) +{ +} + +void +SWITCH_PollMouse(void) +{ + SDL_Window *window = SDL_GetFocusWindow(); + uint64_t buttons; + uint64_t changed_buttons; + MousePosition mouse_pos; + uint64_t timestamp; + int dx, dy; + + // We skip polling mouse if no window is created + if (window == NULL) + return; + + buttons = hidMouseButtonsHeld(); + changed_buttons = buttons ^ prev_buttons; + + if (changed_buttons & MOUSE_LEFT) { + if (prev_buttons & MOUSE_LEFT) + SDL_SendMouseButton(window, 0, SDL_RELEASED, SDL_BUTTON_LEFT); + else + SDL_SendMouseButton(window, 0, SDL_PRESSED, SDL_BUTTON_LEFT); + } + if (changed_buttons & MOUSE_RIGHT) { + if (prev_buttons & MOUSE_RIGHT) + SDL_SendMouseButton(window, 0, SDL_RELEASED, SDL_BUTTON_RIGHT); + else + SDL_SendMouseButton(window, 0, SDL_PRESSED, SDL_BUTTON_RIGHT); + } + if (changed_buttons & MOUSE_MIDDLE) { + if (prev_buttons & MOUSE_MIDDLE) + SDL_SendMouseButton(window, 0, SDL_RELEASED, SDL_BUTTON_MIDDLE); + else + SDL_SendMouseButton(window, 0, SDL_PRESSED, SDL_BUTTON_MIDDLE); + } + + prev_buttons = buttons; + + timestamp = SDL_GetTicks(); + + if (SDL_TICKS_PASSED(timestamp, last_timestamp + mouse_read_interval)) { + hidMouseRead(&mouse_pos); + // if hidMouseRead is called once per frame, a factor two on the velocities + // results in approximately the same mouse motion as reported by mouse_pos.x and mouse_pos.y + // but without the clamping to 1280 x 720 + dx = mouse_pos.velocityX * 2; + dy = mouse_pos.velocityY * 2; + if (dx || dy) { + SDL_SendMouseMotion(window, 0, 1, dx, dy); + } + last_timestamp = timestamp; + } +} + +void +SWITCH_QuitMouse(void) +{ +} + +#endif /* SDL_VIDEO_DRIVER_SWITCH */ + +/* vi: set ts=4 sw=4 expandtab: */ diff --git a/src/video/switch/SDL_switchmouse_c.h b/src/video/switch/SDL_switchmouse_c.h new file mode 100644 index 000000000..c2bd2cfc0 --- /dev/null +++ b/src/video/switch/SDL_switchmouse_c.h @@ -0,0 +1,34 @@ +/* + Simple DirectMedia Layer + Copyright (C) 1997-2018 Sam Lantinga + + This software is provided 'as-is', without any express or implied + warranty. In no event will the authors be held liable for any damages + arising from the use of this software. + + Permission is granted to anyone to use this software for any purpose, + including commercial applications, and to alter it and redistribute it + freely, subject to the following restrictions: + + 1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. + 2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. + 3. This notice may not be removed or altered from any source distribution. +*/ + +#ifndef _SDL_switchmouse_h +#define _SDL_switchmouse_h + +#include "../../SDL_internal.h" + +/* mouse functions */ +extern void SWITCH_InitMouse(void); +extern void SWITCH_PollMouse(void); +extern void SWITCH_QuitMouse(void); + +#endif /* _SDL_switchmouse_h */ + +/* vi: set ts=4 sw=4 expandtab: */ diff --git a/src/video/switch/SDL_switchvideo.c b/src/video/switch/SDL_switchvideo.c index e76b022ce..f10b33306 100644 --- a/src/video/switch/SDL_switchvideo.c +++ b/src/video/switch/SDL_switchvideo.c @@ -32,6 +32,8 @@ #include "SDL_switchvideo.h" #include "SDL_switchopengles.h" #include "SDL_switchtouch.h" +#include "SDL_switchkeyboard.h" +#include "SDL_switchmouse_c.h" static int SWITCH_Available(void) @@ -157,6 +159,10 @@ SWITCH_VideoInit(_THIS) // init touch SWITCH_InitTouch(); + //init keyboard + SWITCH_InitKeyboard(); + //init mouse + SWITCH_InitMouse(); return 0; } @@ -172,6 +178,10 @@ SWITCH_VideoQuit(_THIS) // exit touch SWITCH_QuitTouch(); + //exit keyboard + SWITCH_QuitKeyboard(); + //exit mouse + SWITCH_QuitMouse(); } void @@ -361,6 +371,8 @@ SWITCH_PumpEvents(_THIS) hidScanInput(); SWITCH_PollTouch(); + SWITCH_PollKeyboard(); + SWITCH_PollMouse(); } #endif /* SDL_VIDEO_DRIVER_SWITCH */