aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/platform/gui/xcb/CMakeLists.txt3
-rw-r--r--src/platform/gui/xcb/Cursor.cpp38
-rw-r--r--src/platform/gui/xcb/UiApplication.cpp7
3 files changed, 44 insertions, 4 deletions
diff --git a/src/platform/gui/xcb/CMakeLists.txt b/src/platform/gui/xcb/CMakeLists.txt
index 15bf1a79..fa5cc0bf 100644
--- a/src/platform/gui/xcb/CMakeLists.txt
+++ b/src/platform/gui/xcb/CMakeLists.txt
@@ -1,5 +1,6 @@
find_library(LIBRARY_CAIRO cairo REQUIRED)
find_library(LIBRARY_XCB xcb REQUIRED)
+find_library(LIBRARY_XCB_CURSOR xcb-cursor REQUIRED)
add_library(CruPlatformGuiXcb
Cursor.cpp
Keyboard.cpp
@@ -8,5 +9,5 @@ add_library(CruPlatformGuiXcb
)
target_link_libraries(CruPlatformGuiXcb PUBLIC
CruPlatformGui CruPlatformGraphicsCairo
- ${LIBRARY_XCB} ${LIBRARY_CAIRO}
+ ${LIBRARY_XCB} ${LIBRARY_XCB_CURSOR} ${LIBRARY_CAIRO}
)
diff --git a/src/platform/gui/xcb/Cursor.cpp b/src/platform/gui/xcb/Cursor.cpp
index 7bc73f6d..5582c6a6 100644
--- a/src/platform/gui/xcb/Cursor.cpp
+++ b/src/platform/gui/xcb/Cursor.cpp
@@ -1,12 +1,13 @@
#include "cru/platform/gui/xcb/Cursor.h"
-#include "cru/base/Base.h"
+#include "cru/base/Exception.h"
+#include "cru/platform/gui/Cursor.h"
#include "cru/platform/gui/xcb/UiApplication.h"
#include <xcb/xcb.h>
+#include <xcb/xcb_cursor.h>
+#include <memory>
namespace cru::platform::gui::xcb {
-XcbCursor* XcbCursor::LoadXCursor(io::Stream* stream) { NotImplemented(); }
-
XcbCursor::XcbCursor(XcbUiApplication* application, xcb_cursor_t cursor,
bool auto_free)
: application_(application), cursor_(cursor), auto_free_(auto_free) {}
@@ -19,4 +20,35 @@ XcbCursor::~XcbCursor() {
xcb_cursor_t XcbCursor::GetXcbCursor() { return cursor_; }
+XcbCursorManager::XcbCursorManager(XcbUiApplication* application)
+ : application_(application) {
+ auto code = xcb_cursor_context_new(application->GetXcbConnection(),
+ application->GetFirstXcbScreen(),
+ &xcb_cursor_context_);
+ if (code != 0) {
+ throw PlatformException("Failed to call xcb_cursor_context_new.");
+ }
+
+ cursors_[SystemCursorType::Arrow] =
+ std::make_shared<XcbCursor>(application_, XCB_CURSOR_NONE, false);
+ cursors_[SystemCursorType::Hand] = LoadXCursor("pointer");
+ cursors_[SystemCursorType::IBeam] = LoadXCursor("ibeam");
+}
+
+XcbCursorManager::~XcbCursorManager() {
+ xcb_cursor_context_free(xcb_cursor_context_);
+}
+
+std::shared_ptr<ICursor> XcbCursorManager::GetSystemCursor(
+ SystemCursorType type) {
+ return cursors_[type];
+}
+
+std::shared_ptr<XcbCursor> XcbCursorManager::LoadXCursor(
+ std::string_view name) {
+ return std::make_shared<XcbCursor>(
+ application_, xcb_cursor_load_cursor(xcb_cursor_context_, name.data()),
+ true);
+}
+
} // namespace cru::platform::gui::xcb
diff --git a/src/platform/gui/xcb/UiApplication.cpp b/src/platform/gui/xcb/UiApplication.cpp
index 74b20bd7..b95e669a 100644
--- a/src/platform/gui/xcb/UiApplication.cpp
+++ b/src/platform/gui/xcb/UiApplication.cpp
@@ -2,6 +2,7 @@
#include "cru/platform/graphics/cairo/CairoGraphicsFactory.h"
#include "cru/platform/gui/Window.h"
+#include "cru/platform/gui/xcb/Cursor.h"
#include "cru/platform/gui/xcb/Window.h"
#include <poll.h>
@@ -30,9 +31,13 @@ XcbUiApplication::XcbUiApplication(
const xcb_setup_t *setup = xcb_get_setup(connection);
xcb_screen_iterator_t iter = xcb_setup_roots_iterator(setup);
this->screen_ = iter.data;
+
+ cursor_manager_ = new XcbCursorManager(this);
}
XcbUiApplication::~XcbUiApplication() {
+ delete cursor_manager_;
+
xcb_disconnect(this->xcb_connection_);
if (release_cairo_factory_) {
delete cairo_factory_;
@@ -137,6 +142,8 @@ XcbUiApplication::GetGraphicsFactory() {
return cairo_factory_;
}
+ICursorManager *XcbUiApplication::GetCursorManager() { return cursor_manager_; }
+
IMenu *XcbUiApplication::GetApplicationMenu() { return nullptr; }
void XcbUiApplication::RegisterWindow(XcbWindow *window) {