aboutsummaryrefslogtreecommitdiff
path: root/src/platform/gui/sdl/Window.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/platform/gui/sdl/Window.cpp')
-rw-r--r--src/platform/gui/sdl/Window.cpp88
1 files changed, 80 insertions, 8 deletions
diff --git a/src/platform/gui/sdl/Window.cpp b/src/platform/gui/sdl/Window.cpp
index f5fceb5f..e517810a 100644
--- a/src/platform/gui/sdl/Window.cpp
+++ b/src/platform/gui/sdl/Window.cpp
@@ -37,24 +37,65 @@ INativeWindow* SdlWindow::GetParent() { return parent_; }
void SdlWindow::SetParent(INativeWindow* parent) {
parent_ = CheckPlatform<SdlWindow>(parent, GetPlatformId());
- NotImplemented();
+ if (parent_ != nullptr) {
+ parent_create_guard_.Reset(
+ parent_->CreateEvent()->AddSpyOnlyHandler([this] {
+ if (sdl_window_) {
+ DoUpdateParent();
+ }
+ }));
+ }
+ if (sdl_window_) {
+ DoUpdateParent();
+ }
}
WindowStyleFlag SdlWindow::GetStyleFlag() { return style_; }
void SdlWindow::SetStyleFlag(WindowStyleFlag flag) {
style_ = flag;
- NotImplemented();
+ if (sdl_window_) {
+ DoUpdateStyleFlag();
+ }
}
-std::string SdlWindow::GetTitle() { NotImplemented(); }
+std::string SdlWindow::GetTitle() { return title_; }
-void SdlWindow::SetTitle(std::string title) { NotImplemented(); }
+void SdlWindow::SetTitle(std::string title) {
+ title_ = std::move(title);
+ if (sdl_window_) {
+ DoUpdateTitle();
+ }
+}
-WindowVisibilityType SdlWindow::GetVisibility() { NotImplemented(); }
+WindowVisibilityType SdlWindow::GetVisibility() {
+ if (!sdl_window_) return WindowVisibilityType::Hide;
+ auto flags = SDL_GetWindowFlags(*sdl_window_);
+ if (flags & SDL_WINDOW_HIDDEN) {
+ return WindowVisibilityType::Hide;
+ }
+ if (flags & SDL_WINDOW_MINIMIZED) {
+ return WindowVisibilityType::Minimize;
+ }
+ return WindowVisibilityType::Show;
+}
void SdlWindow::SetVisibility(WindowVisibilityType visibility) {
- NotImplemented();
+ if (visibility == WindowVisibilityType::Hide) {
+ if (sdl_window_) {
+ CheckSdlReturn(SDL_HideWindow(*sdl_window_));
+ }
+ } else if (visibility == WindowVisibilityType::Minimize) {
+ if (!sdl_window_) {
+ DoCreateWindow();
+ }
+ CheckSdlReturn(SDL_MinimizeWindow(*sdl_window_));
+ } else {
+ if (!sdl_window_) {
+ DoCreateWindow();
+ }
+ CheckSdlReturn(SDL_ShowWindow(*sdl_window_));
+ }
}
Size SdlWindow::GetClientSize() { return GetClientRect().GetSize(); }
@@ -72,8 +113,7 @@ Rect SdlWindow::GetClientRect() {
void SdlWindow::SetClientRect(const Rect& rect) {
client_rect_ = rect;
if (sdl_window_) {
- CheckSdlReturn(SDL_SetWindowPosition(*sdl_window_, rect.left, rect.top));
- CheckSdlReturn(SDL_SetWindowSize(*sdl_window_, rect.width, rect.height));
+ DoUpdateClientRect();
}
}
@@ -150,4 +190,36 @@ Thickness SdlWindow::GetBorderThickness() {
static_cast<float>(right), static_cast<float>(bottom)};
}
+void SdlWindow::DoCreateWindow() { NotImplemented(); }
+
+void SdlWindow::DoUpdateClientRect() {
+ assert(sdl_window_);
+ CheckSdlReturn(
+ SDL_SetWindowPosition(*sdl_window_, client_rect_.left, client_rect_.top));
+ CheckSdlReturn(
+ SDL_SetWindowSize(*sdl_window_, client_rect_.width, client_rect_.height));
+ CheckSdlReturn(SDL_SyncWindow(*sdl_window_));
+}
+
+void SdlWindow::DoUpdateParent() {
+ assert(sdl_window_);
+ CheckSdlReturn(SDL_SetWindowParent(
+ *sdl_window_,
+ parent_ == nullptr ? nullptr : parent_->sdl_window_.value_or(nullptr)));
+ CheckSdlReturn(SDL_SyncWindow(*sdl_window_));
+}
+
+void SdlWindow::DoUpdateStyleFlag() {
+ assert(sdl_window_);
+ CheckSdlReturn(SDL_SetWindowBordered(
+ *sdl_window_, !style_.Has(WindowStyleFlags::NoCaptionAndBorder)));
+ CheckSdlReturn(SDL_SyncWindow(*sdl_window_));
+}
+
+void SdlWindow::DoUpdateTitle() {
+ assert(sdl_window_);
+ CheckSdlReturn(SDL_SetWindowTitle(*sdl_window_, title_.c_str()));
+ CheckSdlReturn(SDL_SyncWindow(*sdl_window_));
+}
+
} // namespace cru::platform::gui::sdl