diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/platform/gui/xcb/CMakeLists.txt | 3 | ||||
-rw-r--r-- | src/platform/gui/xcb/Cursor.cpp | 38 | ||||
-rw-r--r-- | src/platform/gui/xcb/UiApplication.cpp | 7 |
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) { |