diff options
Diffstat (limited to 'source/3rd-party/SDL2/src/video/psp/SDL_pspevents.c')
-rw-r--r-- | source/3rd-party/SDL2/src/video/psp/SDL_pspevents.c | 290 |
1 files changed, 290 insertions, 0 deletions
diff --git a/source/3rd-party/SDL2/src/video/psp/SDL_pspevents.c b/source/3rd-party/SDL2/src/video/psp/SDL_pspevents.c new file mode 100644 index 0000000..14277b3 --- /dev/null +++ b/source/3rd-party/SDL2/src/video/psp/SDL_pspevents.c @@ -0,0 +1,290 @@ +/* + 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_PSP + +/* Being a null driver, there's no event stream. We just define stubs for + most of the API. */ + +#include "SDL.h" +#include "../../events/SDL_sysevents.h" +#include "../../events/SDL_events_c.h" +#include "../../events/SDL_keyboard_c.h" +#include "SDL_pspvideo.h" +#include "SDL_pspevents_c.h" +#include "SDL_keyboard.h" +#include "../../thread/SDL_systhread.h" +#include <psphprm.h> + +#ifdef PSPIRKEYB +#include <pspirkeyb.h> +#include <pspirkeyb_rawkeys.h> + +#define IRKBD_CONFIG_FILE NULL /* this will take ms0:/seplugins/pspirkeyb.ini */ + +static int irkbd_ready = 0; +static SDL_Keycode keymap[256]; +#endif + +static enum PspHprmKeys hprm = 0; +static SDL_sem *event_sem = NULL; +static SDL_Thread *thread = NULL; +static int running = 0; +static struct { + enum PspHprmKeys id; + SDL_Keycode sym; +} keymap_psp[] = { + { PSP_HPRM_PLAYPAUSE, SDLK_F10 }, + { PSP_HPRM_FORWARD, SDLK_F11 }, + { PSP_HPRM_BACK, SDLK_F12 }, + { PSP_HPRM_VOL_UP, SDLK_F13 }, + { PSP_HPRM_VOL_DOWN, SDLK_F14 }, + { PSP_HPRM_HOLD, SDLK_F15 } +}; + +int EventUpdate(void *data) +{ + while (running) { + SDL_SemWait(event_sem); + sceHprmPeekCurrentKey(&hprm); + SDL_SemPost(event_sem); + /* Delay 1/60th of a second */ + sceKernelDelayThread(1000000 / 60); + } + return 0; +} + +void PSP_PumpEvents(_THIS) +{ + int i; + enum PspHprmKeys keys; + enum PspHprmKeys changed; + static enum PspHprmKeys old_keys = 0; + SDL_Keysym sym; + + SDL_SemWait(event_sem); + keys = hprm; + SDL_SemPost(event_sem); + + /* HPRM Keyboard */ + changed = old_keys ^ keys; + old_keys = keys; + if(changed) { + for(i=0; i<sizeof(keymap_psp)/sizeof(keymap_psp[0]); i++) { + if(changed & keymap_psp[i].id) { + sym.scancode = keymap_psp[i].id; + sym.sym = keymap_psp[i].sym; + + /* out of date + SDL_PrivateKeyboard((keys & keymap_psp[i].id) ? + SDL_PRESSED : SDL_RELEASED, + &sym); + */ + SDL_SendKeyboardKey((keys & keymap_psp[i].id) ? + SDL_PRESSED : SDL_RELEASED, SDL_GetScancodeFromKey(keymap_psp[i].sym)); + } + } + } + +#ifdef PSPIRKEYB + if (irkbd_ready) { + unsigned char buffer[255]; + int i, length, count; + SIrKeybScanCodeData *scanData; + + if(pspIrKeybReadinput(buffer, &length) >= 0) { + if((length % sizeof(SIrKeybScanCodeData)) == 0){ + count = length / sizeof(SIrKeybScanCodeData); + for( i=0; i < count; i++ ) { + unsigned char raw, pressed; + scanData=(SIrKeybScanCodeData*) buffer+i; + raw = scanData->raw; + pressed = scanData->pressed; + sym.scancode = raw; + sym.sym = keymap[raw]; + /* not tested */ + /* SDL_PrivateKeyboard(pressed?SDL_PRESSED:SDL_RELEASED, &sym); */ + SDL_SendKeyboardKey((keys & keymap_psp[i].id) ? + SDL_PRESSED : SDL_RELEASED, SDL_GetScancodeFromKey(keymap[raw])); + + } + } + } + } +#endif + sceKernelDelayThread(0); + + return; +} + +void PSP_InitOSKeymap(_THIS) +{ +#ifdef PSPIRKEYB + int i; + for (i=0; i<SDL_TABLESIZE(keymap); ++i) + keymap[i] = SDLK_UNKNOWN; + + keymap[KEY_ESC] = SDLK_ESCAPE; + + keymap[KEY_F1] = SDLK_F1; + keymap[KEY_F2] = SDLK_F2; + keymap[KEY_F3] = SDLK_F3; + keymap[KEY_F4] = SDLK_F4; + keymap[KEY_F5] = SDLK_F5; + keymap[KEY_F6] = SDLK_F6; + keymap[KEY_F7] = SDLK_F7; + keymap[KEY_F8] = SDLK_F8; + keymap[KEY_F9] = SDLK_F9; + keymap[KEY_F10] = SDLK_F10; + keymap[KEY_F11] = SDLK_F11; + keymap[KEY_F12] = SDLK_F12; + keymap[KEY_F13] = SDLK_PRINT; + keymap[KEY_F14] = SDLK_PAUSE; + + keymap[KEY_GRAVE] = SDLK_BACKQUOTE; + keymap[KEY_1] = SDLK_1; + keymap[KEY_2] = SDLK_2; + keymap[KEY_3] = SDLK_3; + keymap[KEY_4] = SDLK_4; + keymap[KEY_5] = SDLK_5; + keymap[KEY_6] = SDLK_6; + keymap[KEY_7] = SDLK_7; + keymap[KEY_8] = SDLK_8; + keymap[KEY_9] = SDLK_9; + keymap[KEY_0] = SDLK_0; + keymap[KEY_MINUS] = SDLK_MINUS; + keymap[KEY_EQUAL] = SDLK_EQUALS; + keymap[KEY_BACKSPACE] = SDLK_BACKSPACE; + + keymap[KEY_TAB] = SDLK_TAB; + keymap[KEY_Q] = SDLK_q; + keymap[KEY_W] = SDLK_w; + keymap[KEY_E] = SDLK_e; + keymap[KEY_R] = SDLK_r; + keymap[KEY_T] = SDLK_t; + keymap[KEY_Y] = SDLK_y; + keymap[KEY_U] = SDLK_u; + keymap[KEY_I] = SDLK_i; + keymap[KEY_O] = SDLK_o; + keymap[KEY_P] = SDLK_p; + keymap[KEY_LEFTBRACE] = SDLK_LEFTBRACKET; + keymap[KEY_RIGHTBRACE] = SDLK_RIGHTBRACKET; + keymap[KEY_ENTER] = SDLK_RETURN; + + keymap[KEY_CAPSLOCK] = SDLK_CAPSLOCK; + keymap[KEY_A] = SDLK_a; + keymap[KEY_S] = SDLK_s; + keymap[KEY_D] = SDLK_d; + keymap[KEY_F] = SDLK_f; + keymap[KEY_G] = SDLK_g; + keymap[KEY_H] = SDLK_h; + keymap[KEY_J] = SDLK_j; + keymap[KEY_K] = SDLK_k; + keymap[KEY_L] = SDLK_l; + keymap[KEY_SEMICOLON] = SDLK_SEMICOLON; + keymap[KEY_APOSTROPHE] = SDLK_QUOTE; + keymap[KEY_BACKSLASH] = SDLK_BACKSLASH; + + keymap[KEY_Z] = SDLK_z; + keymap[KEY_X] = SDLK_x; + keymap[KEY_C] = SDLK_c; + keymap[KEY_V] = SDLK_v; + keymap[KEY_B] = SDLK_b; + keymap[KEY_N] = SDLK_n; + keymap[KEY_M] = SDLK_m; + keymap[KEY_COMMA] = SDLK_COMMA; + keymap[KEY_DOT] = SDLK_PERIOD; + keymap[KEY_SLASH] = SDLK_SLASH; + + keymap[KEY_SPACE] = SDLK_SPACE; + + keymap[KEY_UP] = SDLK_UP; + keymap[KEY_DOWN] = SDLK_DOWN; + keymap[KEY_LEFT] = SDLK_LEFT; + keymap[KEY_RIGHT] = SDLK_RIGHT; + + keymap[KEY_HOME] = SDLK_HOME; + keymap[KEY_END] = SDLK_END; + keymap[KEY_INSERT] = SDLK_INSERT; + keymap[KEY_DELETE] = SDLK_DELETE; + + keymap[KEY_NUMLOCK] = SDLK_NUMLOCK; + keymap[KEY_LEFTMETA] = SDLK_LSUPER; + + keymap[KEY_KPSLASH] = SDLK_KP_DIVIDE; + keymap[KEY_KPASTERISK] = SDLK_KP_MULTIPLY; + keymap[KEY_KPMINUS] = SDLK_KP_MINUS; + keymap[KEY_KPPLUS] = SDLK_KP_PLUS; + keymap[KEY_KPDOT] = SDLK_KP_PERIOD; + keymap[KEY_KPEQUAL] = SDLK_KP_EQUALS; + + keymap[KEY_LEFTCTRL] = SDLK_LCTRL; + keymap[KEY_RIGHTCTRL] = SDLK_RCTRL; + keymap[KEY_LEFTALT] = SDLK_LALT; + keymap[KEY_RIGHTALT] = SDLK_RALT; + keymap[KEY_LEFTSHIFT] = SDLK_LSHIFT; + keymap[KEY_RIGHTSHIFT] = SDLK_RSHIFT; +#endif +} + +void PSP_EventInit(_THIS) +{ +#ifdef PSPIRKEYB + int outputmode = PSP_IRKBD_OUTPUT_MODE_SCANCODE; + int ret = pspIrKeybInit(IRKBD_CONFIG_FILE, 0); + if (ret == PSP_IRKBD_RESULT_OK) { + pspIrKeybOutputMode(outputmode); + irkbd_ready = 1; + } else { + irkbd_ready = 0; + } +#endif + /* Start thread to read data */ + if((event_sem = SDL_CreateSemaphore(1)) == NULL) { + SDL_SetError("Can't create input semaphore"); + return; + } + running = 1; + if((thread = SDL_CreateThreadInternal(EventUpdate, "PSPInputThread", 4096, NULL)) == NULL) { + SDL_SetError("Can't create input thread"); + return; + } +} + +void PSP_EventQuit(_THIS) +{ + running = 0; + SDL_WaitThread(thread, NULL); + SDL_DestroySemaphore(event_sem); +#ifdef PSPIRKEYB + if (irkbd_ready) { + pspIrKeybFinish(); + irkbd_ready = 0; + } +#endif +} + +/* end of SDL_pspevents.c ... */ + +#endif /* SDL_VIDEO_DRIVER_PSP */ + +/* vi: set ts=4 sw=4 expandtab: */ |