aboutsummaryrefslogtreecommitdiff
path: root/include/cru
diff options
context:
space:
mode:
authorYuqian Yang <crupest@crupest.life>2025-09-23 22:37:42 +0800
committerYuqian Yang <crupest@crupest.life>2025-09-23 22:37:42 +0800
commit9c7d93cdb85ccc89f0804b4f280eac099c4476c6 (patch)
tree7ce2dd98c2c61e4da09a6bf750b5f8fd56f929fe /include/cru
parent9737b7966c0b061ee80235d1c7c460efc0610894 (diff)
downloadcru-9c7d93cdb85ccc89f0804b4f280eac099c4476c6.tar.gz
cru-9c7d93cdb85ccc89f0804b4f280eac099c4476c6.tar.bz2
cru-9c7d93cdb85ccc89f0804b4f280eac099c4476c6.zip
Impl xcb cursor manager.
Diffstat (limited to 'include/cru')
-rw-r--r--include/cru/platform/gui/xcb/Cursor.h25
-rw-r--r--include/cru/platform/gui/xcb/UiApplication.h5
2 files changed, 22 insertions, 8 deletions
diff --git a/include/cru/platform/gui/xcb/Cursor.h b/include/cru/platform/gui/xcb/Cursor.h
index d51c33c1..02ede7dd 100644
--- a/include/cru/platform/gui/xcb/Cursor.h
+++ b/include/cru/platform/gui/xcb/Cursor.h
@@ -5,17 +5,16 @@
#include "Base.h"
#include <xcb/xcb.h>
+#include <xcb/xcb_cursor.h>
+#include <memory>
+#include <string_view>
+#include <unordered_map>
namespace cru::platform::gui::xcb {
class XcbUiApplication;
+
class XcbCursor : public XcbResource, public virtual ICursor {
public:
- /**
- * Specification at
- * https://www.x.org/archive/X11R7.7/doc/man/man3/Xcursor.3.xhtml.
- */
- static XcbCursor* LoadXCursor(io::Stream* stream);
-
XcbCursor(XcbUiApplication* application, xcb_cursor_t cursor, bool auto_free);
~XcbCursor() override;
@@ -28,6 +27,18 @@ class XcbCursor : public XcbResource, public virtual ICursor {
};
class XcbCursorManager : public XcbResource, public virtual ICursorManager {
- virtual std::shared_ptr<ICursor> GetSystemCursor(SystemCursorType type) = 0;
+ public:
+ explicit XcbCursorManager(XcbUiApplication* application);
+ ~XcbCursorManager() override;
+
+ std::shared_ptr<ICursor> GetSystemCursor(SystemCursorType type) override;
+
+ private:
+ std::shared_ptr<XcbCursor> LoadXCursor(std::string_view name);
+
+ private:
+ XcbUiApplication* application_;
+ xcb_cursor_context_t* xcb_cursor_context_;
+ std::unordered_map<SystemCursorType, std::shared_ptr<XcbCursor>> cursors_;
};
} // namespace cru::platform::gui::xcb
diff --git a/include/cru/platform/gui/xcb/UiApplication.h b/include/cru/platform/gui/xcb/UiApplication.h
index 4fa4ec8d..80995179 100644
--- a/include/cru/platform/gui/xcb/UiApplication.h
+++ b/include/cru/platform/gui/xcb/UiApplication.h
@@ -12,6 +12,7 @@
namespace cru::platform::gui::xcb {
class XcbWindow;
+class XcbCursorManager;
class XcbUiApplication : public XcbResource, public virtual IUiApplication {
friend XcbWindow;
@@ -68,7 +69,7 @@ class XcbUiApplication : public XcbResource, public virtual IUiApplication {
cru::platform::graphics::IGraphicsFactory* GetGraphicsFactory() override;
- virtual ICursorManager* GetCursorManager() = 0;
+ ICursorManager* GetCursorManager() override;
virtual IClipboard* GetClipboard() = 0;
@@ -105,5 +106,7 @@ class XcbUiApplication : public XcbResource, public virtual IUiApplication {
bool is_quit_on_all_window_closed_;
std::vector<XcbWindow*> windows_;
+
+ XcbCursorManager* cursor_manager_;
};
} // namespace cru::platform::gui::xcb