SDL

Форк
0
/
testdropfile.c 
125 строк · 4.1 Кб
1
/*
2
  Copyright (C) 1997-2024 Sam Lantinga <slouken@libsdl.org>
3

4
  This software is provided 'as-is', without any express or implied
5
  warranty.  In no event will the authors be held liable for any damages
6
  arising from the use of this software.
7

8
  Permission is granted to anyone to use this software for any purpose,
9
  including commercial applications, and to alter it and redistribute it
10
  freely.
11
*/
12

13
#define SDL_MAIN_USE_CALLBACKS 1
14
#include <SDL3/SDL_test_common.h>
15
#include <SDL3/SDL_main.h>
16

17
typedef struct {
18
    SDLTest_CommonState *state;
19
    SDL_bool is_hover;
20
    float x;
21
    float y;
22
    unsigned int windowID;
23
} dropfile_dialog;
24

25
SDL_AppResult SDL_AppInit(void **appstate, int argc, char *argv[])
26
{
27
    int i;
28
    dropfile_dialog *dialog;
29
    SDLTest_CommonState *state;
30

31
    /* Initialize test framework */
32
    state = SDLTest_CommonCreateState(argv, SDL_INIT_VIDEO);
33
    if (!state) {
34
        return SDL_APP_FAILURE;
35
    }
36

37
    /* Enable standard application logging */
38
    SDL_SetLogPriority(SDL_LOG_CATEGORY_APPLICATION, SDL_LOG_PRIORITY_INFO);
39

40
    for (i = 1; i < argc;) {
41
        int consumed;
42

43
        consumed = SDLTest_CommonArg(state, i);
44
        /* needed voodoo to allow app to launch via macOS Finder */
45
        if (SDL_strncmp(argv[i], "-psn", 4) == 0) {
46
            consumed = 1;
47
        }
48
        if (consumed == 0) {
49
            consumed = -1;
50
        }
51
        if (consumed < 0) {
52
            SDLTest_CommonLogUsage(state, argv[0], NULL);
53
            goto onerror;
54
        }
55
        i += consumed;
56
    }
57
    if (!SDLTest_CommonInit(state)) {
58
        goto onerror;
59
    }
60
    dialog = SDL_calloc(sizeof(dropfile_dialog), 1);
61
    if (!dialog) {
62
        goto onerror;
63
    }
64
    *appstate = dialog;
65

66
    dialog->state = state;
67
    return SDL_APP_CONTINUE;
68
onerror:
69
    SDLTest_CommonQuit(state);
70
    return SDL_APP_FAILURE;
71
}
72

73
SDL_AppResult SDL_AppEvent(void *appstate, const SDL_Event *event)
74
{
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);
90
    }
91

92
    return SDLTest_CommonEventMainCallbacks(dialog->state, event);
93
}
94

95
SDL_AppResult SDL_AppIterate(void *appstate)
96
{
97
    dropfile_dialog *dialog = appstate;
98
    int i;
99

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))) {
106
                int len = 2000;
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);
110
            }
111
        }
112
        SDL_RenderPresent(renderer);
113
    }
114
    return SDL_APP_CONTINUE;
115
}
116

117
void SDL_AppQuit(void *appstate)
118
{
119
    dropfile_dialog *dialog = appstate;
120
    if (dialog) {
121
        SDLTest_CommonState *state = dialog->state;
122
        SDL_free(dialog);
123
        SDLTest_CommonQuit(state);
124
    }
125
}
126

Использование cookies

Мы используем файлы cookie в соответствии с Политикой конфиденциальности и Политикой использования cookies.

Нажимая кнопку «Принимаю», Вы даете АО «СберТех» согласие на обработку Ваших персональных данных в целях совершенствования нашего веб-сайта и Сервиса GitVerse, а также повышения удобства их использования.

Запретить использование cookies Вы можете самостоятельно в настройках Вашего браузера.