compositor: fix monitor arrangement with mixed auto directions

fixes #8518
This commit is contained in:
Vaxry 2024-12-13 22:31:30 +00:00
parent 35e134e570
commit 8237627f3a

View file

@ -2771,6 +2771,12 @@ void CCompositor::arrangeMonitors() {
int maxYOffsetUp = 0; int maxYOffsetUp = 0;
int maxYOffsetDown = 0; int maxYOffsetDown = 0;
auto recalcMaxOffsets = [&]() {
maxXOffsetRight = 0;
maxXOffsetLeft = 0;
maxYOffsetUp = 0;
maxYOffsetDown = 0;
// Finds the max and min values of explicitely placed monitors. // Finds the max and min values of explicitely placed monitors.
for (auto const& m : arranged) { for (auto const& m : arranged) {
if (m->vecPosition.x + m->vecSize.x > maxXOffsetRight) if (m->vecPosition.x + m->vecSize.x > maxXOffsetRight)
@ -2782,34 +2788,26 @@ void CCompositor::arrangeMonitors() {
if (m->vecPosition.y < maxYOffsetUp) if (m->vecPosition.y < maxYOffsetUp)
maxYOffsetUp = m->vecPosition.y; maxYOffsetUp = m->vecPosition.y;
} }
};
// Iterates through all non-explicitly placed monitors. // Iterates through all non-explicitly placed monitors.
for (auto const& m : toArrange) { for (auto const& m : toArrange) {
recalcMaxOffsets();
// Moves the monitor to their appropriate position on the x/y axis and // Moves the monitor to their appropriate position on the x/y axis and
// increments/decrements the corresponding max offset. // increments/decrements the corresponding max offset.
Vector2D newPosition = {0, 0}; Vector2D newPosition = {0, 0};
switch (m->activeMonitorRule.autoDir) { switch (m->activeMonitorRule.autoDir) {
case eAutoDirs::DIR_AUTO_UP: case eAutoDirs::DIR_AUTO_UP: newPosition.y = maxYOffsetUp - m->vecSize.y; break;
newPosition.y = maxYOffsetUp - m->vecSize.y; case eAutoDirs::DIR_AUTO_DOWN: newPosition.y = maxYOffsetDown; break;
maxYOffsetUp = newPosition.y; case eAutoDirs::DIR_AUTO_LEFT: newPosition.x = maxXOffsetLeft - m->vecSize.x; break;
break;
case eAutoDirs::DIR_AUTO_DOWN:
newPosition.y = maxYOffsetDown;
maxYOffsetDown += m->vecSize.y;
break;
case eAutoDirs::DIR_AUTO_LEFT:
newPosition.x = maxXOffsetLeft - m->vecSize.x;
maxXOffsetLeft = newPosition.x;
break;
case eAutoDirs::DIR_AUTO_RIGHT: case eAutoDirs::DIR_AUTO_RIGHT:
case eAutoDirs::DIR_AUTO_NONE: case eAutoDirs::DIR_AUTO_NONE: newPosition.x = maxXOffsetRight; break;
newPosition.x = maxXOffsetRight;
maxXOffsetRight += m->vecSize.x;
break;
default: UNREACHABLE(); default: UNREACHABLE();
} }
Debug::log(LOG, "arrangeMonitors: {} auto {:j}", m->szName, m->vecPosition); Debug::log(LOG, "arrangeMonitors: {} auto {:j}", m->szName, m->vecPosition);
m->moveTo(newPosition); m->moveTo(newPosition);
arranged.emplace_back(m);
} }
// reset maxXOffsetRight (reuse) // reset maxXOffsetRight (reuse)