mirror of https://github.com/encounter/SDL.git
Switch: Add support for physical keyboard and mouse (#33)
This commit is contained in:
parent
e2adbf54e6
commit
c30ec89b7a
|
@ -0,0 +1,270 @@
|
|||
/*
|
||||
Simple DirectMedia Layer
|
||||
Copyright (C) 1997-2018 Sam Lantinga <slouken@libsdl.org>
|
||||
|
||||
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 <switch.h>
|
||||
|
||||
#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: */
|
|
@ -0,0 +1,34 @@
|
|||
/*
|
||||
Simple DirectMedia Layer
|
||||
Copyright (C) 1997-2018 Sam Lantinga <slouken@libsdl.org>
|
||||
|
||||
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: */
|
|
@ -0,0 +1,105 @@
|
|||
/*
|
||||
Simple DirectMedia Layer
|
||||
Copyright (C) 1997-2018 Sam Lantinga <slouken@libsdl.org>
|
||||
|
||||
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 <switch.h>
|
||||
|
||||
#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: */
|
|
@ -0,0 +1,34 @@
|
|||
/*
|
||||
Simple DirectMedia Layer
|
||||
Copyright (C) 1997-2018 Sam Lantinga <slouken@libsdl.org>
|
||||
|
||||
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: */
|
|
@ -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 */
|
||||
|
|
Loading…
Reference in New Issue