diff options
-rw-r--r-- | src/managers/input/InputManager.cpp | 19 | ||||
-rw-r--r-- | src/managers/input/InputManager.hpp | 17 |
2 files changed, 33 insertions, 3 deletions
diff --git a/src/managers/input/InputManager.cpp b/src/managers/input/InputManager.cpp index 70b42be3..e712f4af 100644 --- a/src/managers/input/InputManager.cpp +++ b/src/managers/input/InputManager.cpp @@ -308,6 +308,16 @@ void CInputManager::mouseMoveUnified(uint32_t time, bool refocus) { setCursorIconOnBorder(pFoundWindow); } + // if we're on an input deco, reset cursor + if (!VECINRECT(m_vLastCursorPosFloored, pFoundWindow->m_vRealPosition.vec().x, pFoundWindow->m_vRealPosition.vec().y, + pFoundWindow->m_vRealPosition.vec().x + pFoundWindow->m_vRealSize.vec().x, pFoundWindow->m_vRealPosition.vec().y + pFoundWindow->m_vRealSize.vec().y)) { + wlr_xcursor_manager_set_cursor_image(g_pCompositor->m_sWLRXCursorMgr, "left_ptr", g_pCompositor->m_sWLRCursor); + cursorSurfaceInfo.bUsed = false; + } else if (!cursorSurfaceInfo.bUsed) { + cursorSurfaceInfo.bUsed = true; + wlr_cursor_set_surface(g_pCompositor->m_sWLRCursor, cursorSurfaceInfo.pSurface, cursorSurfaceInfo.vHotspot.x, cursorSurfaceInfo.vHotspot.y); + } + if (*PFOLLOWMOUSE != 1 && !refocus) { if (pFoundWindow != g_pCompositor->m_pLastWindow && g_pCompositor->m_pLastWindow && ((pFoundWindow->m_bIsFloating && *PFLOATBEHAVIOR == 2) || (g_pCompositor->m_pLastWindow->m_bIsFloating != pFoundWindow->m_bIsFloating && *PFLOATBEHAVIOR != 0))) { @@ -400,6 +410,15 @@ void CInputManager::processMouseRequest(wlr_seat_pointer_request_set_cursor_even return; } + cursorSurfaceInfo.pSurface = e->surface; + + if (e->surface) { + hyprListener_CursorSurfaceDestroy.removeCallback(); + hyprListener_CursorSurfaceDestroy.initCallback( + &e->surface->events.destroy, [&](void* owner, void* data) { cursorSurfaceInfo.pSurface = nullptr; }, this, "InputManager"); + cursorSurfaceInfo.vHotspot = {e->hotspot_x, e->hotspot_y}; + } + if (e->seat_client == g_pCompositor->m_sSeat.seat->pointer_state.focused_client) wlr_cursor_set_surface(g_pCompositor->m_sWLRCursor, e->surface, e->hotspot_x, e->hotspot_y); } diff --git a/src/managers/input/InputManager.hpp b/src/managers/input/InputManager.hpp index af31118c..797dea92 100644 --- a/src/managers/input/InputManager.hpp +++ b/src/managers/input/InputManager.hpp @@ -7,18 +7,21 @@ #include "../../helpers/Timer.hpp" #include "InputMethodRelay.hpp" -enum eClickBehaviorMode { +enum eClickBehaviorMode +{ CLICKMODE_DEFAULT = 0, CLICKMODE_KILL }; -enum eMouseBindMode { +enum eMouseBindMode +{ MBIND_INVALID = -1, MBIND_MOVE = 0, MBIND_RESIZE }; -enum eBorderIconDirection { +enum eBorderIconDirection +{ BORDERICON_NONE, BORDERICON_UP, BORDERICON_DOWN, @@ -210,6 +213,14 @@ class CInputManager { void setBorderCursorIcon(eBorderIconDirection); void setCursorIconOnBorder(CWindow* w); + // cursor surface + struct cursorSI { + wlr_surface* pSurface = nullptr; + Vector2D vHotspot; + bool bUsed = false; + } cursorSurfaceInfo; + DYNLISTENER(CursorSurfaceDestroy); + friend class CKeybindManager; }; |