25#include "sdl_utils.hpp"
27#include "sdl_freerdp.hpp"
31#include <freerdp/version.h>
34#define EV_CASE_STR(x) \
38const char* sdl_event_type_str(Uint32 type)
42 EV_CASE_STR(SDL_EVENT_FIRST);
43 EV_CASE_STR(SDL_EVENT_QUIT);
44 EV_CASE_STR(SDL_EVENT_TERMINATING);
45 EV_CASE_STR(SDL_EVENT_LOW_MEMORY);
46 EV_CASE_STR(SDL_EVENT_WILL_ENTER_BACKGROUND);
47 EV_CASE_STR(SDL_EVENT_DID_ENTER_BACKGROUND);
48 EV_CASE_STR(SDL_EVENT_WILL_ENTER_FOREGROUND);
49 EV_CASE_STR(SDL_EVENT_DID_ENTER_FOREGROUND);
50 EV_CASE_STR(SDL_EVENT_LOCALE_CHANGED);
51 EV_CASE_STR(SDL_EVENT_SYSTEM_THEME_CHANGED);
52 EV_CASE_STR(SDL_EVENT_DISPLAY_ORIENTATION);
53 EV_CASE_STR(SDL_EVENT_DISPLAY_ADDED);
54 EV_CASE_STR(SDL_EVENT_DISPLAY_REMOVED);
55 EV_CASE_STR(SDL_EVENT_DISPLAY_MOVED);
56 EV_CASE_STR(SDL_EVENT_DISPLAY_CONTENT_SCALE_CHANGED);
57 EV_CASE_STR(SDL_EVENT_WINDOW_SHOWN);
58 EV_CASE_STR(SDL_EVENT_WINDOW_HIDDEN);
59 EV_CASE_STR(SDL_EVENT_WINDOW_EXPOSED);
60 EV_CASE_STR(SDL_EVENT_WINDOW_MOVED);
61 EV_CASE_STR(SDL_EVENT_WINDOW_RESIZED);
62 EV_CASE_STR(SDL_EVENT_WINDOW_PIXEL_SIZE_CHANGED);
63 EV_CASE_STR(SDL_EVENT_WINDOW_MINIMIZED);
64 EV_CASE_STR(SDL_EVENT_WINDOW_MAXIMIZED);
65 EV_CASE_STR(SDL_EVENT_WINDOW_RESTORED);
66 EV_CASE_STR(SDL_EVENT_WINDOW_MOUSE_ENTER);
67 EV_CASE_STR(SDL_EVENT_WINDOW_MOUSE_LEAVE);
68 EV_CASE_STR(SDL_EVENT_WINDOW_FOCUS_GAINED);
69 EV_CASE_STR(SDL_EVENT_WINDOW_FOCUS_LOST);
70 EV_CASE_STR(SDL_EVENT_WINDOW_CLOSE_REQUESTED);
71 EV_CASE_STR(SDL_EVENT_WINDOW_HIT_TEST);
72 EV_CASE_STR(SDL_EVENT_WINDOW_ICCPROF_CHANGED);
73 EV_CASE_STR(SDL_EVENT_WINDOW_DISPLAY_CHANGED);
74 EV_CASE_STR(SDL_EVENT_WINDOW_DISPLAY_SCALE_CHANGED);
75 EV_CASE_STR(SDL_EVENT_WINDOW_OCCLUDED);
76 EV_CASE_STR(SDL_EVENT_WINDOW_ENTER_FULLSCREEN);
77 EV_CASE_STR(SDL_EVENT_WINDOW_LEAVE_FULLSCREEN);
78 EV_CASE_STR(SDL_EVENT_WINDOW_DESTROYED);
80 EV_CASE_STR(SDL_EVENT_KEY_DOWN);
81 EV_CASE_STR(SDL_EVENT_KEY_UP);
82 EV_CASE_STR(SDL_EVENT_TEXT_EDITING);
83 EV_CASE_STR(SDL_EVENT_TEXT_INPUT);
84 EV_CASE_STR(SDL_EVENT_KEYMAP_CHANGED);
85 EV_CASE_STR(SDL_EVENT_KEYBOARD_ADDED);
86 EV_CASE_STR(SDL_EVENT_KEYBOARD_REMOVED);
88 EV_CASE_STR(SDL_EVENT_MOUSE_MOTION);
89 EV_CASE_STR(SDL_EVENT_MOUSE_BUTTON_DOWN);
90 EV_CASE_STR(SDL_EVENT_MOUSE_BUTTON_UP);
91 EV_CASE_STR(SDL_EVENT_MOUSE_WHEEL);
92 EV_CASE_STR(SDL_EVENT_MOUSE_ADDED);
93 EV_CASE_STR(SDL_EVENT_MOUSE_REMOVED);
95 EV_CASE_STR(SDL_EVENT_JOYSTICK_AXIS_MOTION);
96 EV_CASE_STR(SDL_EVENT_JOYSTICK_BALL_MOTION);
97 EV_CASE_STR(SDL_EVENT_JOYSTICK_HAT_MOTION);
98 EV_CASE_STR(SDL_EVENT_JOYSTICK_BUTTON_DOWN);
99 EV_CASE_STR(SDL_EVENT_JOYSTICK_BUTTON_UP);
100 EV_CASE_STR(SDL_EVENT_JOYSTICK_ADDED);
101 EV_CASE_STR(SDL_EVENT_JOYSTICK_REMOVED);
102 EV_CASE_STR(SDL_EVENT_JOYSTICK_BATTERY_UPDATED);
103 EV_CASE_STR(SDL_EVENT_JOYSTICK_UPDATE_COMPLETE);
105 EV_CASE_STR(SDL_EVENT_GAMEPAD_AXIS_MOTION);
106 EV_CASE_STR(SDL_EVENT_GAMEPAD_BUTTON_DOWN);
107 EV_CASE_STR(SDL_EVENT_GAMEPAD_BUTTON_UP);
108 EV_CASE_STR(SDL_EVENT_GAMEPAD_ADDED);
109 EV_CASE_STR(SDL_EVENT_GAMEPAD_REMOVED);
110 EV_CASE_STR(SDL_EVENT_GAMEPAD_REMAPPED);
111 EV_CASE_STR(SDL_EVENT_GAMEPAD_TOUCHPAD_DOWN);
112 EV_CASE_STR(SDL_EVENT_GAMEPAD_TOUCHPAD_MOTION);
113 EV_CASE_STR(SDL_EVENT_GAMEPAD_TOUCHPAD_UP);
114 EV_CASE_STR(SDL_EVENT_GAMEPAD_SENSOR_UPDATE);
115 EV_CASE_STR(SDL_EVENT_GAMEPAD_UPDATE_COMPLETE);
116 EV_CASE_STR(SDL_EVENT_GAMEPAD_STEAM_HANDLE_UPDATED);
118 EV_CASE_STR(SDL_EVENT_FINGER_DOWN);
119 EV_CASE_STR(SDL_EVENT_FINGER_UP);
120 EV_CASE_STR(SDL_EVENT_FINGER_MOTION);
122 EV_CASE_STR(SDL_EVENT_CLIPBOARD_UPDATE);
124 EV_CASE_STR(SDL_EVENT_DROP_FILE);
125 EV_CASE_STR(SDL_EVENT_DROP_TEXT);
126 EV_CASE_STR(SDL_EVENT_DROP_BEGIN);
127 EV_CASE_STR(SDL_EVENT_DROP_COMPLETE);
128 EV_CASE_STR(SDL_EVENT_DROP_POSITION);
130 EV_CASE_STR(SDL_EVENT_AUDIO_DEVICE_ADDED);
131 EV_CASE_STR(SDL_EVENT_AUDIO_DEVICE_REMOVED);
132 EV_CASE_STR(SDL_EVENT_AUDIO_DEVICE_FORMAT_CHANGED);
134 EV_CASE_STR(SDL_EVENT_SENSOR_UPDATE);
136 EV_CASE_STR(SDL_EVENT_PEN_DOWN);
137 EV_CASE_STR(SDL_EVENT_PEN_UP);
138 EV_CASE_STR(SDL_EVENT_PEN_MOTION);
139 EV_CASE_STR(SDL_EVENT_PEN_BUTTON_DOWN);
140 EV_CASE_STR(SDL_EVENT_PEN_BUTTON_UP);
141 EV_CASE_STR(SDL_EVENT_CAMERA_DEVICE_ADDED);
142 EV_CASE_STR(SDL_EVENT_CAMERA_DEVICE_REMOVED);
143 EV_CASE_STR(SDL_EVENT_CAMERA_DEVICE_APPROVED);
144 EV_CASE_STR(SDL_EVENT_CAMERA_DEVICE_DENIED);
146 EV_CASE_STR(SDL_EVENT_RENDER_TARGETS_RESET);
147 EV_CASE_STR(SDL_EVENT_RENDER_DEVICE_RESET);
148 EV_CASE_STR(SDL_EVENT_POLL_SENTINEL);
150 EV_CASE_STR(SDL_EVENT_USER);
152 EV_CASE_STR(SDL_EVENT_USER_CERT_DIALOG);
153 EV_CASE_STR(SDL_EVENT_USER_CERT_RESULT);
154 EV_CASE_STR(SDL_EVENT_USER_SHOW_DIALOG);
155 EV_CASE_STR(SDL_EVENT_USER_SHOW_RESULT);
156 EV_CASE_STR(SDL_EVENT_USER_AUTH_DIALOG);
157 EV_CASE_STR(SDL_EVENT_USER_AUTH_RESULT);
158 EV_CASE_STR(SDL_EVENT_USER_SCARD_DIALOG);
159 EV_CASE_STR(SDL_EVENT_USER_RETRY_DIALOG);
160 EV_CASE_STR(SDL_EVENT_USER_SCARD_RESULT);
161 EV_CASE_STR(SDL_EVENT_USER_UPDATE);
162 EV_CASE_STR(SDL_EVENT_USER_CREATE_WINDOWS);
163 EV_CASE_STR(SDL_EVENT_USER_WINDOW_RESIZEABLE);
164 EV_CASE_STR(SDL_EVENT_USER_WINDOW_FULLSCREEN);
165 EV_CASE_STR(SDL_EVENT_USER_WINDOW_MINIMIZE);
166 EV_CASE_STR(SDL_EVENT_USER_POINTER_NULL);
167 EV_CASE_STR(SDL_EVENT_USER_POINTER_DEFAULT);
168 EV_CASE_STR(SDL_EVENT_USER_POINTER_POSITION);
169 EV_CASE_STR(SDL_EVENT_USER_POINTER_SET);
170 EV_CASE_STR(SDL_EVENT_USER_QUIT);
172 EV_CASE_STR(SDL_EVENT_LAST);
174 return "SDL_UNKNOWNEVENT";
178const char* sdl_error_string(Sint32 res)
183 return SDL_GetError();
186BOOL sdl_log_error_ex(Sint32 res, wLog* log,
const char* what,
const char* file,
size_t line,
189 const char* msg = sdl_error_string(res);
196 WLog_Print(log, WLOG_ERROR,
"[%s:%" PRIuz
"][%s]: %s", fkt, line, what, msg);
200bool sdl_push_user_event(Uint32 type, ...)
203 SDL_UserEvent*
event = &ev.user;
210 case SDL_EVENT_USER_AUTH_RESULT:
213 arg->user = va_arg(ap,
char*);
214 arg->domain = va_arg(ap,
char*);
215 arg->password = va_arg(ap,
char*);
216 arg->result = va_arg(ap, Sint32);
219 case SDL_EVENT_USER_AUTH_DIALOG:
223 arg->title = va_arg(ap,
char*);
224 arg->user = va_arg(ap,
char*);
225 arg->domain = va_arg(ap,
char*);
226 arg->password = va_arg(ap,
char*);
227 arg->result = va_arg(ap, Sint32);
230 case SDL_EVENT_USER_SCARD_DIALOG:
232 event->data1 = va_arg(ap,
char*);
233 event->data2 = va_arg(ap,
char**);
234 event->code = va_arg(ap, Sint32);
237 case SDL_EVENT_USER_RETRY_DIALOG:
239 case SDL_EVENT_USER_SCARD_RESULT:
240 case SDL_EVENT_USER_SHOW_RESULT:
241 case SDL_EVENT_USER_CERT_RESULT:
242 event->code = va_arg(ap, Sint32);
245 case SDL_EVENT_USER_SHOW_DIALOG:
246 event->data1 = va_arg(ap,
char*);
247 event->data2 = va_arg(ap,
char*);
248 event->code = va_arg(ap, Sint32);
250 case SDL_EVENT_USER_CERT_DIALOG:
251 event->data1 = va_arg(ap,
char*);
252 event->data2 = va_arg(ap,
char*);
254 case SDL_EVENT_USER_UPDATE:
255 event->data1 = va_arg(ap,
void*);
257 case SDL_EVENT_USER_POINTER_POSITION:
258 event->data1 =
reinterpret_cast<void*
>(
static_cast<uintptr_t
>(va_arg(ap, UINT32)));
259 event->data2 =
reinterpret_cast<void*
>(
static_cast<uintptr_t
>(va_arg(ap, UINT32)));
261 case SDL_EVENT_USER_POINTER_SET:
262 event->data1 = va_arg(ap,
void*);
263 event->data2 = va_arg(ap,
void*);
265 case SDL_EVENT_USER_CREATE_WINDOWS:
266 event->data1 = va_arg(ap,
void*);
268 case SDL_EVENT_USER_WINDOW_FULLSCREEN:
269 case SDL_EVENT_USER_WINDOW_RESIZEABLE:
270 event->data1 = va_arg(ap,
void*);
271 event->code = va_arg(ap,
int);
273 case SDL_EVENT_USER_WINDOW_MINIMIZE:
274 case SDL_EVENT_USER_QUIT:
275 case SDL_EVENT_USER_POINTER_NULL:
276 case SDL_EVENT_USER_POINTER_DEFAULT:
277 case SDL_EVENT_CLIPBOARD_UPDATE:
284 return SDL_PushEvent(&ev) == 1;
290 ev.type = SDL_EVENT_QUIT;
295std::string sdl_window_event_str(Uint32 ev)
297 if ((ev >= SDL_EVENT_WINDOW_FIRST) && (ev <= SDL_EVENT_WINDOW_LAST))
298 return sdl_event_type_str(ev);
300 return "SDL_EVENT_WINDOW_UNKNOWN";
303UINT32 sdl::utils::orientaion_to_rdp(SDL_DisplayOrientation orientation)
307 case SDL_ORIENTATION_LANDSCAPE:
308 return ORIENTATION_LANDSCAPE;
309 case SDL_ORIENTATION_LANDSCAPE_FLIPPED:
310 return ORIENTATION_LANDSCAPE_FLIPPED;
311 case SDL_ORIENTATION_PORTRAIT_FLIPPED:
312 return ORIENTATION_PORTRAIT_FLIPPED;
313 case SDL_ORIENTATION_PORTRAIT:
315 return ORIENTATION_PORTRAIT;
319std::string sdl::utils::sdl_orientation_to_str(SDL_DisplayOrientation orientation)
323 case SDL_ORIENTATION_LANDSCAPE:
324 return "SDL_ORIENTATION_LANDSCAPE";
325 case SDL_ORIENTATION_LANDSCAPE_FLIPPED:
326 return "SDL_ORIENTATION_LANDSCAPE_FLIPPED";
327 case SDL_ORIENTATION_PORTRAIT_FLIPPED:
328 return "SDL_ORIENTATION_PORTRAIT_FLIPPED";
329 case SDL_ORIENTATION_PORTRAIT:
330 return "SDL_ORIENTATION_PORTRAIT";
332 return "SDL_ORIENTATION_UNKNOWN";
336std::string sdl::utils::rdp_orientation_to_str(uint32_t orientation)
340 case ORIENTATION_LANDSCAPE:
341 return "ORIENTATION_LANDSCAPE";
342 case ORIENTATION_LANDSCAPE_FLIPPED:
343 return "ORIENTATION_LANDSCAPE_FLIPPED";
344 case ORIENTATION_PORTRAIT_FLIPPED:
345 return "ORIENTATION_PORTRAIT_FLIPPED";
346 case ORIENTATION_PORTRAIT:
347 return "ORIENTATION_PORTRAIT";
350 std::stringstream ss;
351 ss <<
"ORIENTATION_UNKNOWN_" << std::hex << std::setfill(
'0') << std::setw(8)
358std::string sdl::utils::generate_uuid_v4()
360 static std::random_device rd;
361 static std::mt19937 gen(rd());
362 static std::uniform_int_distribution<> dis(0, 255);
363 std::stringstream ss;
364 ss << std::hex << std::setfill(
'0') << std::setw(2);
365 for (
int i = 0; i < 4; i++)
370 for (
int i = 0; i < 2; i++)
375 for (
int i = 0; i < 2; i++)
380 for (
int i = 0; i < 2; i++)
385 for (
int i = 0; i < 6; i++)