From 7c135df9b8057e1de3ea6a73fb785d5622b519d4 Mon Sep 17 00:00:00 2001 From: Yuqian Yang Date: Thu, 11 Sep 2025 23:25:49 +0800 Subject: xcb window title. --- include/cru/platform/gui/xcb/UiApplication.h | 1 + include/cru/platform/gui/xcb/Window.h | 6 ++++-- src/platform/gui/xcb/UiApplication.cpp | 4 ++++ src/platform/gui/xcb/Window.cpp | 18 ++++++++++++++++++ 4 files changed, 27 insertions(+), 2 deletions(-) diff --git a/include/cru/platform/gui/xcb/UiApplication.h b/include/cru/platform/gui/xcb/UiApplication.h index 87fd1063..cc38b3ed 100644 --- a/include/cru/platform/gui/xcb/UiApplication.h +++ b/include/cru/platform/gui/xcb/UiApplication.h @@ -31,6 +31,7 @@ class XcbUiApplication : public XcbResource, public virtual IUiApplication { xcb_screen_t* GetFirstXcbScreen(); xcb_atom_t GetOrCreateXcbAtom(std::string name); + xcb_atom_t GetXcbAtom_NET_WM_NAME(); xcb_atom_t GetXcbAtom_NET_WM_WINDOW_TYPE(); xcb_atom_t GetXcbAtom_NET_WM_WINDOW_TYPE_NORMAL(); xcb_atom_t GetXcbAtom_NET_WM_WINDOW_TYPE_UTILITY(); diff --git a/include/cru/platform/gui/xcb/Window.h b/include/cru/platform/gui/xcb/Window.h index 43cd3b53..f118ed66 100644 --- a/include/cru/platform/gui/xcb/Window.h +++ b/include/cru/platform/gui/xcb/Window.h @@ -26,8 +26,8 @@ class XcbWindow : public XcbResource, public virtual INativeWindow { WindowStyleFlag GetStyleFlag() override; void SetStyleFlag(WindowStyleFlag flag) override; - virtual String GetTitle() = 0; - virtual void SetTitle(String title) = 0; + String GetTitle() override; + void SetTitle(String title) override; virtual WindowVisibilityType GetVisibility() = 0; virtual void SetVisibility(WindowVisibilityType visibility) = 0; @@ -90,6 +90,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); private: XcbUiApplication* application_; @@ -97,6 +98,7 @@ class XcbWindow : public XcbResource, public virtual INativeWindow { cairo_surface_t* cairo_surface_; Size current_size_; WindowStyleFlag style_; + std::string title_; XcbWindow* parent_; diff --git a/src/platform/gui/xcb/UiApplication.cpp b/src/platform/gui/xcb/UiApplication.cpp index 2fceac30..e5cab19f 100644 --- a/src/platform/gui/xcb/UiApplication.cpp +++ b/src/platform/gui/xcb/UiApplication.cpp @@ -63,6 +63,10 @@ xcb_atom_t XcbUiApplication::GetOrCreateXcbAtom(std::string name) { return atom; } +xcb_atom_t XcbUiApplication::GetXcbAtom_NET_WM_NAME() { + return GetOrCreateXcbAtom("_NET_WM_NAME"); +} + xcb_atom_t XcbUiApplication::GetXcbAtom_NET_WM_WINDOW_TYPE() { return GetOrCreateXcbAtom("_NET_WM_WINDOW_TYPE"); } diff --git a/src/platform/gui/xcb/Window.cpp b/src/platform/gui/xcb/Window.cpp index 9b72789b..b56b8fa9 100644 --- a/src/platform/gui/xcb/Window.cpp +++ b/src/platform/gui/xcb/Window.cpp @@ -89,6 +89,15 @@ void XcbWindow::SetStyleFlag(WindowStyleFlag flag) { } } +String XcbWindow::GetTitle() { return String::FromUtf8(title_); } + +void XcbWindow::SetTitle(String title) { + title_ = title.ToUtf8(); + if (xcb_window_) { + DoSetTitle(*xcb_window_); + } +} + std::unique_ptr XcbWindow::BeginPaint() { assert(cairo_surface_); @@ -392,4 +401,13 @@ void XcbWindow::DoSetStyleFlags(xcb_window_t window) { XCB_ATOM_ATOM, 32, atoms.size(), atoms.data()); } +void XcbWindow::DoSetTitle(xcb_window_t window) { + for (auto atom : {static_cast(XCB_ATOM_WM_NAME), + application_->GetXcbAtom_NET_WM_NAME()}) { + xcb_change_property(application_->GetXcbConnection(), XCB_PROP_MODE_REPLACE, + window, atom, XCB_ATOM_STRING, 8, title_.size(), + title_.data()); + } +} + } // namespace cru::platform::gui::xcb -- cgit v1.2.3