aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--src/managers/input/InputManager.cpp19
-rw-r--r--src/managers/input/InputManager.hpp17
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;
};