aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--include/cru/platform/gui/xcb/Window.h9
-rw-r--r--src/platform/gui/xcb/Window.cpp35
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<graphics::IPainter> 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<std::uint32_t>(rect.left),
+ static_cast<std::uint32_t>(rect.top),
+ static_cast<std::uint32_t>(rect.width),
+ static_cast<std::uint32_t>(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,