Ver Fonte

testdropfile: convert to use callbacks

Anonymous Maarten há 10 meses atrás
pai
commit
78e25d4994
1 ficheiros alterados com 76 adições e 57 exclusões
  1. 76 57
      test/testdropfile.c

+ 76 - 57
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);
+    }
 }