aboutsummaryrefslogtreecommitdiff
path: root/src/platform/gui
diff options
context:
space:
mode:
authorYuqian Yang <crupest@crupest.life>2025-09-10 01:30:59 +0800
committerYuqian Yang <crupest@crupest.life>2025-09-10 01:30:59 +0800
commitfe6e1686ce484cb0dd9a69f130e82f647c30016f (patch)
treef5e020e6a46d9a36a7952d1785cf20467e413159 /src/platform/gui
parent18e330f9f4a673da78e6503c697619ad99b4bdbf (diff)
downloadcru-fe6e1686ce484cb0dd9a69f130e82f647c30016f.tar.gz
cru-fe6e1686ce484cb0dd9a69f130e82f647c30016f.tar.bz2
cru-fe6e1686ce484cb0dd9a69f130e82f647c30016f.zip
xcb window reparent.
Diffstat (limited to 'src/platform/gui')
-rw-r--r--src/platform/gui/xcb/Window.cpp25
1 files changed, 24 insertions, 1 deletions
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<XcbWindow>(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<graphics::IPainter> XcbWindow::BeginPaint() {
assert(cairo_surface_);