From 10526f2f4ecc8168f060bd8c4cf6cc3b111bd306 Mon Sep 17 00:00:00 2001 From: kdx Date: Thu, 11 Apr 2024 03:55:22 +0200 Subject: LatestInputEvent --- headers/TZR_events.h | 3 +++ headers/TZR_globals.h | 1 + headers/TZR_types.h | 7 ++++++- sources/TZR_CycleEvents.c | 15 ++++++++++++--- sources/TZR_LatestInputEvent.c | 15 +++++++++++++++ sources/TZR_PollEvent.c | 7 ++++--- sources/globals.c | 1 + 7 files changed, 42 insertions(+), 7 deletions(-) create mode 100644 sources/TZR_LatestInputEvent.c diff --git a/headers/TZR_events.h b/headers/TZR_events.h index 4b2b0c6..bba9bb0 100644 --- a/headers/TZR_events.h +++ b/headers/TZR_events.h @@ -6,3 +6,6 @@ int TZR_PollEvent(TZR_Event *e); /* Drain queued events with TZR_PollEvent and call TZR_ResourcesWatch. */ void TZR_CycleEvents(void); + +/* Returns 1 if event was set. Resets after each call to CycleEvents. */ +int TZR_LatestInputEvent(TZR_Event *); diff --git a/headers/TZR_globals.h b/headers/TZR_globals.h index 8266481..6dca3c8 100644 --- a/headers/TZR_globals.h +++ b/headers/TZR_globals.h @@ -35,6 +35,7 @@ extern int ___tzr_camera_y; extern SDL_GLContext ___tzr_gl_ctx; extern int ___tzr_scroll_x; extern int ___tzr_scroll_y; +extern TZR_Event ___tzr_latest_input; #ifdef TZR_SOLOUD extern Soloud ___tzr_soloud; diff --git a/headers/TZR_types.h b/headers/TZR_types.h index 012fa71..324d655 100644 --- a/headers/TZR_types.h +++ b/headers/TZR_types.h @@ -12,9 +12,14 @@ enum TZR_ResourceType { }; enum TZR_EventType { + TZR_EV_NONE, TZR_EV_QUIT, TZR_EV_KEYDOWN, - TZR_EV_KEYUP + TZR_EV_KEYUP, + TZR_EV_MOUSEDOWN, + TZR_EV_MOUSEUP, //unused + TZR_EV_GAMECONTROLLERDOWN, + TZR_EV_GAMECONTROLLERUP, //unused }; enum TZR_KeyState { diff --git a/sources/TZR_CycleEvents.c b/sources/TZR_CycleEvents.c index f9f9945..67c2956 100644 --- a/sources/TZR_CycleEvents.c +++ b/sources/TZR_CycleEvents.c @@ -2,7 +2,6 @@ #include "TZR_resource.h" #include "TZR_globals.h" #include -#include void next_state(TZR_KeyState *keystate) @@ -34,6 +33,7 @@ get_axis(SDL_GameController *gc, float *out, SDL_GameControllerAxis axis) void TZR_CycleEvents(void) { + ___tzr_latest_input.type = TZR_EV_NONE; TZR_ResourcesWatch(); for (int i = 0; i < SDL_NUM_SCANCODES; i++) next_state(&___tzr_keystates[i]); @@ -45,7 +45,13 @@ TZR_CycleEvents(void) ___tzr_scroll_y = 0; TZR_Event e; while (TZR_PollEvent(&e)) - ; + switch (e.type) { + case TZR_EV_KEYDOWN: + case TZR_EV_MOUSEDOWN: + ___tzr_latest_input = e; + default: + break; + } for (size_t i = 0; i < ___tzr_joysticks_size; i++) { TZR_Joystick *const jstick = &___tzr_joysticks[i]; @@ -53,8 +59,11 @@ TZR_CycleEvents(void) continue; for (int k = 0; k < SDL_CONTROLLER_BUTTON_MAX; k++) { if (SDL_GameControllerGetButton(jstick->ptr, k)) { - if (___tzr_joystates[k] != TZR_KEYSTATE_DOWN) + if (___tzr_joystates[k] != TZR_KEYSTATE_DOWN) { ___tzr_joystates[k] = TZR_KEYSTATE_PRESS; + ___tzr_latest_input.type = TZR_EV_GAMECONTROLLERDOWN; + ___tzr_latest_input.button = k; + } } else { if (___tzr_joystates[k] != TZR_KEYSTATE_UP) ___tzr_joystates[k] = TZR_KEYSTATE_RELEASE; diff --git a/sources/TZR_LatestInputEvent.c b/sources/TZR_LatestInputEvent.c new file mode 100644 index 0000000..550e2c3 --- /dev/null +++ b/sources/TZR_LatestInputEvent.c @@ -0,0 +1,15 @@ +#include "TZR_events.h" +#include "TZR_globals.h" + +int +TZR_LatestInputEvent(TZR_Event *e) +{ + if (e == NULL) { + TZR_Log("e is NULL"); + return 0; + } + if (___tzr_latest_input.type == TZR_EV_NONE) + return 0; + *e = ___tzr_latest_input; + return 1; +} diff --git a/sources/TZR_PollEvent.c b/sources/TZR_PollEvent.c index 9560600..15e287b 100644 --- a/sources/TZR_PollEvent.c +++ b/sources/TZR_PollEvent.c @@ -2,7 +2,6 @@ #include "TZR_globals.h" #include "sdl_error.h" #include "reserve.h" -#include "getbind.h" #include #include @@ -32,10 +31,12 @@ TZR_PollEvent(TZR_Event *e) ___tzr_keystates[e->button] = TZR_KEYSTATE_RELEASE; return 1; case SDL_MOUSEBUTTONDOWN: + e->type = TZR_EV_MOUSEDOWN; + e->button = se.button.button; ___tzr_mouse_x = se.button.x; ___tzr_mouse_y = se.button.y; - ___tzr_mousestates[se.button.button] = TZR_KEYSTATE_PRESS; - break; + ___tzr_mousestates[e->button] = TZR_KEYSTATE_PRESS; + return 1; case SDL_MOUSEBUTTONUP: ___tzr_mouse_x = se.button.x; ___tzr_mouse_y = se.button.y; diff --git a/sources/globals.c b/sources/globals.c index 4d9597d..0f835e1 100644 --- a/sources/globals.c +++ b/sources/globals.c @@ -35,6 +35,7 @@ int ___tzr_camera_y = 0; SDL_GLContext ___tzr_gl_ctx = NULL; int ___tzr_scroll_x = 0; int ___tzr_scroll_y = 0; +TZR_Event ___tzr_latest_input = {0}; #ifdef TZR_SOLOUD Soloud ___tzr_soloud = NULL; -- cgit v1.2.3