From 8bde78e1a008ba5ba95ea54ff03717baf53d4170 Mon Sep 17 00:00:00 2001 From: Yuqian Yang Date: Mon, 22 Sep 2025 14:58:02 +0800 Subject: Impl client rect of xcb window. --- include/cru/platform/gui/xcb/Window.h | 9 +++++---- src/platform/gui/xcb/Window.cpp | 35 +++++++++++++++++++++++++++++++++++ 2 files changed, 40 insertions(+), 4 deletions(-) diff --git a/include/cru/platform/gui/xcb/Window.h b/include/cru/platform/gui/xcb/Window.h index 6d923666..927c3db9 100644 --- a/include/cru/platform/gui/xcb/Window.h +++ b/include/cru/platform/gui/xcb/Window.h @@ -32,11 +32,11 @@ class XcbWindow : public XcbResource, public virtual INativeWindow { WindowVisibilityType GetVisibility() override; void SetVisibility(WindowVisibilityType visibility) override; - virtual Size GetClientSize() = 0; - virtual void SetClientSize(const Size& size) = 0; + Size GetClientSize() override; + void SetClientSize(const Size& size) override; - virtual Rect GetClientRect() = 0; - virtual void SetClientRect(const Rect& rect) = 0; + Rect GetClientRect() override; + void SetClientRect(const Rect& rect) override; // Get the rect of the window containing frame. // The lefttop of the rect is relative to screen lefttop. @@ -91,6 +91,7 @@ class XcbWindow : public XcbResource, public virtual INativeWindow { void DoSetParent(xcb_window_t window); void DoSetStyleFlags(xcb_window_t window); void DoSetTitle(xcb_window_t window); + void DoSetClientRect(xcb_window_t window, const Rect& rect); void* XcbGetProperty(xcb_window_t window, xcb_atom_t property, xcb_atom_t type, std::uint32_t offset, diff --git a/src/platform/gui/xcb/Window.cpp b/src/platform/gui/xcb/Window.cpp index 188f62b8..1dbef489 100644 --- a/src/platform/gui/xcb/Window.cpp +++ b/src/platform/gui/xcb/Window.cpp @@ -177,6 +177,30 @@ void XcbWindow::SetVisibility(WindowVisibilityType visibility) { } } +Size XcbWindow::GetClientSize() { return GetClientRect().GetSize(); } + +void XcbWindow::SetClientSize(const Size &size) { + auto rect = GetClientRect(); + SetClientRect(Rect(rect.GetLeftTop(), size)); +} + +Rect XcbWindow::GetClientRect() { + if (!xcb_window_) { + return Rect{}; + } + auto cookie = + xcb_get_geometry(application_->GetXcbConnection(), *xcb_window_); + auto reply = + xcb_get_geometry_reply(application_->GetXcbConnection(), cookie, nullptr); + return Rect(reply->x + reply->border_width, reply->y + reply->border_width, + reply->width, reply->height); +} + +void XcbWindow::SetClientRect(const Rect &rect) { + if (!xcb_window_) return; + DoSetClientRect(*xcb_window_, rect); +} + std::unique_ptr XcbWindow::BeginPaint() { assert(cairo_surface_); @@ -493,6 +517,17 @@ void XcbWindow::DoSetTitle(xcb_window_t window) { } } +void XcbWindow::DoSetClientRect(xcb_window_t window, const Rect &rect) { + std::uint32_t values[4]{static_cast(rect.left), + static_cast(rect.top), + static_cast(rect.width), + static_cast(rect.height)}; + xcb_configure_window(application_->GetXcbConnection(), window, + XCB_CONFIG_WINDOW_X | XCB_CONFIG_WINDOW_Y | + XCB_CONFIG_WINDOW_WIDTH | XCB_CONFIG_WINDOW_HEIGHT, + values); +} + void *XcbWindow::XcbGetProperty(xcb_window_t window, xcb_atom_t property, xcb_atom_t type, std::uint32_t offset, std::uint32_t length, -- cgit v1.2.3