aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorkdx <kikoodx@paranoici.org>2023-07-10 13:09:45 +0200
committerkdx <kikoodx@paranoici.org>2023-07-10 13:09:45 +0200
commite8a9f0e2bbc766d4767a516b98167c97ff410948 (patch)
treeb0c98ba1204e41a395feb80947601ef87f0399cb
parent993420e792c273a80eb2c9df81f6f1c075597543 (diff)
downloadtzr-e8a9f0e2bbc766d4767a516b98167c97ff410948.tar.gz
connect and disconnect joysticks
-rw-r--r--sources/TZR_PollEvent.c34
1 files changed, 34 insertions, 0 deletions
diff --git a/sources/TZR_PollEvent.c b/sources/TZR_PollEvent.c
index d89f7d8..571149e 100644
--- a/sources/TZR_PollEvent.c
+++ b/sources/TZR_PollEvent.c
@@ -2,6 +2,7 @@
#include "TZR_globals.h"
#include "sdl_error.h"
#include <SDL2/SDL_events.h>
+#include "reserve.h"
int
TZR_PollEvent(TZR_Event *e)
@@ -43,14 +44,47 @@ TZR_PollEvent(TZR_Event *e)
___tzr_mouse_y = se.motion.y;
break;
case SDL_JOYDEVICEADDED: {
+ size_t i;
+ for (i = 0; i < ___tzr_joysticks_size; i++) {
+ if (___tzr_joysticks[i] == NULL)
+ break;
+ }
+ if (i == ___tzr_joysticks_size) {
+ void *vec = ___tzr_joysticks;
+ if (reserve(&vec,
+ ___tzr_joysticks_size + 1,
+ &___tzr_joysticks_capacity,
+ sizeof(SDL_Joystick *)))
+ {
+ fprintf(stderr, "failed to reserve"
+ "for new joystick\n");
+ break;
+ }
+ ___tzr_joysticks = vec;
+ ___tzr_joysticks_size += 1;
+ i = ___tzr_joysticks_size - 1;
+ }
+
SDL_Joystick *const jstick = SDL_JoystickOpen(se.jdevice.which);
if (jstick == NULL) {
sdl_error(0);
break;
}
+ ___tzr_joysticks[i] = jstick;
+ fprintf(stderr, "opened joystick\n");
break;
}
case SDL_JOYDEVICEREMOVED:
+ for (size_t i = 0; i < ___tzr_joysticks_size; i++) {
+ if (se.jdevice.which ==
+ SDL_JoystickInstanceID(___tzr_joysticks[i]))
+ {
+ SDL_JoystickClose(___tzr_joysticks[i]);
+ ___tzr_joysticks[i] = NULL;
+ break;
+ }
+ }
+ fprintf(stderr, "didn't remove no joystick\n");
break;
case SDL_JOYAXISMOTION:
break;