From 06cded30294ac02a78ede7083eaf769c772a0ed1 Mon Sep 17 00:00:00 2001 From: Yuqian Yang Date: Thu, 27 Nov 2025 20:44:30 +0800 Subject: Impl title,parent,style flag of native window on sdl. --- src/platform/gui/sdl/Window.cpp | 88 +++++++++++++++++++++++++++++++++++++---- 1 file changed, 80 insertions(+), 8 deletions(-) (limited to 'src/platform/gui/sdl/Window.cpp') 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(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(right), static_cast(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 -- cgit v1.2.3