mirror of
https://github.com/hyprwm/Hyprland
synced 2024-11-26 14:45:59 +01:00
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:
parent
29308b94ca
commit
c3ec16f494
5 changed files with 65 additions and 18 deletions
|
@ -2791,26 +2791,55 @@ void CCompositor::arrangeMonitors() {
|
||||||
++it;
|
++it;
|
||||||
}
|
}
|
||||||
|
|
||||||
// auto left
|
// Variables to store the max and min values of monitors on each axis.
|
||||||
int maxOffset = 0;
|
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) {
|
for (auto& m : arranged) {
|
||||||
if (m->vecPosition.x + m->vecSize.x > maxOffset)
|
if (m->vecPosition.x + m->vecSize.x > maxXOffsetRight)
|
||||||
maxOffset = m->vecPosition.x + m->vecSize.x;
|
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) {
|
for (auto& m : toArrange) {
|
||||||
Debug::log(LOG, "arrangeMonitors: {} auto [{}, {:.2f}]", m->szName, maxOffset, 0.f);
|
Debug::log(LOG, "arrangeMonitors: {} auto [{}, {:.2f}]", m->szName, maxXOffsetRight, 0.f);
|
||||||
m->moveTo({maxOffset, 0});
|
// Moves the monitor to their appropriate position on the x/y axis and
|
||||||
maxOffset += m->vecSize.x;
|
// 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
|
// and set xwayland positions aka auto for all
|
||||||
maxOffset = 0;
|
maxXOffsetRight = 0;
|
||||||
for (auto& m : m_vMonitors) {
|
for (auto& m : m_vMonitors) {
|
||||||
Debug::log(LOG, "arrangeMonitors: {} xwayland [{}, {:.2f}]", m->szName, maxOffset, 0.f);
|
Debug::log(LOG, "arrangeMonitors: {} xwayland [{}, {:.2f}]", m->szName, maxXOffsetRight, 0.f);
|
||||||
m->vecXWaylandPosition = {maxOffset, 0};
|
m->vecXWaylandPosition = {maxXOffsetRight, 0};
|
||||||
maxOffset += (*PXWLFORCESCALEZERO ? m->vecTransformedSize.x : m->vecSize.x);
|
maxXOffsetRight += (*PXWLFORCESCALEZERO ? m->vecTransformedSize.x : m->vecSize.x);
|
||||||
|
|
||||||
if (*PXWLFORCESCALEZERO)
|
if (*PXWLFORCESCALEZERO)
|
||||||
m->xwaylandScale = m->scale;
|
m->xwaylandScale = m->scale;
|
||||||
|
|
|
@ -1642,6 +1642,16 @@ std::optional<std::string> CConfigManager::handleMonitor(const std::string& comm
|
||||||
|
|
||||||
if (ARGS[2].starts_with("auto")) {
|
if (ARGS[2].starts_with("auto")) {
|
||||||
newrule.offset = Vector2D(-INT32_MAX, -INT32_MAX);
|
newrule.offset = Vector2D(-INT32_MAX, -INT32_MAX);
|
||||||
|
// If this is the first monitor rule needs to be on the right.
|
||||||
|
if (ARGS[2] == "auto-right" || ARGS[2] == "auto" || m_dMonitorRules.empty())
|
||||||
|
newrule.autoDir = eAutoDirs::DIR_AUTO_RIGHT;
|
||||||
|
else if (ARGS[2] == "auto-left")
|
||||||
|
newrule.autoDir = eAutoDirs::DIR_AUTO_LEFT;
|
||||||
|
else if (ARGS[2] == "auto-up")
|
||||||
|
newrule.autoDir = eAutoDirs::DIR_AUTO_UP;
|
||||||
|
else if (ARGS[2] == "auto-down")
|
||||||
|
newrule.autoDir = eAutoDirs::DIR_AUTO_DOWN;
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
if (!ARGS[2].contains("x")) {
|
if (!ARGS[2].contains("x")) {
|
||||||
error += "invalid offset ";
|
error += "invalid offset ";
|
||||||
|
|
|
@ -1258,8 +1258,8 @@ std::unordered_map<std::string, std::string> CWindow::getEnv() {
|
||||||
std::unordered_map<std::string, std::string> results;
|
std::unordered_map<std::string, std::string> results;
|
||||||
|
|
||||||
//
|
//
|
||||||
std::string environFile = "/proc/" + std::to_string(PID) + "/environ";
|
std::string environFile = "/proc/" + std::to_string(PID) + "/environ";
|
||||||
std::ifstream ifs(environFile, std::ios::binary);
|
std::ifstream ifs(environFile, std::ios::binary);
|
||||||
|
|
||||||
if (!ifs.good())
|
if (!ifs.good())
|
||||||
return {};
|
return {};
|
||||||
|
|
|
@ -10,10 +10,18 @@
|
||||||
#include "Timer.hpp"
|
#include "Timer.hpp"
|
||||||
#include "Region.hpp"
|
#include "Region.hpp"
|
||||||
#include <optional>
|
#include <optional>
|
||||||
|
|
||||||
#include "signal/Signal.hpp"
|
#include "signal/Signal.hpp"
|
||||||
|
|
||||||
|
// Enum for the different types of auto directions, e.g. auto-left, auto-up.
|
||||||
|
enum class eAutoDirs {
|
||||||
|
DIR_AUTO_UP,
|
||||||
|
DIR_AUTO_DOWN,
|
||||||
|
DIR_AUTO_LEFT,
|
||||||
|
DIR_AUTO_RIGHT
|
||||||
|
};
|
||||||
|
|
||||||
struct SMonitorRule {
|
struct SMonitorRule {
|
||||||
|
eAutoDirs autoDir;
|
||||||
std::string name = "";
|
std::string name = "";
|
||||||
Vector2D resolution = Vector2D(1280, 720);
|
Vector2D resolution = Vector2D(1280, 720);
|
||||||
Vector2D offset = Vector2D(0, 0);
|
Vector2D offset = Vector2D(0, 0);
|
||||||
|
|
|
@ -15,9 +15,9 @@ std::string CTokenManager::registerNewToken(std::any data, std::chrono::system_c
|
||||||
do {
|
do {
|
||||||
uuid_t uuid_;
|
uuid_t uuid_;
|
||||||
uuid_generate_random(uuid_);
|
uuid_generate_random(uuid_);
|
||||||
uuid = std::format("{:02x}{:02x}{:02x}{:02x}-{:02x}{:02x}-{:02x}{:02x}-{:02x}{:02x}-{:02x}{:02x}{:02x}{:02x}{:02x}{:02x}", (uint16_t)uuid_[0], (uint16_t)uuid_[1], (uint16_t)uuid_[2],
|
uuid = std::format("{:02x}{:02x}{:02x}{:02x}-{:02x}{:02x}-{:02x}{:02x}-{:02x}{:02x}-{:02x}{:02x}{:02x}{:02x}{:02x}{:02x}", (uint16_t)uuid_[0], (uint16_t)uuid_[1],
|
||||||
(uint16_t)uuid_[3], (uint16_t)uuid_[4], (uint16_t)uuid_[5], (uint16_t)uuid_[6], (uint16_t)uuid_[7], (uint16_t)uuid_[8], (uint16_t)uuid_[9],
|
(uint16_t)uuid_[2], (uint16_t)uuid_[3], (uint16_t)uuid_[4], (uint16_t)uuid_[5], (uint16_t)uuid_[6], (uint16_t)uuid_[7], (uint16_t)uuid_[8],
|
||||||
(uint16_t)uuid_[10], (uint16_t)uuid_[11], (uint16_t)uuid_[12], (uint16_t)uuid_[13], (uint16_t)uuid_[14], (uint16_t)uuid_[15]);
|
(uint16_t)uuid_[9], (uint16_t)uuid_[10], (uint16_t)uuid_[11], (uint16_t)uuid_[12], (uint16_t)uuid_[13], (uint16_t)uuid_[14], (uint16_t)uuid_[15]);
|
||||||
} while (m_mTokens.contains(uuid));
|
} while (m_mTokens.contains(uuid));
|
||||||
|
|
||||||
m_mTokens[uuid] = std::make_shared<CUUIDToken>(uuid, data, expires);
|
m_mTokens[uuid] = std::make_shared<CUUIDToken>(uuid, data, expires);
|
||||||
|
|
Loading…
Reference in a new issue