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();
43 _connection_dialog = std::make_unique<SDLConnectionDialog>(context);
46void SdlConnectionDialogWrapper::destroy()
48 _connection_dialog.reset();
51bool SdlConnectionDialogWrapper::isRunning()
const
53 std::unique_lock lock(_mux);
54 if (!_connection_dialog)
56 return _connection_dialog->running();
59bool SdlConnectionDialogWrapper::isVisible()
const
61 std::unique_lock lock(_mux);
62 if (!_connection_dialog)
64 return _connection_dialog->visible();
67bool SdlConnectionDialogWrapper::handleEvent(
const SDL_Event& event)
69 std::unique_lock lock(_mux);
70 if (!_connection_dialog)
72 return _connection_dialog->handle(event);
75WINPR_ATTR_FORMAT_ARG(1, 0)
76static std::
string format(WINPR_FORMAT_ARG const
char* fmt, va_list ap)
80 const int size = vsnprintf(
nullptr, 0, fmt, ap1);
87 msg.resize(
static_cast<size_t>(size) + 1);
91 (void)vsnprintf(msg.data(), msg.size(), fmt, ap2);
96void SdlConnectionDialogWrapper::setTitle(
const char* fmt, ...)
100 setTitle(format(fmt, ap));
104void SdlConnectionDialogWrapper::setTitle(
const std::string& title)
106 push(EventArg{ title });
109void SdlConnectionDialogWrapper::showInfo(
const char* fmt, ...)
113 showInfo(format(fmt, ap));
117void SdlConnectionDialogWrapper::showInfo(
const std::string& info)
119 show(MSG_INFO, info);
122void SdlConnectionDialogWrapper::showWarn(
const char* fmt, ...)
126 showWarn(format(fmt, ap));
130void SdlConnectionDialogWrapper::showWarn(
const std::string& info)
132 show(MSG_WARN, info);
135void SdlConnectionDialogWrapper::showError(
const char* fmt, ...)
139 showError(format(fmt, ap));
143void SdlConnectionDialogWrapper::showError(
const std::string& error)
145 show(MSG_ERROR, error);
148void SdlConnectionDialogWrapper::show(SdlConnectionDialogWrapper::MsgType type,
149 const std::string& msg)
151 push({ type, msg,
true });
154void SdlConnectionDialogWrapper::show(
bool visible)
156 push(EventArg{ visible });
159void SdlConnectionDialogWrapper::handleShow()
161 std::unique_lock lock(_mux);
162 while (!_queue.empty())
164 auto arg = _queue.front();
167 if (arg.hasTitle() && _connection_dialog)
169 _connection_dialog->setTitle(arg.title().c_str());
172 if (arg.hasType() && arg.hasMessage())
176 case SdlConnectionDialogWrapper::MSG_INFO:
177 if (_connection_dialog)
178 _connection_dialog->showInfo(arg.message().c_str());
180 WLog_Print(_log, WLOG_INFO,
"%s", arg.message().c_str());
182 case SdlConnectionDialogWrapper::MSG_WARN:
183 if (_connection_dialog)
184 _connection_dialog->showWarn(arg.message().c_str());
186 WLog_Print(_log, WLOG_WARN,
"%s", arg.message().c_str());
188 case SdlConnectionDialogWrapper::MSG_ERROR:
189 if (_connection_dialog)
190 _connection_dialog->showError(arg.message().c_str());
192 WLog_Print(_log, WLOG_ERROR,
"%s", arg.message().c_str());
199 if (arg.hasVisibility() && _connection_dialog)
202 _connection_dialog->show();
204 _connection_dialog->hide();
209void SdlConnectionDialogWrapper::push(EventArg&& arg)
212 std::unique_lock lock(_mux);
213 _queue.push(std::move(arg));
216 auto rc = SDL_RunOnMainThread(
224 SDL_LogWarn(SDL_LOG_CATEGORY_APPLICATION,
"[%s] SDL_RunOnMainThread failed with %s",
225 __func__, SDL_GetError());
228SdlConnectionDialogWrapper::EventArg::EventArg(
bool visible) : _visible(visible), _mask(8)
232SdlConnectionDialogWrapper::EventArg::EventArg(
const std::string& title) : _title(title), _mask(1)
236SdlConnectionDialogWrapper::EventArg::EventArg(MsgType type,
const std::string& msg,
bool visible)
237 : _message(msg), _type(type), _visible(visible), _mask(14)
241bool SdlConnectionDialogWrapper::EventArg::hasTitle()
const
246const std::string& SdlConnectionDialogWrapper::EventArg::title()
const
251bool SdlConnectionDialogWrapper::EventArg::hasMessage()
const
256const std::string& SdlConnectionDialogWrapper::EventArg::message()
const
261bool SdlConnectionDialogWrapper::EventArg::hasType()
const
266SdlConnectionDialogWrapper::MsgType SdlConnectionDialogWrapper::EventArg::type()
const
271bool SdlConnectionDialogWrapper::EventArg::hasVisibility()
const
276bool SdlConnectionDialogWrapper::EventArg::visible()
const
281std::string SdlConnectionDialogWrapper::EventArg::str()
const
283 std::stringstream ss;
284 ss <<
"{ title:" << _title <<
", message:" << _message <<
", type:" << _type
285 <<
", visible:" << _visible <<
", mask:" << _mask <<
"}";
SdlConnectionDialogWrapper(wLog *log)
FREERDP_API BOOL freerdp_settings_get_bool(const rdpSettings *settings, FreeRDP_Settings_Keys_Bool id)
Returns a boolean settings value.