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:
 
  238      event->code = va_arg(ap, Sint32);
 
  240    case SDL_EVENT_USER_SCARD_RESULT:
 
  241    case SDL_EVENT_USER_SHOW_RESULT:
 
  242    case SDL_EVENT_USER_CERT_RESULT:
 
  243      event->code = va_arg(ap, Sint32);
 
  246    case SDL_EVENT_USER_SHOW_DIALOG:
 
  247      event->data1 = va_arg(ap, 
char*);
 
  248      event->data2 = va_arg(ap, 
char*);
 
  249      event->code = va_arg(ap, Sint32);
 
  251    case SDL_EVENT_USER_CERT_DIALOG:
 
  252      event->data1 = va_arg(ap, 
char*);
 
  253      event->data2 = va_arg(ap, 
char*);
 
  255    case SDL_EVENT_USER_UPDATE:
 
  256      event->data1 = va_arg(ap, 
void*);
 
  258    case SDL_EVENT_USER_POINTER_POSITION:
 
  259      event->data1 = 
reinterpret_cast<void*
>(
static_cast<uintptr_t
>(va_arg(ap, UINT32)));
 
  260      event->data2 = 
reinterpret_cast<void*
>(
static_cast<uintptr_t
>(va_arg(ap, UINT32)));
 
  262    case SDL_EVENT_USER_POINTER_SET:
 
  263      event->data1 = va_arg(ap, 
void*);
 
  264      event->data2 = va_arg(ap, 
void*);
 
  266    case SDL_EVENT_USER_CREATE_WINDOWS:
 
  267      event->data1 = va_arg(ap, 
void*);
 
  269    case SDL_EVENT_USER_WINDOW_FULLSCREEN:
 
  270    case SDL_EVENT_USER_WINDOW_RESIZEABLE:
 
  271      event->data1 = va_arg(ap, 
void*);
 
  272      event->code = va_arg(ap, 
int);
 
  274    case SDL_EVENT_USER_WINDOW_MINIMIZE:
 
  275    case SDL_EVENT_USER_QUIT:
 
  276    case SDL_EVENT_USER_POINTER_NULL:
 
  277    case SDL_EVENT_USER_POINTER_DEFAULT:
 
  278    case SDL_EVENT_CLIPBOARD_UPDATE:
 
  282      SDL_LogWarn(SDL_LOG_CATEGORY_APPLICATION, 
"[%s] unsupported type %u", __func__, type);
 
  286  return SDL_PushEvent(&ev) == 1;
 
  292  ev.type = SDL_EVENT_QUIT;
 
  297std::string sdl_window_event_str(Uint32 ev)
 
  299  if ((ev >= SDL_EVENT_WINDOW_FIRST) && (ev <= SDL_EVENT_WINDOW_LAST))
 
  300    return sdl_event_type_str(ev);
 
  302  return "SDL_EVENT_WINDOW_UNKNOWN";
 
  305UINT32 sdl::utils::orientaion_to_rdp(SDL_DisplayOrientation orientation)
 
  309    case SDL_ORIENTATION_LANDSCAPE:
 
  310      return ORIENTATION_LANDSCAPE;
 
  311    case SDL_ORIENTATION_LANDSCAPE_FLIPPED:
 
  312      return ORIENTATION_LANDSCAPE_FLIPPED;
 
  313    case SDL_ORIENTATION_PORTRAIT_FLIPPED:
 
  314      return ORIENTATION_PORTRAIT_FLIPPED;
 
  315    case SDL_ORIENTATION_PORTRAIT:
 
  317      return ORIENTATION_PORTRAIT;
 
  321std::string sdl::utils::sdl_orientation_to_str(SDL_DisplayOrientation orientation)
 
  325    case SDL_ORIENTATION_LANDSCAPE:
 
  326      return "SDL_ORIENTATION_LANDSCAPE";
 
  327    case SDL_ORIENTATION_LANDSCAPE_FLIPPED:
 
  328      return "SDL_ORIENTATION_LANDSCAPE_FLIPPED";
 
  329    case SDL_ORIENTATION_PORTRAIT_FLIPPED:
 
  330      return "SDL_ORIENTATION_PORTRAIT_FLIPPED";
 
  331    case SDL_ORIENTATION_PORTRAIT:
 
  332      return "SDL_ORIENTATION_PORTRAIT";
 
  334      return "SDL_ORIENTATION_UNKNOWN";
 
  338std::string sdl::utils::rdp_orientation_to_str(uint32_t orientation)
 
  342    case ORIENTATION_LANDSCAPE:
 
  343      return "ORIENTATION_LANDSCAPE";
 
  344    case ORIENTATION_LANDSCAPE_FLIPPED:
 
  345      return "ORIENTATION_LANDSCAPE_FLIPPED";
 
  346    case ORIENTATION_PORTRAIT_FLIPPED:
 
  347      return "ORIENTATION_PORTRAIT_FLIPPED";
 
  348    case ORIENTATION_PORTRAIT:
 
  349      return "ORIENTATION_PORTRAIT";
 
  352      std::stringstream ss;
 
  353      ss << 
"ORIENTATION_UNKNOWN_" << std::hex << std::setfill(
'0') << std::setw(8)
 
  360std::string sdl::utils::generate_uuid_v4()
 
  362  static std::random_device rd;
 
  363  static std::mt19937 gen(rd());
 
  364  static std::uniform_int_distribution<> dis(0, 255);
 
  365  std::stringstream ss;
 
  366  ss << std::hex << std::setfill(
'0') << std::setw(2);
 
  367  for (
int i = 0; i < 4; i++)
 
  372  for (
int i = 0; i < 2; i++)
 
  377  for (
int i = 0; i < 2; i++)
 
  382  for (
int i = 0; i < 2; i++)
 
  387  for (
int i = 0; i < 6; i++)