dwindle: add better automatic window drag and drop direction detection (#9704)

This commit is contained in:
littleblack111 2025-05-27 01:15:11 +08:00 committed by GitHub
parent 292a7456af
commit 4c4c9bb324
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
3 changed files with 32 additions and 1 deletions

View file

@ -362,9 +362,33 @@ void IHyprLayout::onEndDragWindow() {
}
if (DRAGGINGWINDOW->m_draggingTiled) {
static auto PPRECISEMOUSE = CConfigValue<Hyprlang::INT>("dwindle:precise_mouse_move");
DRAGGINGWINDOW->m_isFloating = false;
g_pInputManager->refocus();
changeWindowFloatingMode(DRAGGINGWINDOW);
if (*PPRECISEMOUSE) {
eDirection direction = DIRECTION_DEFAULT;
const auto MOUSECOORDS = g_pInputManager->getMouseCoordsInternal();
const PHLWINDOW pReferenceWindow = g_pCompositor->vectorToWindowUnified(MOUSECOORDS, RESERVED_EXTENTS | INPUT_EXTENTS | ALLOW_FLOATING, DRAGGINGWINDOW);
if (pReferenceWindow && pReferenceWindow != DRAGGINGWINDOW) {
const Vector2D draggedCenter = DRAGGINGWINDOW->m_realPosition->goal() + DRAGGINGWINDOW->m_realSize->goal() / 2.f;
const Vector2D referenceCenter = pReferenceWindow->m_realPosition->goal() + pReferenceWindow->m_realSize->goal() / 2.f;
const float xDiff = draggedCenter.x - referenceCenter.x;
const float yDiff = draggedCenter.y - referenceCenter.y;
if (fabs(xDiff) > fabs(yDiff))
direction = xDiff < 0 ? DIRECTION_LEFT : DIRECTION_RIGHT;
else
direction = yDiff < 0 ? DIRECTION_UP : DIRECTION_DOWN;
}
onWindowRemovedTiling(DRAGGINGWINDOW);
onWindowCreatedTiling(DRAGGINGWINDOW, direction);
} else
changeWindowFloatingMode(DRAGGINGWINDOW);
DRAGGINGWINDOW->m_lastFloatingSize = m_draggingWindowOriginalFloatSize;
}