From 78e25d4994c4baa5213729506af3c718cc00d60a Mon Sep 17 00:00:00 2001
From: Anonymous Maarten <[EMAIL REDACTED]>
Date: Sat, 25 May 2024 04:44:07 +0200
Subject: [PATCH] testdropfile: convert to use callbacks
---
test/testdropfile.c | 133 +++++++++++++++++++++++++-------------------
1 file changed, 76 insertions(+), 57 deletions(-)
diff --git a/test/testdropfile.c b/test/testdropfile.c
index 6b5ce539c690f..c0880b7360ac1 100644
--- a/test/testdropfile.c
+++ b/test/testdropfile.c
@@ -10,24 +10,71 @@
freely.
*/
+#define SDL_MAIN_USE_CALLBACKS 1
#include <SDL3/SDL_test_common.h>
#include <SDL3/SDL_main.h>
-static SDLTest_CommonState *state;
+typedef struct {
+ SDLTest_CommonState *state;
+ SDL_bool is_hover;
+ float x;
+ float y;
+ unsigned int windowID;
+} dropfile_dialog;
-int main(int argc, char *argv[])
+int SDL_AppEvent(void *appstate, const SDL_Event *event)
{
- int i, done;
- SDL_Event event;
- SDL_bool is_hover = SDL_FALSE;
- float x = 0.0f, y = 0.0f;
- unsigned int windowID = 0;
- int return_code = -1;
+ dropfile_dialog *dialog = appstate;
+ if (event->type == SDL_EVENT_DROP_BEGIN) {
+ SDL_Log("Drop beginning on window %u at (%f, %f)", (unsigned int)event->drop.windowID, event->drop.x, event->drop.y);
+ } else if (event->type == SDL_EVENT_DROP_COMPLETE) {
+ dialog->is_hover = SDL_FALSE;
+ SDL_Log("Drop complete on window %u at (%f, %f)", (unsigned int)event->drop.windowID, event->drop.x, event->drop.y);
+ } else if ((event->type == SDL_EVENT_DROP_FILE) || (event->type == SDL_EVENT_DROP_TEXT)) {
+ const char *typestr = (event->type == SDL_EVENT_DROP_FILE) ? "File" : "Text";
+ SDL_Log("%s dropped on window %u: %s at (%f, %f)", typestr, (unsigned int)event->drop.windowID, event->drop.data, event->drop.x, event->drop.y);
+ } else if (event->type == SDL_EVENT_DROP_POSITION) {
+ dialog->is_hover = SDL_TRUE;
+ dialog->x = event->drop.x;
+ dialog->y = event->drop.y;
+ dialog->windowID = event->drop.windowID;
+ SDL_Log("Drop position on window %u at (%f, %f) data = %s", (unsigned int)event->drop.windowID, event->drop.x, event->drop.y, event->drop.data);
+ }
+
+ return SDLTest_CommonEventMainCallbacks(dialog->state, event);
+}
+
+int SDL_AppIterate(void *appstate)
+{
+ dropfile_dialog *dialog = appstate;
+ int i;
+
+ for (i = 0; i < dialog->state->num_windows; ++i) {
+ SDL_Renderer *renderer = dialog->state->renderers[i];
+ SDL_SetRenderDrawColor(renderer, 0xA0, 0xA0, 0xA0, 0xFF);
+ SDL_RenderClear(renderer);
+ if (dialog->is_hover) {
+ if (dialog->windowID == SDL_GetWindowID(SDL_GetRenderWindow(renderer))) {
+ int len = 2000;
+ SDL_SetRenderDrawColor(renderer, 0x0A, 0x0A, 0x0A, 0xFF);
+ SDL_RenderLine(renderer, dialog->x, dialog->y - len, dialog->x, dialog->y + len);
+ SDL_RenderLine(renderer, dialog->x - len, dialog->y, dialog->x + len, dialog->y);
+ }
+ }
+ SDL_RenderPresent(renderer);
+ }
+ return 0; /* keep going */
+}
+
+int SDL_AppInit(void **appstate, int argc, char *argv[]) {
+ int i;
+ dropfile_dialog *dialog;
+ SDLTest_CommonState *state;
/* Initialize test framework */
state = SDLTest_CommonCreateState(argv, SDL_INIT_VIDEO);
if (!state) {
- return 1;
+ return -1; /* terminate with an error */
}
/* Enable standard application logging */
@@ -46,60 +93,32 @@ int main(int argc, char *argv[])
}
if (consumed < 0) {
SDLTest_CommonLogUsage(state, argv[0], NULL);
- return_code = 1;
- goto quit;
+ goto onerror;
}
i += consumed;
}
if (!SDLTest_CommonInit(state)) {
- return_code = 1;
- goto quit;
+ goto onerror;
}
-
- /* Main render loop */
- done = 0;
- while (!done) {
- /* Check for events */
- while (SDL_PollEvent(&event)) {
- if (event.type == SDL_EVENT_DROP_BEGIN) {
- SDL_Log("Drop beginning on window %u at (%f, %f)", (unsigned int)event.drop.windowID, event.drop.x, event.drop.y);
- } else if (event.type == SDL_EVENT_DROP_COMPLETE) {
- is_hover = SDL_FALSE;
- SDL_Log("Drop complete on window %u at (%f, %f)", (unsigned int)event.drop.windowID, event.drop.x, event.drop.y);
- } else if ((event.type == SDL_EVENT_DROP_FILE) || (event.type == SDL_EVENT_DROP_TEXT)) {
- const char *typestr = (event.type == SDL_EVENT_DROP_FILE) ? "File" : "Text";
- SDL_Log("%s dropped on window %u: %s at (%f, %f)", typestr, (unsigned int)event.drop.windowID, event.drop.data, event.drop.x, event.drop.y);
- } else if (event.type == SDL_EVENT_DROP_POSITION) {
- is_hover = SDL_TRUE;
- x = event.drop.x;
- y = event.drop.y;
- windowID = event.drop.windowID;
- SDL_Log("Drop position on window %u at (%f, %f) data = %s", (unsigned int)event.drop.windowID, event.drop.x, event.drop.y, event.drop.data);
- }
-
- SDLTest_CommonEvent(state, &event, &done);
- }
-
- for (i = 0; i < state->num_windows; ++i) {
- SDL_Renderer *renderer = state->renderers[i];
- SDL_SetRenderDrawColor(renderer, 0xA0, 0xA0, 0xA0, 0xFF);
- SDL_RenderClear(renderer);
- if (is_hover) {
- if (windowID == SDL_GetWindowID(SDL_GetRenderWindow(renderer))) {
- int len = 2000;
- SDL_SetRenderDrawColor(renderer, 0x0A, 0x0A, 0x0A, 0xFF);
- SDL_RenderLine(renderer, x, y - len, x, y + len);
- SDL_RenderLine(renderer, x - len, y, x + len, y);
- }
- }
- SDL_RenderPresent(renderer);
- }
-
- SDL_Delay(16);
+ dialog = SDL_calloc(sizeof(dropfile_dialog), 1);
+ if (!dialog) {
+ goto onerror;
}
+ *appstate = dialog;
- return_code = 0;
-quit:
+ dialog->state = state;
+ return 0; /* continue */
+onerror:
SDLTest_CommonQuit(state);
- return return_code;
+ return -1; /* terminate with an error */
+}
+
+void SDL_AppQuit(void *appstate)
+{
+ dropfile_dialog *dialog = appstate;
+ if (dialog) {
+ SDLTest_CommonState *state = dialog->state;
+ SDL_free(dialog);
+ SDLTest_CommonQuit(state);
+ }
}