testdropfile: convert to use callbacks

This commit is contained in:
Anonymous Maarten 2024-05-25 04:44:07 +02:00
parent 89a4d9ae67
commit 78e25d4994

View File

@ -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);
}
}