summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorVaxry <vaxry@vaxry.net>2024-03-09 21:54:33 +0000
committerVaxry <vaxry@vaxry.net>2024-03-09 21:54:33 +0000
commit739c5bc98c6037101e5744827dd66e696a4e9ecd (patch)
tree744f2df98151a137af6d26b073d07c47f6ecfb1c /src
parent26cd1bf949d0460b754fe3b1ae7f06bd4b2535ee (diff)
cursormgr: fix invalid access to hyprcursor in xwayland init
fixes #5048
Diffstat (limited to 'src')
-rw-r--r--src/events/Misc.cpp6
-rw-r--r--src/managers/CursorManager.cpp16
-rw-r--r--src/managers/CursorManager.hpp2
3 files changed, 19 insertions, 5 deletions
diff --git a/src/events/Misc.cpp b/src/events/Misc.cpp
index d7e3a849..8d0a9710 100644
--- a/src/events/Misc.cpp
+++ b/src/events/Misc.cpp
@@ -70,11 +70,7 @@ void Events::listener_readyXWayland(wl_listener* listener, void* data) {
wlr_xwayland_set_seat(g_pXWaylandManager->m_sWLRXWayland, g_pCompositor->m_sSeat.seat);
- const auto CURSOR = g_pCursorManager->dataFor("left_ptr");
- if (CURSOR.surface) {
- wlr_xwayland_set_cursor(g_pXWaylandManager->m_sWLRXWayland, cairo_image_surface_get_data(CURSOR.surface), cairo_image_surface_get_stride(CURSOR.surface), CURSOR.size,
- CURSOR.size, CURSOR.hotspotX, CURSOR.hotspotY);
- }
+ g_pCursorManager->setXWaylandCursor(g_pXWaylandManager->m_sWLRXWayland);
const auto ROOT = xcb_setup_roots_iterator(xcb_get_setup(XCBCONNECTION)).data->root;
auto cookie = xcb_get_property(XCBCONNECTION, 0, ROOT, HYPRATOMS["_NET_SUPPORTING_WM_CHECK"], XCB_ATOM_ANY, 0, 2048);
diff --git a/src/managers/CursorManager.cpp b/src/managers/CursorManager.cpp
index ff644010..2467b593 100644
--- a/src/managers/CursorManager.cpp
+++ b/src/managers/CursorManager.cpp
@@ -167,6 +167,10 @@ void CCursorManager::tickAnimatedCursor() {
}
SCursorImageData CCursorManager::dataFor(const std::string& name) {
+
+ if (!m_pHyprcursor->valid())
+ return {};
+
const auto IMAGES = m_pHyprcursor->getShape(name.c_str(), m_sCurrentStyleInfo);
if (IMAGES.images.empty())
@@ -175,6 +179,18 @@ SCursorImageData CCursorManager::dataFor(const std::string& name) {
return IMAGES.images[0];
}
+void CCursorManager::setXWaylandCursor(wlr_xwayland* xwayland) {
+ const auto CURSOR = dataFor("left_ptr");
+ if (CURSOR.surface) {
+ wlr_xwayland_set_cursor(xwayland, cairo_image_surface_get_data(CURSOR.surface), cairo_image_surface_get_stride(CURSOR.surface), CURSOR.size, CURSOR.size, CURSOR.hotspotX,
+ CURSOR.hotspotY);
+ } else if (const auto XCURSOR = wlr_xcursor_manager_get_xcursor(m_pWLRXCursorMgr, "left_ptr", 1); XCURSOR) {
+ wlr_xwayland_set_cursor(xwayland, XCURSOR->images[0]->buffer, XCURSOR->images[0]->width * 4, XCURSOR->images[0]->width, XCURSOR->images[0]->height,
+ XCURSOR->images[0]->hotspot_x, XCURSOR->images[0]->hotspot_y);
+ } else
+ Debug::log(ERR, "CursorManager: no valid cursor for xwayland");
+}
+
void CCursorManager::updateTheme() {
float highestScale = 1.0;
diff --git a/src/managers/CursorManager.hpp b/src/managers/CursorManager.hpp
index b1c49b31..0e8d99bc 100644
--- a/src/managers/CursorManager.hpp
+++ b/src/managers/CursorManager.hpp
@@ -8,6 +8,7 @@
struct wlr_buffer;
struct wlr_xcursor_manager;
+struct wlr_xwayland;
class CCursorManager {
public:
@@ -21,6 +22,7 @@ class CCursorManager {
void changeTheme(const std::string& name, const int size);
void updateTheme();
SCursorImageData dataFor(const std::string& name); // for xwayland
+ void setXWaylandCursor(wlr_xwayland* xwayland);
void tickAnimatedCursor();