13
#define SDL_MAIN_USE_CALLBACKS 1
14
#include <SDL3/SDL_test_common.h>
15
#include <SDL3/SDL_main.h>
18
SDLTest_CommonState *state;
22
unsigned int windowID;
25
SDL_AppResult SDL_AppInit(void **appstate, int argc, char *argv[])
28
dropfile_dialog *dialog;
29
SDLTest_CommonState *state;
32
state = SDLTest_CommonCreateState(argv, SDL_INIT_VIDEO);
34
return SDL_APP_FAILURE;
38
SDL_SetLogPriority(SDL_LOG_CATEGORY_APPLICATION, SDL_LOG_PRIORITY_INFO);
40
for (i = 1; i < argc;) {
43
consumed = SDLTest_CommonArg(state, i);
45
if (SDL_strncmp(argv[i], "-psn", 4) == 0) {
52
SDLTest_CommonLogUsage(state, argv[0], NULL);
57
if (!SDLTest_CommonInit(state)) {
60
dialog = SDL_calloc(sizeof(dropfile_dialog), 1);
66
dialog->state = state;
67
return SDL_APP_CONTINUE;
69
SDLTest_CommonQuit(state);
70
return SDL_APP_FAILURE;
73
SDL_AppResult SDL_AppEvent(void *appstate, const SDL_Event *event)
75
dropfile_dialog *dialog = appstate;
76
if (event->type == SDL_EVENT_DROP_BEGIN) {
77
SDL_Log("Drop beginning on window %u at (%f, %f)", (unsigned int)event->drop.windowID, event->drop.x, event->drop.y);
78
} else if (event->type == SDL_EVENT_DROP_COMPLETE) {
79
dialog->is_hover = SDL_FALSE;
80
SDL_Log("Drop complete on window %u at (%f, %f)", (unsigned int)event->drop.windowID, event->drop.x, event->drop.y);
81
} else if ((event->type == SDL_EVENT_DROP_FILE) || (event->type == SDL_EVENT_DROP_TEXT)) {
82
const char *typestr = (event->type == SDL_EVENT_DROP_FILE) ? "File" : "Text";
83
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);
84
} else if (event->type == SDL_EVENT_DROP_POSITION) {
85
dialog->is_hover = SDL_TRUE;
86
dialog->x = event->drop.x;
87
dialog->y = event->drop.y;
88
dialog->windowID = event->drop.windowID;
89
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);
92
return SDLTest_CommonEventMainCallbacks(dialog->state, event);
95
SDL_AppResult SDL_AppIterate(void *appstate)
97
dropfile_dialog *dialog = appstate;
100
for (i = 0; i < dialog->state->num_windows; ++i) {
101
SDL_Renderer *renderer = dialog->state->renderers[i];
102
SDL_SetRenderDrawColor(renderer, 0xA0, 0xA0, 0xA0, 0xFF);
103
SDL_RenderClear(renderer);
104
if (dialog->is_hover) {
105
if (dialog->windowID == SDL_GetWindowID(SDL_GetRenderWindow(renderer))) {
107
SDL_SetRenderDrawColor(renderer, 0x0A, 0x0A, 0x0A, 0xFF);
108
SDL_RenderLine(renderer, dialog->x, dialog->y - len, dialog->x, dialog->y + len);
109
SDL_RenderLine(renderer, dialog->x - len, dialog->y, dialog->x + len, dialog->y);
112
SDL_RenderPresent(renderer);
114
return SDL_APP_CONTINUE;
117
void SDL_AppQuit(void *appstate)
119
dropfile_dialog *dialog = appstate;
121
SDLTest_CommonState *state = dialog->state;
123
SDLTest_CommonQuit(state);