aboutsummaryrefslogtreecommitdiff
path: root/src/platform/gui/sdl/UiApplication.cpp
diff options
context:
space:
mode:
authorYuqian Yang <crupest@crupest.life>2025-10-16 23:57:23 +0800
committerYuqian Yang <crupest@crupest.life>2025-10-16 23:57:23 +0800
commit2a9118d137b411b3871073bb6ab18ba98c225d34 (patch)
treeb5fbcf4d6ca1023efd1f3a9383ae8b242b9aadf6 /src/platform/gui/sdl/UiApplication.cpp
parent0b0a8a4087bd3843d4aa9140a9f302423ad5fde8 (diff)
downloadcru-2a9118d137b411b3871073bb6ab18ba98c225d34.tar.gz
cru-2a9118d137b411b3871073bb6ab18ba98c225d34.tar.bz2
cru-2a9118d137b411b3871073bb6ab18ba98c225d34.zip
Bootstrap sdl.
Diffstat (limited to 'src/platform/gui/sdl/UiApplication.cpp')
-rw-r--r--src/platform/gui/sdl/UiApplication.cpp102
1 files changed, 102 insertions, 0 deletions
diff --git a/src/platform/gui/sdl/UiApplication.cpp b/src/platform/gui/sdl/UiApplication.cpp
new file mode 100644
index 00000000..a961ce84
--- /dev/null
+++ b/src/platform/gui/sdl/UiApplication.cpp
@@ -0,0 +1,102 @@
+
+#include "cru/platform/gui/sdl/UiApplication.h"
+
+#include "cru/base/Base.h"
+#include "cru/platform/graphics/cairo/CairoGraphicsFactory.h"
+#include "cru/platform/gui/sdl/Window.h"
+
+#include <algorithm>
+
+namespace cru::platform::gui::sdl {
+SdlUiApplication::SdlUiApplication(
+ graphics::cairo::CairoGraphicsFactory *cairo_factory) {
+ release_cairo_factory_ = false;
+ if (cairo_factory == nullptr) {
+ cairo_factory = new graphics::cairo::CairoGraphicsFactory();
+ release_cairo_factory_ = true;
+ }
+ cairo_factory_ = cairo_factory;
+}
+
+SdlUiApplication::~SdlUiApplication() {
+ if (release_cairo_factory_) {
+ delete cairo_factory_;
+ }
+}
+
+graphics::cairo::CairoGraphicsFactory *SdlUiApplication::GetCairoFactory() {
+ return cairo_factory_;
+}
+
+int SdlUiApplication::Run() {
+ auto exit_code = event_loop_.Run();
+
+ for (const auto &handler : this->quit_handlers_) {
+ handler();
+ }
+
+ return exit_code;
+}
+
+void SdlUiApplication::RequestQuit(int quit_code) {
+ event_loop_.RequestQuit(quit_code);
+}
+
+void SdlUiApplication::AddOnQuitHandler(std::function<void()> handler) {
+ this->quit_handlers_.push_back(std::move(handler));
+}
+
+bool SdlUiApplication::IsQuitOnAllWindowClosed() {
+ return is_quit_on_all_window_closed_;
+}
+
+void SdlUiApplication::SetQuitOnAllWindowClosed(
+ bool quit_on_all_window_closed) {
+ is_quit_on_all_window_closed_ = quit_on_all_window_closed;
+}
+
+long long SdlUiApplication::SetImmediate(std::function<void()> action) {
+ return event_loop_.SetImmediate(std::move(action));
+}
+
+long long SdlUiApplication::SetTimeout(std::chrono::milliseconds milliseconds,
+ std::function<void()> action) {
+ return event_loop_.SetTimeout(std::move(action), std::move(milliseconds));
+}
+
+long long SdlUiApplication::SetInterval(std::chrono::milliseconds milliseconds,
+ std::function<void()> action) {
+ return event_loop_.SetInterval(std::move(action), std::move(milliseconds));
+}
+
+void SdlUiApplication::CancelTimer(long long id) {
+ return event_loop_.CancelTimer(static_cast<int>(id));
+}
+
+std::vector<INativeWindow *> SdlUiApplication::GetAllWindow() {
+ std::vector<INativeWindow *> windows(windows_.size());
+ std::ranges::copy(windows_, windows.begin());
+ return windows;
+}
+
+INativeWindow *SdlUiApplication::CreateWindow() { return new SdlWindow(this); }
+
+cru::platform::graphics::IGraphicsFactory *
+SdlUiApplication::GetGraphicsFactory() {
+ return cairo_factory_;
+}
+
+ICursorManager *SdlUiApplication::GetCursorManager() { NotImplemented(); }
+
+IClipboard *SdlUiApplication::GetClipboard() { NotImplemented(); }
+
+IMenu *SdlUiApplication::GetApplicationMenu() { return nullptr; }
+
+void SdlUiApplication::RegisterWindow(SdlWindow *window) {
+ windows_.push_back(window);
+}
+
+void SdlUiApplication::UnregisterWindow(SdlWindow *window) {
+ std::erase(windows_, window);
+}
+} // namespace cru::platform::gui::sdl