diff options
author | Yuqian Yang <crupest@crupest.life> | 2025-09-25 01:27:40 +0800 |
---|---|---|
committer | Yuqian Yang <crupest@crupest.life> | 2025-09-25 01:27:40 +0800 |
commit | 57763bb30b86737810bdd8458ba62b378481b994 (patch) | |
tree | 3c19fdac772054514b75bde8b5c04e7ce30f6612 | |
parent | 62aabb7b6dbae4129b36393c0c222f6971e423e2 (diff) | |
download | cru-57763bb30b86737810bdd8458ba62b378481b994.tar.gz cru-57763bb30b86737810bdd8458ba62b378481b994.tar.bz2 cru-57763bb30b86737810bdd8458ba62b378481b994.zip |
Impl xcb window set cursor.
-rw-r--r-- | include/cru/platform/gui/xcb/Window.h | 3 | ||||
-rw-r--r-- | src/platform/gui/xcb/Window.cpp | 21 |
2 files changed, 22 insertions, 2 deletions
diff --git a/include/cru/platform/gui/xcb/Window.h b/include/cru/platform/gui/xcb/Window.h index aa1b4fab..61e4b616 100644 --- a/include/cru/platform/gui/xcb/Window.h +++ b/include/cru/platform/gui/xcb/Window.h @@ -11,6 +11,7 @@ namespace cru::platform::gui::xcb { class XcbUiApplication; +class XcbCursor; class XcbWindow : public XcbResource, public virtual INativeWindow { friend XcbUiApplication; @@ -88,6 +89,7 @@ class XcbWindow : public XcbResource, public virtual INativeWindow { void DoSetStyleFlags(xcb_window_t window); void DoSetTitle(xcb_window_t window); void DoSetClientRect(xcb_window_t window, const Rect& rect); + void DoSetCursor(xcb_window_t window, XcbCursor* cursor); void* XcbGetProperty(xcb_window_t window, xcb_atom_t property, xcb_atom_t type, std::uint32_t offset, @@ -107,6 +109,7 @@ class XcbWindow : public XcbResource, public virtual INativeWindow { WindowStyleFlag style_; std::string title_; bool mapped_; + std::shared_ptr<XcbCursor> cursor_; XcbWindow* parent_; diff --git a/src/platform/gui/xcb/Window.cpp b/src/platform/gui/xcb/Window.cpp index 863738f1..4de7a6d3 100644 --- a/src/platform/gui/xcb/Window.cpp +++ b/src/platform/gui/xcb/Window.cpp @@ -3,11 +3,13 @@ #include "cru/base/Guard.h" #include "cru/platform/Check.h" #include "cru/platform/GraphicsBase.h" +#include "cru/platform/graphics/NullPainter.h" #include "cru/platform/graphics/Painter.h" #include "cru/platform/graphics/cairo/CairoPainter.h" #include "cru/platform/gui/Base.h" #include "cru/platform/gui/Keyboard.h" #include "cru/platform/gui/Window.h" +#include "cru/platform/gui/xcb/Cursor.h" #include "cru/platform/gui/xcb/Keyboard.h" #include "cru/platform/gui/xcb/UiApplication.h" @@ -274,7 +276,12 @@ bool XcbWindow::ReleaseMouse() { return true; } -void XcbWindow::SetCursor(std::shared_ptr<ICursor> cursor) { NotImplemented(); } +void XcbWindow::SetCursor(std::shared_ptr<ICursor> cursor) { + if (!xcb_window_) return; + auto xcb_cursor = CheckPlatform<XcbCursor>(cursor, GetPlatformId()); + cursor_ = xcb_cursor; + DoSetCursor(*xcb_window_, xcb_cursor.get()); +} void XcbWindow::SetToForeground() { SetVisibility(WindowVisibilityType::Show); @@ -291,7 +298,9 @@ void XcbWindow::RequestRepaint() { } std::unique_ptr<graphics::IPainter> XcbWindow::BeginPaint() { - assert(cairo_surface_); + if (!xcb_window_.has_value()) { + return std::make_unique<graphics::NullPainter>(); + } auto factory = application_->GetCairoFactory(); cairo_t *cairo = cairo_create(cairo_surface_); @@ -377,6 +386,7 @@ xcb_window_t XcbWindow::DoCreateWindow() { DoSetStyleFlags(window); DoSetParent(window); + DoSetCursor(window, cursor_.get()); xcb_visualtype_t *visual_type; @@ -654,6 +664,13 @@ void XcbWindow::DoSetClientRect(xcb_window_t window, const Rect &rect) { values); } +void XcbWindow::DoSetCursor(xcb_window_t window, XcbCursor *cursor) { + std::uint32_t values[]{cursor ? cursor->GetXcbCursor() : XCB_CURSOR_NONE}; + xcb_change_window_attributes(application_->GetXcbConnection(), window, + XCB_CW_CURSOR, values); + application_->XcbFlush(); +} + void *XcbWindow::XcbGetProperty(xcb_window_t window, xcb_atom_t property, xcb_atom_t type, std::uint32_t offset, std::uint32_t length, |