23#include <freerdp/freerdp.h>
24#include <freerdp/settings.h>
25#include <freerdp/log.h>
27#include "../sdl_utils.hpp"
28#include "sdl_connection_dialog.hpp"
29#include "sdl_connection_dialog_wrapper.hpp"
35SdlConnectionDialogWrapper::~SdlConnectionDialogWrapper() =
default;
37void SdlConnectionDialogWrapper::create(rdpContext* context)
41 _connection_dialog.reset();
42#if defined(__EMSCRIPTEN__)
47 WINPR_UNUSED(enabled);
50 _connection_dialog = std::make_unique<SDLConnectionDialog>(context);
54void SdlConnectionDialogWrapper::destroy()
56 _connection_dialog.reset();
59bool SdlConnectionDialogWrapper::isRunning()
const
61 std::unique_lock lock(_mux);
67 if (!_connection_dialog)
69 return _connection_dialog->running();
72bool SdlConnectionDialogWrapper::isVisible()
const
74 std::unique_lock lock(_mux);
75 if (!_connection_dialog)
77 return _connection_dialog->visible();
80bool SdlConnectionDialogWrapper::handleEvent(
const SDL_Event& event)
82 std::unique_lock lock(_mux);
83 if (!_connection_dialog)
85 return _connection_dialog->handle(event);
88WINPR_ATTR_FORMAT_ARG(1, 0)
89static std::
string format(WINPR_FORMAT_ARG const
char* fmt, va_list ap)
93 const int size = vsnprintf(
nullptr, 0, fmt, ap1);
100 msg.resize(
static_cast<size_t>(size) + 1);
104 std::ignore = vsnprintf(msg.data(), msg.size(), fmt, ap2);
109void SdlConnectionDialogWrapper::setTitle(
const char* fmt, ...)
113 setTitle(format(fmt, ap));
117void SdlConnectionDialogWrapper::setTitle(
const std::string& title)
119 push(EventArg{ title });
122void SdlConnectionDialogWrapper::showInfo(
const char* fmt, ...)
126 showInfo(format(fmt, ap));
130void SdlConnectionDialogWrapper::showInfo(
const std::string& info)
132 show(MSG_INFO, info);
135void SdlConnectionDialogWrapper::showWarn(
const char* fmt, ...)
139 showWarn(format(fmt, ap));
143void SdlConnectionDialogWrapper::showWarn(
const std::string& info)
145 show(MSG_WARN, info);
148void SdlConnectionDialogWrapper::showError(
const char* fmt, ...)
152 showError(format(fmt, ap));
156void SdlConnectionDialogWrapper::showError(
const std::string& error)
158 show(MSG_ERROR, error);
161void SdlConnectionDialogWrapper::show(SdlConnectionDialogWrapper::MsgType type,
162 const std::string& msg)
164 push({ type, msg,
true });
167void SdlConnectionDialogWrapper::show(
bool visible)
169 push(EventArg{ visible });
172void SdlConnectionDialogWrapper::handleShow()
174 std::unique_lock lock(_mux);
175 while (!_queue.empty())
178 auto arg = std::move(_queue.front());
181 if (arg.hasTitle() && _connection_dialog)
183 std::ignore = _connection_dialog->setTitle(arg.title().c_str());
186 if (arg.hasType() && arg.hasMessage())
190 case SdlConnectionDialogWrapper::MSG_INFO:
191 if (_connection_dialog)
192 std::ignore = _connection_dialog->showInfo(arg.message().c_str());
194 WLog_Print(_log, WLOG_INFO,
"%s", arg.message().c_str());
196 case SdlConnectionDialogWrapper::MSG_WARN:
197 if (_connection_dialog)
198 std::ignore = _connection_dialog->showWarn(arg.message().c_str());
200 WLog_Print(_log, WLOG_WARN,
"%s", arg.message().c_str());
202 case SdlConnectionDialogWrapper::MSG_ERROR:
203 if (_connection_dialog)
204 std::ignore = _connection_dialog->showError(arg.message().c_str());
206 WLog_Print(_log, WLOG_ERROR,
"%s", arg.message().c_str());
213 if (arg.hasVisibility() && _connection_dialog)
216 std::ignore = _connection_dialog->show();
218 std::ignore = _connection_dialog->hide();
223void SdlConnectionDialogWrapper::push(EventArg&& arg)
226 std::unique_lock lock(_mux);
227 _queue.push(std::move(arg));
230 auto rc = SDL_RunOnMainThread(
238 SDL_LogWarn(SDL_LOG_CATEGORY_APPLICATION,
"[%s] SDL_RunOnMainThread failed with %s",
239 __func__, SDL_GetError());
242SdlConnectionDialogWrapper::EventArg::EventArg(
bool visible) : _visible(visible), _mask(8)
246SdlConnectionDialogWrapper::EventArg::EventArg(
const std::string& title) : _title(title), _mask(1)
250SdlConnectionDialogWrapper::EventArg::EventArg(MsgType type,
const std::string& msg,
bool visible)
251 : _message(msg), _type(type), _visible(visible), _mask(14)
255bool SdlConnectionDialogWrapper::EventArg::hasTitle()
const
260const std::string& SdlConnectionDialogWrapper::EventArg::title()
const
265bool SdlConnectionDialogWrapper::EventArg::hasMessage()
const
270const std::string& SdlConnectionDialogWrapper::EventArg::message()
const
275bool SdlConnectionDialogWrapper::EventArg::hasType()
const
280SdlConnectionDialogWrapper::MsgType SdlConnectionDialogWrapper::EventArg::type()
const
285bool SdlConnectionDialogWrapper::EventArg::hasVisibility()
const
290bool SdlConnectionDialogWrapper::EventArg::visible()
const
295std::string SdlConnectionDialogWrapper::EventArg::str()
const
297 std::stringstream ss;
298 ss <<
"{ title:" << _title <<
", message:" << _message <<
", type:" << _type
299 <<
", visible:" << _visible <<
", mask:" << _mask <<
"}";
SdlConnectionDialogWrapper(wLog *log)
WINPR_ATTR_NODISCARD FREERDP_API BOOL freerdp_settings_get_bool(const rdpSettings *settings, FreeRDP_Settings_Keys_Bool id)
Returns a boolean settings value.