102 Patches: Detours to the Rescue
C reference for DttR maintainers and modders.
Loading...
Searching...
No Matches
sdl.c
Go to the documentation of this file.
1#include <dttr_sdl.h>
2
3#include <dttr_log.h>
4#include <dttr_path.h>
5#include <windows.h>
6
8 SDL_MessageBoxFlags flags,
9 const char *title,
10 const char *message,
11 SDL_Window *window
12);
13typedef bool (*show_message_box_fn)(
14 const SDL_MessageBoxData *messageboxdata,
15 int *buttonid
16);
18 SDL_DialogFileCallback callback,
19 void *userdata,
20 SDL_Window *window,
21 const char *default_location,
22 bool allow_many
23);
25 SDL_DialogFileCallback callback,
26 void *userdata,
27 SDL_Window *window,
28 const SDL_DialogFileFilter *filters,
29 int nfilters,
30 const char *default_location,
31 bool allow_many
32);
33typedef void (*pump_events_fn)();
34typedef void (*delay_fn)(Uint32 ms);
35
36#define RESOLVE(module, type, name) ((type)GetProcAddress(module, name))
37
38static const char sdl_module_path[] = "modules\\SDL3.dll";
39static const char sdl_module_name[] = "SDL3.dll";
40
41static bool load_attempted;
48
49static bool load_sdl();
50
51static void report_dialog_failure(SDL_DialogFileCallback callback, void *userdata) {
52 callback(userdata, NULL, -1);
53}
54
55static bool resolve_sdl_dll_path(char *out, size_t out_size) {
57 const bool copied = DTTR_Path_CopySds(out, out_size, path);
58 sdsfree(path);
59 return copied;
60}
61
62static HMODULE get_loaded_sdl_module() {
63 HMODULE module = GetModuleHandleA(sdl_module_path);
64 return module ? module : GetModuleHandleA(sdl_module_name);
65}
66
67static bool resolve_sdl_exports(HMODULE module) {
69 module,
71 "SDL_ShowSimpleMessageBox"
72 );
73 show_message_box = RESOLVE(module, show_message_box_fn, "SDL_ShowMessageBox");
75 module,
77 "SDL_ShowOpenFolderDialog"
78 );
80 module,
82 "SDL_ShowOpenFileDialog"
83 );
84 pump_events = RESOLVE(module, pump_events_fn, "SDL_PumpEvents");
85 delay = RESOLVE(module, delay_fn, "SDL_Delay");
86
89}
90
91static bool load_sdl() {
92 if (show_message_box) {
93 return true;
94 }
95
96 if (load_attempted) {
97 return false;
98 }
99
100 load_attempted = true;
101
102 HMODULE module = get_loaded_sdl_module();
103 if (!module) {
104 char path[MAX_PATH];
105 if (!resolve_sdl_dll_path(path, sizeof(path))) {
106 DTTR_LOG_ERROR("Could not resolve SDL3.dll path");
107 return false;
108 }
109
110 module = LoadLibraryA(path);
111 }
112
113 if (!module) {
114 DTTR_LOG_ERROR("Could not load SDL3.dll");
115 return false;
116 }
117
118 return resolve_sdl_exports(module);
119}
120
122 SDL_MessageBoxFlags flags,
123 const char *title,
124 const char *message,
125 SDL_Window *window
126) {
127 if (!load_sdl()) {
128 MessageBoxA(NULL, message, title, MB_OK | MB_ICONERROR);
129 return false;
130 }
131
132 return show_simple_message_box(flags, title, message, window);
133}
134
135bool DTTR_SDL_ShowMessageBox(const SDL_MessageBoxData *messageboxdata, int *buttonid) {
136 if (!load_sdl()) {
137 return false;
138 }
139
140 return show_message_box(messageboxdata, buttonid);
141}
142
144 SDL_DialogFileCallback callback,
145 void *userdata,
146 SDL_Window *window,
147 const char *default_location,
148 bool allow_many
149) {
150 if (!load_sdl()) {
151 report_dialog_failure(callback, userdata);
152 return;
153 }
154
155 show_open_folder_dialog(callback, userdata, window, default_location, allow_many);
156}
157
159 SDL_DialogFileCallback callback,
160 void *userdata,
161 SDL_Window *window,
162 const SDL_DialogFileFilter *filters,
163 int nfilters,
164 const char *default_location,
165 bool allow_many
166) {
167 if (!load_sdl()) {
168 report_dialog_failure(callback, userdata);
169 return;
170 }
171
173 callback,
174 userdata,
175 window,
176 filters,
177 nfilters,
178 default_location,
179 allow_many
180 );
181}
182
184 if (!load_sdl()) {
185 return;
186 }
187
188 pump_events();
189}
190
191void DTTR_SDL_Delay(Uint32 ms) {
192 if (!load_sdl()) {
193 return;
194 }
195
196 delay(ms);
197}
DTTR_Graphics_COM_Direct3DDevice7 void DWORD flags DWORD void DWORD flags
DTTR_Graphics_COM_DirectDrawSurface7 DWORD flags void NULL
#define DTTR_LOG_ERROR(...)
Definition dttr_log.h:31
struct SDL_Window SDL_Window
Definition dttr_mods.h:19
sds DTTR_Path_ModuleSibling(void *module, const char *relative_path)
Definition path.c:217
bool DTTR_Path_CopySds(char *out, size_t out_size, sds value)
Definition path.c:72
static const char sdl_module_path[]
Definition sdl.c:38
static show_simple_message_box_fn show_simple_message_box
Definition sdl.c:42
void(* delay_fn)(Uint32 ms)
Definition sdl.c:34
static show_open_folder_dialog_fn show_open_folder_dialog
Definition sdl.c:44
static bool load_attempted
Definition sdl.c:41
bool DTTR_SDL_ShowMessageBox(const SDL_MessageBoxData *messageboxdata, int *buttonid)
Definition sdl.c:135
void DTTR_SDL_Delay(Uint32 ms)
Definition sdl.c:191
static show_message_box_fn show_message_box
Definition sdl.c:43
#define RESOLVE(module, type, name)
Definition sdl.c:36
static HMODULE get_loaded_sdl_module()
Definition sdl.c:62
static pump_events_fn pump_events
Definition sdl.c:46
static const char sdl_module_name[]
Definition sdl.c:39
static show_open_file_dialog_fn show_open_file_dialog
Definition sdl.c:45
static delay_fn delay
Definition sdl.c:47
void DTTR_SDL_ShowOpenFileDialog(SDL_DialogFileCallback callback, void *userdata, SDL_Window *window, const SDL_DialogFileFilter *filters, int nfilters, const char *default_location, bool allow_many)
Definition sdl.c:158
static bool load_sdl()
Definition sdl.c:91
void DTTR_SDL_ShowOpenFolderDialog(SDL_DialogFileCallback callback, void *userdata, SDL_Window *window, const char *default_location, bool allow_many)
Definition sdl.c:143
void DTTR_SDL_PumpEvents()
Definition sdl.c:183
static bool resolve_sdl_exports(HMODULE module)
Definition sdl.c:67
bool(* show_message_box_fn)(const SDL_MessageBoxData *messageboxdata, int *buttonid)
Definition sdl.c:13
void(* show_open_file_dialog_fn)(SDL_DialogFileCallback callback, void *userdata, SDL_Window *window, const SDL_DialogFileFilter *filters, int nfilters, const char *default_location, bool allow_many)
Definition sdl.c:24
static bool resolve_sdl_dll_path(char *out, size_t out_size)
Definition sdl.c:55
void(* show_open_folder_dialog_fn)(SDL_DialogFileCallback callback, void *userdata, SDL_Window *window, const char *default_location, bool allow_many)
Definition sdl.c:17
static void report_dialog_failure(SDL_DialogFileCallback callback, void *userdata)
Definition sdl.c:51
bool DTTR_SDL_ShowSimpleMessageBox(SDL_MessageBoxFlags flags, const char *title, const char *message, SDL_Window *window)
Definition sdl.c:121
void(* pump_events_fn)()
Definition sdl.c:33
bool(* show_simple_message_box_fn)(SDL_MessageBoxFlags flags, const char *title, const char *message, SDL_Window *window)
Definition sdl.c:7