summaryrefslogtreecommitdiff
path: root/contrib/SDL-3.2.8/src/video/psp/SDL_pspevents.c
diff options
context:
space:
mode:
author3gg <3gg@shellblade.net>2025-12-27 12:03:39 -0800
committer3gg <3gg@shellblade.net>2025-12-27 12:03:39 -0800
commit5a079a2d114f96d4847d1ee305d5b7c16eeec50e (patch)
tree8926ab44f168acf787d8e19608857b3af0f82758 /contrib/SDL-3.2.8/src/video/psp/SDL_pspevents.c
Initial commit
Diffstat (limited to 'contrib/SDL-3.2.8/src/video/psp/SDL_pspevents.c')
-rw-r--r--contrib/SDL-3.2.8/src/video/psp/SDL_pspevents.c274
1 files changed, 274 insertions, 0 deletions
diff --git a/contrib/SDL-3.2.8/src/video/psp/SDL_pspevents.c b/contrib/SDL-3.2.8/src/video/psp/SDL_pspevents.c
new file mode 100644
index 0000000..631f0aa
--- /dev/null
+++ b/contrib/SDL-3.2.8/src/video/psp/SDL_pspevents.c
@@ -0,0 +1,274 @@
1/*
2 Simple DirectMedia Layer
3 Copyright (C) 1997-2025 Sam Lantinga <slouken@libsdl.org>
4
5 This software is provided 'as-is', without any express or implied
6 warranty. In no event will the authors be held liable for any damages
7 arising from the use of this software.
8
9 Permission is granted to anyone to use this software for any purpose,
10 including commercial applications, and to alter it and redistribute it
11 freely, subject to the following restrictions:
12
13 1. The origin of this software must not be misrepresented; you must not
14 claim that you wrote the original software. If you use this software
15 in a product, an acknowledgment in the product documentation would be
16 appreciated but is not required.
17 2. Altered source versions must be plainly marked as such, and must not be
18 misrepresented as being the original software.
19 3. This notice may not be removed or altered from any source distribution.
20*/
21#include "SDL_internal.h"
22
23#ifdef SDL_VIDEO_DRIVER_PSP
24
25/* Being a null driver, there's no event stream. We just define stubs for
26 most of the API. */
27
28#include "../../events/SDL_events_c.h"
29#include "../../events/SDL_keyboard_c.h"
30#include "../SDL_sysvideo.h"
31#include "SDL_pspvideo.h"
32#include "SDL_pspevents_c.h"
33#include "../../thread/SDL_systhread.h"
34#include <psphprm.h>
35#include <pspthreadman.h>
36
37#ifdef PSPIRKEYB
38#include <pspirkeyb.h>
39#include <pspirkeyb_rawkeys.h>
40
41#define IRKBD_CONFIG_FILE NULL // this will take ms0:/seplugins/pspirkeyb.ini
42
43static int irkbd_ready = 0;
44static SDL_Scancode keymap[256];
45#endif
46
47static enum PspHprmKeys hprm = 0;
48static SDL_Semaphore *event_sem = NULL;
49static SDL_Thread *thread = NULL;
50static int running = 0;
51static struct
52{
53 enum PspHprmKeys id;
54 SDL_Scancode scancode;
55} keymap_psp[] = {
56 { PSP_HPRM_PLAYPAUSE, SDL_SCANCODE_F10 },
57 { PSP_HPRM_FORWARD, SDL_SCANCODE_F11 },
58 { PSP_HPRM_BACK, SDL_SCANCODE_F12 },
59 { PSP_HPRM_VOL_UP, SDL_SCANCODE_F13 },
60 { PSP_HPRM_VOL_DOWN, SDL_SCANCODE_F14 },
61 { PSP_HPRM_HOLD, SDL_SCANCODE_F15 }
62};
63
64int EventUpdate(void *data)
65{
66 while (running) {
67 SDL_WaitSemaphore(event_sem);
68 sceHprmPeekCurrentKey((u32 *)&hprm);
69 SDL_SignalSemaphore(event_sem);
70 // Delay 1/60th of a second
71 sceKernelDelayThread(1000000 / 60);
72 }
73 return 0;
74}
75
76void PSP_PumpEvents(SDL_VideoDevice *_this)
77{
78 int i;
79 enum PspHprmKeys keys;
80 enum PspHprmKeys changed;
81 static enum PspHprmKeys old_keys = 0;
82
83 SDL_WaitSemaphore(event_sem);
84 keys = hprm;
85 SDL_SignalSemaphore(event_sem);
86
87 // HPRM Keyboard
88 changed = old_keys ^ keys;
89 old_keys = keys;
90 if (changed) {
91 for (i = 0; i < sizeof(keymap_psp) / sizeof(keymap_psp[0]); i++) {
92 if (changed & keymap_psp[i].id) {
93 bool down = ((keys & keymap_psp[i].id) != 0);
94 SDL_SendKeyboardKey(0, SDL_GLOBAL_KEYBOARD_ID, keymap_psp[i].id, keymap_psp[i].scancode, down);
95 }
96 }
97 }
98
99#ifdef PSPIRKEYB
100 if (irkbd_ready) {
101 unsigned char buffer[255];
102 int i, length, count;
103 SIrKeybScanCodeData *scanData;
104
105 if (pspIrKeybReadinput(buffer, &length) >= 0) {
106 if ((length % sizeof(SIrKeybScanCodeData)) == 0) {
107 count = length / sizeof(SIrKeybScanCodeData);
108 for (i = 0; i < count; i++) {
109 unsigned char raw;
110 bool down;
111 scanData = (SIrKeybScanCodeData *)buffer + i;
112 raw = scanData->raw;
113 down = (scanData->pressed != 0);
114 SDL_SendKeyboardKey(0, SDL_GLOBAL_KEYBOARD_ID, raw, keymap[raw], down);
115 }
116 }
117 }
118 }
119#endif
120 sceKernelDelayThread(0);
121
122 return;
123}
124
125void PSP_InitOSKeymap(SDL_VideoDevice *_this)
126{
127#ifdef PSPIRKEYB
128 int i;
129 for (i = 0; i < SDL_arraysize(keymap); ++i) {
130 keymap[i] = SDL_SCANCODE_UNKNOWN;
131 }
132
133 keymap[KEY_ESC] = SDL_SCANCODE_ESCAPE;
134
135 keymap[KEY_F1] = SDL_SCANCODE_F1;
136 keymap[KEY_F2] = SDL_SCANCODE_F2;
137 keymap[KEY_F3] = SDL_SCANCODE_F3;
138 keymap[KEY_F4] = SDL_SCANCODE_F4;
139 keymap[KEY_F5] = SDL_SCANCODE_F5;
140 keymap[KEY_F6] = SDL_SCANCODE_F6;
141 keymap[KEY_F7] = SDL_SCANCODE_F7;
142 keymap[KEY_F8] = SDL_SCANCODE_F8;
143 keymap[KEY_F9] = SDL_SCANCODE_F9;
144 keymap[KEY_F10] = SDL_SCANCODE_F10;
145 keymap[KEY_F11] = SDL_SCANCODE_F11;
146 keymap[KEY_F12] = SDL_SCANCODE_F12;
147 keymap[KEY_F13] = SDL_SCANCODE_PRINT;
148 keymap[KEY_F14] = SDL_SCANCODE_PAUSE;
149
150 keymap[KEY_GRAVE] = SDL_SCANCODE_GRAVE;
151 keymap[KEY_1] = SDL_SCANCODE_1;
152 keymap[KEY_2] = SDL_SCANCODE_2;
153 keymap[KEY_3] = SDL_SCANCODE_3;
154 keymap[KEY_4] = SDL_SCANCODE_4;
155 keymap[KEY_5] = SDL_SCANCODE_5;
156 keymap[KEY_6] = SDL_SCANCODE_6;
157 keymap[KEY_7] = SDL_SCANCODE_7;
158 keymap[KEY_8] = SDL_SCANCODE_8;
159 keymap[KEY_9] = SDL_SCANCODE_9;
160 keymap[KEY_0] = SDL_SCANCODE_0;
161 keymap[KEY_MINUS] = SDL_SCANCODE_MINUS;
162 keymap[KEY_EQUAL] = SDL_SCANCODE_EQUALS;
163 keymap[KEY_BACKSPACE] = SDL_SCANCODE_BACKSPACE;
164
165 keymap[KEY_TAB] = SDL_SCANCODE_TAB;
166 keymap[KEY_Q] = SDL_SCANCODE_q;
167 keymap[KEY_W] = SDL_SCANCODE_w;
168 keymap[KEY_E] = SDL_SCANCODE_e;
169 keymap[KEY_R] = SDL_SCANCODE_r;
170 keymap[KEY_T] = SDL_SCANCODE_t;
171 keymap[KEY_Y] = SDL_SCANCODE_y;
172 keymap[KEY_U] = SDL_SCANCODE_u;
173 keymap[KEY_I] = SDL_SCANCODE_i;
174 keymap[KEY_O] = SDL_SCANCODE_o;
175 keymap[KEY_P] = SDL_SCANCODE_p;
176 keymap[KEY_LEFTBRACE] = SDL_SCANCODE_LEFTBRACKET;
177 keymap[KEY_RIGHTBRACE] = SDL_SCANCODE_RIGHTBRACKET;
178 keymap[KEY_ENTER] = SDL_SCANCODE_RETURN;
179
180 keymap[KEY_CAPSLOCK] = SDL_SCANCODE_CAPSLOCK;
181 keymap[KEY_A] = SDL_SCANCODE_a;
182 keymap[KEY_S] = SDL_SCANCODE_s;
183 keymap[KEY_D] = SDL_SCANCODE_d;
184 keymap[KEY_F] = SDL_SCANCODE_f;
185 keymap[KEY_G] = SDL_SCANCODE_g;
186 keymap[KEY_H] = SDL_SCANCODE_h;
187 keymap[KEY_J] = SDL_SCANCODE_j;
188 keymap[KEY_K] = SDL_SCANCODE_k;
189 keymap[KEY_L] = SDL_SCANCODE_l;
190 keymap[KEY_SEMICOLON] = SDL_SCANCODE_SEMICOLON;
191 keymap[KEY_APOSTROPHE] = SDL_SCANCODE_APOSTROPHE;
192 keymap[KEY_BACKSLASH] = SDL_SCANCODE_BACKSLASH;
193
194 keymap[KEY_Z] = SDL_SCANCODE_z;
195 keymap[KEY_X] = SDL_SCANCODE_x;
196 keymap[KEY_C] = SDL_SCANCODE_c;
197 keymap[KEY_V] = SDL_SCANCODE_v;
198 keymap[KEY_B] = SDL_SCANCODE_b;
199 keymap[KEY_N] = SDL_SCANCODE_n;
200 keymap[KEY_M] = SDL_SCANCODE_m;
201 keymap[KEY_COMMA] = SDL_SCANCODE_COMMA;
202 keymap[KEY_DOT] = SDL_SCANCODE_PERIOD;
203 keymap[KEY_SLASH] = SDL_SCANCODE_SLASH;
204
205 keymap[KEY_SPACE] = SDL_SCANCODE_SPACE;
206
207 keymap[KEY_UP] = SDL_SCANCODE_UP;
208 keymap[KEY_DOWN] = SDL_SCANCODE_DOWN;
209 keymap[KEY_LEFT] = SDL_SCANCODE_LEFT;
210 keymap[KEY_RIGHT] = SDL_SCANCODE_RIGHT;
211
212 keymap[KEY_HOME] = SDL_SCANCODE_HOME;
213 keymap[KEY_END] = SDL_SCANCODE_END;
214 keymap[KEY_INSERT] = SDL_SCANCODE_INSERT;
215 keymap[KEY_DELETE] = SDL_SCANCODE_DELETE;
216
217 keymap[KEY_NUMLOCK] = SDL_SCANCODE_NUMLOCK;
218 keymap[KEY_LEFTMETA] = SDL_SCANCODE_LSUPER;
219
220 keymap[KEY_KPSLASH] = SDL_SCANCODE_KP_DIVIDE;
221 keymap[KEY_KPASTERISK] = SDL_SCANCODE_KP_MULTIPLY;
222 keymap[KEY_KPMINUS] = SDL_SCANCODE_KP_MINUS;
223 keymap[KEY_KPPLUS] = SDL_SCANCODE_KP_PLUS;
224 keymap[KEY_KPDOT] = SDL_SCANCODE_KP_PERIOD;
225 keymap[KEY_KPEQUAL] = SDL_SCANCODE_KP_EQUALS;
226
227 keymap[KEY_LEFTCTRL] = SDL_SCANCODE_LCTRL;
228 keymap[KEY_RIGHTCTRL] = SDL_SCANCODE_RCTRL;
229 keymap[KEY_LEFTALT] = SDL_SCANCODE_LALT;
230 keymap[KEY_RIGHTALT] = SDL_SCANCODE_RALT;
231 keymap[KEY_LEFTSHIFT] = SDL_SCANCODE_LSHIFT;
232 keymap[KEY_RIGHTSHIFT] = SDL_SCANCODE_RSHIFT;
233#endif
234}
235
236bool PSP_EventInit(SDL_VideoDevice *_this)
237{
238#ifdef PSPIRKEYB
239 int outputmode = PSP_IRKBD_OUTPUT_MODE_SCANCODE;
240 int ret = pspIrKeybInit(IRKBD_CONFIG_FILE, 0);
241 if (ret == PSP_IRKBD_RESULT_OK) {
242 pspIrKeybOutputMode(outputmode);
243 irkbd_ready = 1;
244 } else {
245 irkbd_ready = 0;
246 }
247#endif
248 // Start thread to read data
249 if ((event_sem = SDL_CreateSemaphore(1)) == NULL) {
250 return SDL_SetError("Can't create input semaphore");
251 }
252 running = 1;
253 if ((thread = SDL_CreateThreadWithStackSize(EventUpdate, "PSPInputThread", 4096, NULL)) == NULL) {
254 return SDL_SetError("Can't create input thread");
255 }
256 return true;
257}
258
259void PSP_EventQuit(SDL_VideoDevice *_this)
260{
261 running = 0;
262 SDL_WaitThread(thread, NULL);
263 SDL_DestroySemaphore(event_sem);
264#ifdef PSPIRKEYB
265 if (irkbd_ready) {
266 pspIrKeybFinish();
267 irkbd_ready = 0;
268 }
269#endif
270}
271
272// end of SDL_pspevents.c ...
273
274#endif // SDL_VIDEO_DRIVER_PSP