23#include "sdl_connection_dialog_wrapper.hpp"
24#include "sdl_connection_dialog.hpp"
25#include "../sdl_utils.hpp"
29SdlConnectionDialogWrapper::~SdlConnectionDialogWrapper() =
default;
31void SdlConnectionDialogWrapper::create(rdpContext* context)
33 _connection_dialog = std::make_unique<SDLConnectionDialog>(context);
36void SdlConnectionDialogWrapper::destroy()
38 _connection_dialog.reset();
41bool SdlConnectionDialogWrapper::isRunning()
const
43 std::unique_lock lock(_mux);
44 if (!_connection_dialog)
46 return _connection_dialog->running();
49bool SdlConnectionDialogWrapper::isVisible()
const
51 std::unique_lock lock(_mux);
52 if (!_connection_dialog)
54 return _connection_dialog->visible();
57bool SdlConnectionDialogWrapper::handleEvent(
const SDL_Event& event)
59 std::unique_lock lock(_mux);
60 if (!_connection_dialog)
62 return _connection_dialog->handle(event);
65WINPR_ATTR_FORMAT_ARG(1, 0)
66static std::
string format(WINPR_FORMAT_ARG const
char* fmt, va_list ap)
70 const int size = vsnprintf(
nullptr, 0, fmt, ap1);
77 msg.resize(
static_cast<size_t>(size) + 1);
81 (void)vsnprintf(msg.data(), msg.size(), fmt, ap2);
86void SdlConnectionDialogWrapper::setTitle(
const char* fmt, ...)
90 setTitle(format(fmt, ap));
94void SdlConnectionDialogWrapper::setTitle(
const std::string& title)
99void SdlConnectionDialogWrapper::showInfo(
const char* fmt, ...)
103 showInfo(format(fmt, ap));
107void SdlConnectionDialogWrapper::showInfo(
const std::string& info)
109 show(MSG_INFO, info);
112void SdlConnectionDialogWrapper::showWarn(
const char* fmt, ...)
116 showWarn(format(fmt, ap));
120void SdlConnectionDialogWrapper::showWarn(
const std::string& info)
122 show(MSG_WARN, info);
125void SdlConnectionDialogWrapper::showError(
const char* fmt, ...)
129 showError(format(fmt, ap));
133void SdlConnectionDialogWrapper::showError(
const std::string& error)
135 show(MSG_ERROR, error);
138void SdlConnectionDialogWrapper::show(SdlConnectionDialogWrapper::MsgType type,
139 const std::string& msg)
141 push({ type, msg,
true });
144void SdlConnectionDialogWrapper::show(
bool visible)
149void SdlConnectionDialogWrapper::handleShow()
151 std::unique_lock lock(_mux);
152 while (!_queue.empty())
154 auto arg = _queue.front();
157 if (!_connection_dialog)
162 _connection_dialog->setTitle(arg.title().c_str());
165 if (arg.hasType() && arg.hasMessage())
169 case SdlConnectionDialogWrapper::MSG_INFO:
170 _connection_dialog->showInfo(arg.message().c_str());
172 case SdlConnectionDialogWrapper::MSG_WARN:
173 _connection_dialog->showWarn(arg.message().c_str());
175 case SdlConnectionDialogWrapper::MSG_ERROR:
176 _connection_dialog->showError(arg.message().c_str());
183 if (arg.hasVisibility())
186 _connection_dialog->show();
188 _connection_dialog->hide();
193void SdlConnectionDialogWrapper::push(EventArg&& arg)
196 std::unique_lock lock(_mux);
197 _queue.push(std::move(arg));
200 auto rc = SDL_RunOnMainThread(
208 SDL_LogWarn(SDL_LOG_CATEGORY_APPLICATION,
"[%s] SDL_RunOnMainThread failed with %s",
209 __func__, SDL_GetError());
212SdlConnectionDialogWrapper::EventArg::EventArg(
bool visible) : _visible(visible), _mask(8)
216SdlConnectionDialogWrapper::EventArg::EventArg(
const std::string& title) : _title(title), _mask(1)
220SdlConnectionDialogWrapper::EventArg::EventArg(MsgType type,
const std::string& msg,
bool visible)
221 : _message(msg), _type(type), _visible(visible), _mask(14)
225bool SdlConnectionDialogWrapper::EventArg::hasTitle()
const
230const std::string& SdlConnectionDialogWrapper::EventArg::title()
const
235bool SdlConnectionDialogWrapper::EventArg::hasMessage()
const
240const std::string& SdlConnectionDialogWrapper::EventArg::message()
const
245bool SdlConnectionDialogWrapper::EventArg::hasType()
const
250SdlConnectionDialogWrapper::MsgType SdlConnectionDialogWrapper::EventArg::type()
const
255bool SdlConnectionDialogWrapper::EventArg::hasVisibility()
const
260bool SdlConnectionDialogWrapper::EventArg::visible()
const
265std::string SdlConnectionDialogWrapper::EventArg::str()
const
267 std::stringstream ss;
268 ss <<
"{ title:" << _title <<
", message:" << _message <<
", type:" << _type
269 <<
", visible:" << _visible <<
", mask:" << _mask <<
"}";
SdlConnectionDialogWrapper()