summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorvaxerski <vaxry@vaxry.net>2023-08-18 22:40:23 +0200
committervaxerski <vaxry@vaxry.net>2023-08-18 22:40:23 +0200
commit942ee943f5b0f3f9611b2ff5481dacf19aed6a17 (patch)
tree7948429ac0dab0295b21406b3d88352c5c8e829e /src
parent14f20a737221f09a601d846c2b37b969afe2e725 (diff)
input: unify constraint hint logic
Unifies the constraint hint logic. Previously, ignoring the stupid conditions, unscaled hints were mistaken with scaled coordinates.
Diffstat (limited to 'src')
-rw-r--r--src/events/Devices.cpp15
-rw-r--r--src/managers/input/InputManager.cpp48
-rw-r--r--src/managers/input/InputManager.hpp1
3 files changed, 26 insertions, 38 deletions
diff --git a/src/events/Devices.cpp b/src/events/Devices.cpp
index 4b8eeea8..7a836edd 100644
--- a/src/events/Devices.cpp
+++ b/src/events/Devices.cpp
@@ -122,19 +122,8 @@ void Events::listener_destroyConstraint(void* owner, void* data) {
const auto PWINDOW = g_pCompositor->getConstraintWindow(g_pCompositor->m_sSeat.mouse);
- if (PWINDOW && PCONSTRAINT->positionHint != Vector2D{-1, -1}) {
- if (PWINDOW->m_bIsX11) {
- wlr_cursor_warp(g_pCompositor->m_sWLRCursor, nullptr, PCONSTRAINT->positionHint.x + PWINDOW->m_uSurface.xwayland->x,
- PWINDOW->m_uSurface.xwayland->y + PCONSTRAINT->positionHint.y);
-
- wlr_seat_pointer_warp(PCONSTRAINT->constraint->seat, PCONSTRAINT->positionHint.x, PCONSTRAINT->positionHint.y);
- } else {
- wlr_cursor_warp(g_pCompositor->m_sWLRCursor, nullptr, PCONSTRAINT->positionHint.x + PWINDOW->m_vRealPosition.vec().x,
- PCONSTRAINT->positionHint.y + PWINDOW->m_vRealPosition.vec().y);
-
- wlr_seat_pointer_warp(PCONSTRAINT->constraint->seat, PCONSTRAINT->positionHint.x, PCONSTRAINT->positionHint.y);
- }
- }
+ if (PWINDOW && PCONSTRAINT->positionHint != Vector2D{-1, -1})
+ g_pInputManager->warpMouseToConstraintMiddle(PCONSTRAINT);
PCONSTRAINT->pMouse->currentConstraint = nullptr;
}
diff --git a/src/managers/input/InputManager.cpp b/src/managers/input/InputManager.cpp
index c4490f3c..bda2e5ee 100644
--- a/src/managers/input/InputManager.cpp
+++ b/src/managers/input/InputManager.cpp
@@ -1177,31 +1177,8 @@ void CInputManager::constrainMouse(SMouse* pMouse, wlr_pointer_constraint_v1* co
pMouse->hyprListener_commitConstraint.removeCallback();
if (pMouse->currentConstraint) {
- if (!constraint) {
- // warpe to hint
-
- if (constraint->current.committed & WLR_POINTER_CONSTRAINT_V1_STATE_CURSOR_HINT) {
- if (PWINDOW) {
- if (PWINDOW->m_bIsX11) {
- wlr_cursor_warp(g_pCompositor->m_sWLRCursor, nullptr, constraint->current.cursor_hint.x + PWINDOW->m_uSurface.xwayland->x,
- constraint->current.cursor_hint.y + PWINDOW->m_uSurface.xwayland->y);
-
- wlr_seat_pointer_warp(constraint->seat, constraint->current.cursor_hint.x, constraint->current.cursor_hint.y);
- } else {
- wlr_cursor_warp(g_pCompositor->m_sWLRCursor, nullptr, constraint->current.cursor_hint.x + PWINDOW->m_vRealPosition.vec().x,
- constraint->current.cursor_hint.y + PWINDOW->m_vRealPosition.vec().y);
-
- wlr_seat_pointer_warp(constraint->seat, constraint->current.cursor_hint.x, constraint->current.cursor_hint.y);
- }
- }
-
- const auto PCONSTRAINT = constraintFromWlr(constraint);
- if (PCONSTRAINT) { // should never be null but who knows
- PCONSTRAINT->positionHint = Vector2D(constraint->current.cursor_hint.x, constraint->current.cursor_hint.y);
- PCONSTRAINT->hintSet = true;
- }
- }
- }
+ if (constraint && constraint->current.committed & WLR_POINTER_CONSTRAINT_V1_STATE_CURSOR_HINT)
+ warpMouseToConstraintMiddle(constraintFromWlr(constraint));
wlr_pointer_constraint_v1_send_deactivated(pMouse->currentConstraint);
}
@@ -1224,6 +1201,27 @@ void CInputManager::constrainMouse(SMouse* pMouse, wlr_pointer_constraint_v1* co
Debug::log(LOG, "Constrained mouse to %lx", pMouse->currentConstraint);
}
+void CInputManager::warpMouseToConstraintMiddle(SConstraint* pConstraint) {
+
+ if (!pConstraint)
+ return;
+
+ pConstraint->positionHint = Vector2D(pConstraint->constraint->current.cursor_hint.x, pConstraint->constraint->current.cursor_hint.y);
+ pConstraint->hintSet = true;
+
+ const auto PWINDOW = g_pCompositor->getWindowFromSurface(pConstraint->constraint->surface);
+
+ if (PWINDOW) {
+ const auto RELATIVETO = PWINDOW->m_bIsX11 ?
+ g_pXWaylandManager->xwaylandToWaylandCoords({PWINDOW->m_uSurface.xwayland->x, PWINDOW->m_uSurface.xwayland->y}) / PWINDOW->m_fX11SurfaceScaledBy :
+ PWINDOW->m_vRealPosition.goalv();
+ const auto HINTSCALE = PWINDOW->m_fX11SurfaceScaledBy;
+
+ wlr_cursor_warp(g_pCompositor->m_sWLRCursor, nullptr, RELATIVETO.x + pConstraint->positionHint.x / HINTSCALE, RELATIVETO.y + pConstraint->positionHint.y / HINTSCALE);
+ wlr_seat_pointer_warp(pConstraint->constraint->seat, pConstraint->constraint->current.cursor_hint.x, pConstraint->constraint->current.cursor_hint.y);
+ }
+}
+
void CInputManager::unconstrainMouse() {
if (!g_pCompositor->m_sSeat.mouse || !g_pCompositor->m_sSeat.mouse->currentConstraint)
return;
diff --git a/src/managers/input/InputManager.hpp b/src/managers/input/InputManager.hpp
index 1a3eac0c..a5f38947 100644
--- a/src/managers/input/InputManager.hpp
+++ b/src/managers/input/InputManager.hpp
@@ -79,6 +79,7 @@ class CInputManager {
void destroySwitch(SSwitchDevice*);
void constrainMouse(SMouse*, wlr_pointer_constraint_v1*);
+ void warpMouseToConstraintMiddle(SConstraint*);
void recheckConstraint(SMouse*);
void unconstrainMouse();
SConstraint* constraintFromWlr(wlr_pointer_constraint_v1*);