mirror of
https://github.com/hyprwm/Hyprland
synced 2024-11-23 04:05:58 +01:00
minor xwayland constraint fixes
This commit is contained in:
parent
68605c2ccf
commit
9eae3b3c3b
3 changed files with 39 additions and 7 deletions
|
@ -770,3 +770,21 @@ bool CCompositor::isPointOnAnyMonitor(const Vector2D& point) {
|
||||||
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
CWindow* CCompositor::getConstraintWindow(SMouse* pMouse) {
|
||||||
|
if (!pMouse->currentConstraint)
|
||||||
|
return nullptr;
|
||||||
|
|
||||||
|
const auto PSURFACE = pMouse->currentConstraint->surface;
|
||||||
|
|
||||||
|
for (auto& w : m_lWindows) {
|
||||||
|
if (PSURFACE == g_pXWaylandManager->getWindowSurface(&w)) {
|
||||||
|
if (!w.m_bIsX11 && !windowValidMapped(&w))
|
||||||
|
continue;
|
||||||
|
|
||||||
|
return &w;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return nullptr;
|
||||||
|
}
|
|
@ -112,6 +112,7 @@ public:
|
||||||
CWindow* getNextWindowOnWorkspace(CWindow*);
|
CWindow* getNextWindowOnWorkspace(CWindow*);
|
||||||
int getNextAvailableNamedWorkspace();
|
int getNextAvailableNamedWorkspace();
|
||||||
bool isPointOnAnyMonitor(const Vector2D&);
|
bool isPointOnAnyMonitor(const Vector2D&);
|
||||||
|
CWindow* getConstraintWindow(SMouse*);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
void initAllSignals();
|
void initAllSignals();
|
||||||
|
|
|
@ -140,12 +140,15 @@ void CInputManager::mouseMoveUnified(uint32_t time, bool refocus) {
|
||||||
// constraints
|
// constraints
|
||||||
// All constraints TODO: multiple mice?
|
// All constraints TODO: multiple mice?
|
||||||
if (g_pCompositor->m_sSeat.mouse->currentConstraint) {
|
if (g_pCompositor->m_sSeat.mouse->currentConstraint) {
|
||||||
const auto CONSTRAINTWINDOW = g_pCompositor->getWindowFromSurface(g_pCompositor->m_sSeat.mouse->currentConstraint->surface);
|
const auto CONSTRAINTWINDOW = g_pCompositor->getConstraintWindow(g_pCompositor->m_sSeat.mouse);
|
||||||
|
|
||||||
if (g_pCompositor->m_pLastWindow == CONSTRAINTWINDOW) {
|
const auto CONSTRAINTPOS = CONSTRAINTWINDOW->m_bIsX11 ? Vector2D(CONSTRAINTWINDOW->m_uSurface.xwayland->x, CONSTRAINTWINDOW->m_uSurface.xwayland->y) : CONSTRAINTWINDOW->m_vRealPosition.vec();
|
||||||
|
const auto CONSTRAINTSIZE = CONSTRAINTWINDOW->m_bIsX11 ? Vector2D(CONSTRAINTWINDOW->m_uSurface.xwayland->width, CONSTRAINTWINDOW->m_uSurface.xwayland->height) : CONSTRAINTWINDOW->m_vRealSize.vec();
|
||||||
|
|
||||||
|
if (VECINRECT(mouseCoords, CONSTRAINTPOS.x, CONSTRAINTPOS.y, CONSTRAINTPOS.x + CONSTRAINTSIZE.x, CONSTRAINTPOS.y + CONSTRAINTSIZE.y)) {
|
||||||
// todo: this is incorrect, but it will work in most cases for now
|
// todo: this is incorrect, but it will work in most cases for now
|
||||||
// i made this cuz i wanna play minecraft lol
|
// i made this cuz i wanna play minecraft lol
|
||||||
Vector2D deltaToMiddle = (CONSTRAINTWINDOW->m_vRealPosition.vec() + CONSTRAINTWINDOW->m_vRealSize.vec() / 2.f) - mouseCoords;
|
Vector2D deltaToMiddle = CONSTRAINTPOS + CONSTRAINTSIZE / 2.f - mouseCoords;
|
||||||
wlr_cursor_move(g_pCompositor->m_sWLRCursor, g_pCompositor->m_sSeat.mouse->mouse, deltaToMiddle.x, deltaToMiddle.y);
|
wlr_cursor_move(g_pCompositor->m_sWLRCursor, g_pCompositor->m_sSeat.mouse->mouse, deltaToMiddle.x, deltaToMiddle.y);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -371,7 +374,10 @@ void CInputManager::recheckConstraint(SMouse* pMouse) {
|
||||||
pixman_region32_clear(&pMouse->confinedTo);
|
pixman_region32_clear(&pMouse->confinedTo);
|
||||||
}
|
}
|
||||||
|
|
||||||
Debug::log(LOG, "Constraint rechecked: %i, %i to %i, %i", PREGION->extents.x1, PREGION->extents.y1, PREGION->extents.x2, PREGION->extents.y2);
|
const auto PWINDOW = g_pCompositor->getConstraintWindow(g_pCompositor->m_sSeat.mouse);
|
||||||
|
const auto PWINDOWNAME = PWINDOW ? PWINDOW->m_szTitle : "";
|
||||||
|
|
||||||
|
Debug::log(LOG, "Constraint rechecked: %i, %i to %i, %i for %x (window name: %s)", PREGION->extents.x1, PREGION->extents.y1, PREGION->extents.x2, PREGION->extents.y2, pMouse->currentConstraint->surface, PWINDOWNAME.c_str());
|
||||||
}
|
}
|
||||||
|
|
||||||
void CInputManager::constrainMouse(SMouse* pMouse, wlr_pointer_constraint_v1* constraint) {
|
void CInputManager::constrainMouse(SMouse* pMouse, wlr_pointer_constraint_v1* constraint) {
|
||||||
|
@ -390,6 +396,12 @@ void CInputManager::constrainMouse(SMouse* pMouse, wlr_pointer_constraint_v1* co
|
||||||
|
|
||||||
if (constraint->current.committed & WLR_POINTER_CONSTRAINT_V1_STATE_CURSOR_HINT) {
|
if (constraint->current.committed & WLR_POINTER_CONSTRAINT_V1_STATE_CURSOR_HINT) {
|
||||||
if (PWINDOW) {
|
if (PWINDOW) {
|
||||||
|
if (PWINDOW->m_bIsX11) {
|
||||||
|
wlr_cursor_warp(g_pCompositor->m_sWLRCursor, nullptr,
|
||||||
|
constraint->current.cursor_hint.x + PWINDOW->m_uSurface.xwayland->x, PWINDOW->m_uSurface.xwayland->y + PWINDOW->m_vRealPosition.vec().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,
|
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);
|
constraint->current.cursor_hint.x + PWINDOW->m_vRealPosition.vec().x, constraint->current.cursor_hint.y + PWINDOW->m_vRealPosition.vec().y);
|
||||||
|
|
||||||
|
@ -397,6 +409,7 @@ void CInputManager::constrainMouse(SMouse* pMouse, wlr_pointer_constraint_v1* co
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
wlr_pointer_constraint_v1_send_deactivated(pMouse->currentConstraint);
|
wlr_pointer_constraint_v1_send_deactivated(pMouse->currentConstraint);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue