From fe6e1686ce484cb0dd9a69f130e82f647c30016f Mon Sep 17 00:00:00 2001 From: Yuqian Yang Date: Wed, 10 Sep 2025 01:30:59 +0800 Subject: xcb window reparent. --- src/platform/gui/xcb/Window.cpp | 25 ++++++++++++++++++++++++- 1 file changed, 24 insertions(+), 1 deletion(-) (limited to 'src/platform/gui/xcb/Window.cpp') diff --git a/src/platform/gui/xcb/Window.cpp b/src/platform/gui/xcb/Window.cpp index 29c31527..9dd510e9 100644 --- a/src/platform/gui/xcb/Window.cpp +++ b/src/platform/gui/xcb/Window.cpp @@ -1,4 +1,5 @@ #include "cru/platform/gui/xcb/Window.h" +#include "cru/platform/Check.h" #include "cru/platform/graphics/Painter.h" #include "cru/platform/graphics/cairo/CairoPainter.h" #include "cru/platform/gui/Base.h" @@ -57,12 +58,34 @@ KeyModifier ConvertModifiers(uint32_t mask) { XcbWindow::XcbWindow(XcbUiApplication *application) : application_(application), xcb_window_(std::nullopt), - cairo_surface_(nullptr) { + cairo_surface_(nullptr), + parent_(nullptr) { application->RegisterWindow(this); } XcbWindow::~XcbWindow() { application_->UnregisterWindow(this); } +void XcbWindow::Close() { + if (xcb_window_) { + xcb_destroy_window(application_->GetXcbConnection(), *xcb_window_); + } +} + +INativeWindow *XcbWindow::GetParent() { return parent_; } + +void XcbWindow::SetParent(INativeWindow *parent) { + parent_ = CheckPlatform(parent, GetPlatformIdUtf8()); + if (xcb_window_) { + auto real_parent = application_->GetFirstXcbScreen()->root; + if (parent_ && parent_->xcb_window_) { + real_parent = *parent_->xcb_window_; + } + xcb_reparent_window(application_->GetXcbConnection(), *xcb_window_, + real_parent, 0, 0); + // TODO: Maybe restore position? + } +} + std::unique_ptr XcbWindow::BeginPaint() { assert(cairo_surface_); -- cgit v1.2.3