config: Add More Monitor 'Auto' Positions. (#5670)

* Reverse Window Positioning.

* Cleanup old comments and logs.

* Finish Splitting Left and Right offset.

* Forgot to add Auto Left to ConfigManager

* Fix problems with auto_left.

* Nearly finish up and down.

* Finish draft of all four dirs. Testing now.

* Change Y value in moveTo for up and down.

* Format, comment, and cleanup.

* Address Vaxry's feedback.

* Add check to see if auto position is first rule.

* Run clang-format.
This commit is contained in:
Gabriel Ford
2024-04-23 00:40:03 +00:00
committed by Vaxry
parent 29308b94ca
commit c3ec16f494
5 changed files with 65 additions and 18 deletions

View File

@@ -2791,26 +2791,55 @@ void CCompositor::arrangeMonitors() {
++it;
}
// auto left
int maxOffset = 0;
// Variables to store the max and min values of monitors on each axis.
int maxXOffsetRight = 0;
int maxXOffsetLeft = 0;
int maxYOffsetUp = 0;
int maxYOffsetDown = 0;
// Finds the max and min values of explicitely placed monitors.
for (auto& m : arranged) {
if (m->vecPosition.x + m->vecSize.x > maxOffset)
maxOffset = m->vecPosition.x + m->vecSize.x;
if (m->vecPosition.x + m->vecSize.x > maxXOffsetRight)
maxXOffsetRight = m->vecPosition.x + m->vecSize.x;
if (m->vecPosition.x < maxXOffsetLeft)
maxXOffsetLeft = m->vecPosition.x;
if (m->vecPosition.y + m->vecSize.y > maxYOffsetDown)
maxYOffsetDown = m->vecPosition.y + m->vecSize.y;
if (m->vecPosition.y < maxYOffsetUp)
maxYOffsetUp = m->vecPosition.y;
}
// Iterates through all non-explicitly placed monitors.
for (auto& m : toArrange) {
Debug::log(LOG, "arrangeMonitors: {} auto [{}, {:.2f}]", m->szName, maxOffset, 0.f);
m->moveTo({maxOffset, 0});
maxOffset += m->vecSize.x;
Debug::log(LOG, "arrangeMonitors: {} auto [{}, {:.2f}]", m->szName, maxXOffsetRight, 0.f);
// Moves the monitor to their appropriate position on the x/y axis and
// increments/decrements the corresponding max offset.
if (m->activeMonitorRule.autoDir == eAutoDirs::DIR_AUTO_UP) {
m->moveTo({0, maxYOffsetUp - m->vecSize.y});
maxYOffsetUp = m->vecPosition.y;
} else if (m->activeMonitorRule.autoDir == eAutoDirs::DIR_AUTO_DOWN) {
m->moveTo({0, maxYOffsetDown});
maxYOffsetDown += m->vecSize.y;
} else if (m->activeMonitorRule.autoDir == eAutoDirs::DIR_AUTO_LEFT) {
m->moveTo({maxXOffsetLeft - m->vecSize.x, 0});
maxXOffsetLeft = m->vecPosition.x;
} else if (m->activeMonitorRule.autoDir == eAutoDirs::DIR_AUTO_RIGHT) {
m->moveTo({maxXOffsetRight, 0});
maxXOffsetRight += m->vecSize.x;
} else {
Debug::log(WARN,
"Invalid auto direction. Valid options are 'auto',"
"'auto-up', 'auto-down', 'auto-left', and 'auto-right'.");
}
}
// reset maxOffset (reuse)
// reset maxXOffsetRight (reuse)
// and set xwayland positions aka auto for all
maxOffset = 0;
maxXOffsetRight = 0;
for (auto& m : m_vMonitors) {
Debug::log(LOG, "arrangeMonitors: {} xwayland [{}, {:.2f}]", m->szName, maxOffset, 0.f);
m->vecXWaylandPosition = {maxOffset, 0};
maxOffset += (*PXWLFORCESCALEZERO ? m->vecTransformedSize.x : m->vecSize.x);
Debug::log(LOG, "arrangeMonitors: {} xwayland [{}, {:.2f}]", m->szName, maxXOffsetRight, 0.f);
m->vecXWaylandPosition = {maxXOffsetRight, 0};
maxXOffsetRight += (*PXWLFORCESCALEZERO ? m->vecTransformedSize.x : m->vecSize.x);
if (*PXWLFORCESCALEZERO)
m->xwaylandScale = m->scale;