diff options
| author | Yuqian Yang <crupest@crupest.life> | 2025-12-06 20:06:10 +0800 |
|---|---|---|
| committer | Yuqian Yang <crupest@crupest.life> | 2025-12-07 19:52:05 +0800 |
| commit | 4a30bf58a48ed6f31f4c53473e8de70a8cd819da (patch) | |
| tree | 32aab619013cbe2d0557a212832ba24833d2cc36 /src/platform/gui/sdl/Window.cpp | |
| parent | 9a87e5cf786f3e8fddc933136d210edd4ef72c89 (diff) | |
| download | cru-4a30bf58a48ed6f31f4c53473e8de70a8cd819da.tar.gz cru-4a30bf58a48ed6f31f4c53473e8de70a8cd819da.tar.bz2 cru-4a30bf58a48ed6f31f4c53473e8de70a8cd819da.zip | |
Fix SDL popup window.
Diffstat (limited to 'src/platform/gui/sdl/Window.cpp')
| -rw-r--r-- | src/platform/gui/sdl/Window.cpp | 48 |
1 files changed, 39 insertions, 9 deletions
diff --git a/src/platform/gui/sdl/Window.cpp b/src/platform/gui/sdl/Window.cpp index e5de9310..d301efa9 100644 --- a/src/platform/gui/sdl/Window.cpp +++ b/src/platform/gui/sdl/Window.cpp @@ -1,5 +1,5 @@ #include "cru/platform/gui/sdl/Window.h" -#include "cru/base/Base.h" +#include "cru/base/log/Logger.h" #include "cru/platform/Base.h" #include "cru/platform/GraphicsBase.h" #include "cru/platform/graphics/NullPainter.h" @@ -21,9 +21,16 @@ namespace cru::platform::gui::sdl { +namespace { +bool IsWayland() { + return SDL_GetCurrentVideoDriver() == std::string_view("wayland"); +} +} // namespace + SdlWindow::SdlWindow(SdlUiApplication* application) : application_(application), sdl_window_(nullptr), + sdl_is_popup_(false), sdl_window_id_(0), client_rect_(100, 100, 400, 200), parent_(nullptr) { @@ -237,12 +244,22 @@ void SdlWindow::DoCreateWindow() { flags |= SDL_WINDOW_OPENGL; #endif - if (style_.Has(WindowStyleFlags::NoCaptionAndBorder)) { + auto no_border = style_.Has(WindowStyleFlags::NoCaptionAndBorder); + if (no_border) { flags |= SDL_WINDOW_BORDERLESS; } - sdl_window_ = SDL_CreateWindow(title_.c_str(), client_rect_.width, - client_rect_.height, flags); + if (no_border && parent_ && parent_->sdl_window_) { + flags |= SDL_WINDOW_POPUP_MENU; + sdl_window_ = SDL_CreatePopupWindow(parent_->sdl_window_, client_rect_.left, + client_rect_.top, client_rect_.width, + client_rect_.height, flags); + sdl_is_popup_ = true; + } else { + sdl_window_ = SDL_CreateWindow(title_.c_str(), client_rect_.width, + client_rect_.height, flags); + sdl_is_popup_ = false; + } if (!sdl_window_) { throw SdlException("Failed to create window."); @@ -255,10 +272,16 @@ void SdlWindow::DoCreateWindow() { CreateEvent_.Raise(nullptr); - CheckSdlReturn( - SDL_SetWindowPosition(sdl_window_, client_rect_.left, client_rect_.top)); + if (!IsWayland() || sdl_is_popup_) { + CheckSdlReturn(SDL_SetWindowPosition(sdl_window_, client_rect_.left, + client_rect_.top)); + } + + if (!IsWayland() || !sdl_is_popup_) { + CheckSdlReturn(SDL_SetWindowParent( + sdl_window_, parent_ == nullptr ? nullptr : parent_->sdl_window_)); + } - DoUpdateParent(); DoUpdateCursor(); #ifdef __unix @@ -270,8 +293,15 @@ void SdlWindow::DoCreateWindow() { void SdlWindow::DoUpdateClientRect() { assert(sdl_window_); - CheckSdlReturn( - SDL_SetWindowPosition(sdl_window_, client_rect_.left, client_rect_.top)); + + if (!IsWayland() || sdl_is_popup_) { + CheckSdlReturn(SDL_SetWindowPosition(sdl_window_, client_rect_.left, + client_rect_.top)); + } else { + CruLogWarn(kLogTag, + "Wayland doesn't support set position of non-popup window."); + } + CheckSdlReturn( SDL_SetWindowSize(sdl_window_, client_rect_.width, client_rect_.height)); CheckSdlReturn(SDL_SyncWindow(sdl_window_)); |
