mirror of
https://github.com/hyprwm/Hyprland
synced 2024-12-23 10:09:49 +01:00
windowrules: add on-screen constraint to wrv2 'move' (#3247)
* add on-screen constraint to wrv2 'move' * review changes * std::clamp * more parens --------- Co-authored-by: Leeman <lstrout@enlj.com>
This commit is contained in:
parent
b6191cbc76
commit
9192b20b96
1 changed files with 17 additions and 4 deletions
|
@ -322,6 +322,11 @@ void Events::listener_mapWindow(void* owner, void* data) {
|
||||||
try {
|
try {
|
||||||
auto value = r.szRule.substr(r.szRule.find(' ') + 1);
|
auto value = r.szRule.substr(r.szRule.find(' ') + 1);
|
||||||
|
|
||||||
|
const bool ONSCREEN = value.find("onscreen") == 0;
|
||||||
|
|
||||||
|
if (ONSCREEN)
|
||||||
|
value = value.substr(value.find_first_of(' ') + 1);
|
||||||
|
|
||||||
const bool CURSOR = value.find("cursor") == 0;
|
const bool CURSOR = value.find("cursor") == 0;
|
||||||
|
|
||||||
if (CURSOR)
|
if (CURSOR)
|
||||||
|
@ -334,8 +339,7 @@ void Events::listener_mapWindow(void* owner, void* data) {
|
||||||
int posY = 0;
|
int posY = 0;
|
||||||
|
|
||||||
if (POSXSTR.find("100%-") == 0) {
|
if (POSXSTR.find("100%-") == 0) {
|
||||||
const auto PMONITOR = g_pCompositor->getMonitorFromID(PWINDOW->m_iMonitorID);
|
const auto POSXRAW = POSXSTR.substr(5);
|
||||||
const auto POSXRAW = POSXSTR.substr(5);
|
|
||||||
posX =
|
posX =
|
||||||
PMONITOR->vecSize.x - (!POSXRAW.contains('%') ? std::stoi(POSXRAW) : std::stof(POSXRAW.substr(0, POSXRAW.length() - 1)) * 0.01 * PMONITOR->vecSize.x);
|
PMONITOR->vecSize.x - (!POSXRAW.contains('%') ? std::stoi(POSXRAW) : std::stof(POSXRAW.substr(0, POSXRAW.length() - 1)) * 0.01 * PMONITOR->vecSize.x);
|
||||||
|
|
||||||
|
@ -354,8 +358,7 @@ void Events::listener_mapWindow(void* owner, void* data) {
|
||||||
}
|
}
|
||||||
|
|
||||||
if (POSYSTR.find("100%-") == 0) {
|
if (POSYSTR.find("100%-") == 0) {
|
||||||
const auto PMONITOR = g_pCompositor->getMonitorFromID(PWINDOW->m_iMonitorID);
|
const auto POSYRAW = POSYSTR.substr(5);
|
||||||
const auto POSYRAW = POSYSTR.substr(5);
|
|
||||||
posY =
|
posY =
|
||||||
PMONITOR->vecSize.y - (!POSYRAW.contains('%') ? std::stoi(POSYRAW) : std::stof(POSYRAW.substr(0, POSYRAW.length() - 1)) * 0.01 * PMONITOR->vecSize.y);
|
PMONITOR->vecSize.y - (!POSYRAW.contains('%') ? std::stoi(POSYRAW) : std::stof(POSYRAW.substr(0, POSYRAW.length() - 1)) * 0.01 * PMONITOR->vecSize.y);
|
||||||
|
|
||||||
|
@ -373,6 +376,16 @@ void Events::listener_mapWindow(void* owner, void* data) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (ONSCREEN) {
|
||||||
|
int borderSize = PWINDOW->getRealBorderSize();
|
||||||
|
|
||||||
|
posX = std::clamp(posX, (int)(PMONITOR->vecReservedTopLeft.x + borderSize),
|
||||||
|
(int)(PMONITOR->vecSize.x - PMONITOR->vecReservedBottomRight.x - PWINDOW->m_vRealSize.goalv().x - borderSize));
|
||||||
|
|
||||||
|
posY = std::clamp(posY, (int)(PMONITOR->vecReservedTopLeft.y + borderSize),
|
||||||
|
(int)(PMONITOR->vecSize.y - PMONITOR->vecReservedBottomRight.y - PWINDOW->m_vRealSize.goalv().y - borderSize));
|
||||||
|
}
|
||||||
|
|
||||||
Debug::log(LOG, "Rule move, applying to window {:x}", (uintptr_t)PWINDOW);
|
Debug::log(LOG, "Rule move, applying to window {:x}", (uintptr_t)PWINDOW);
|
||||||
|
|
||||||
PWINDOW->m_vRealPosition = Vector2D(posX, posY) + PMONITOR->vecPosition;
|
PWINDOW->m_vRealPosition = Vector2D(posX, posY) + PMONITOR->vecPosition;
|
||||||
|
|
Loading…
Reference in a new issue