Skip to content

Commit

Permalink
windowrules: add on-screen constraint to wrv2 'move' (#3247)
Browse files Browse the repository at this point in the history
* add on-screen constraint to wrv2 'move'

* review changes

* std::clamp

* more parens

---------

Co-authored-by: Leeman <lstrout@enlj.com>
  • Loading branch information
alaricljs and Leeman committed Sep 12, 2023
1 parent b6191cb commit 9192b20
Showing 1 changed file with 17 additions and 4 deletions.
21 changes: 17 additions & 4 deletions src/events/Windows.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -322,6 +322,11 @@ void Events::listener_mapWindow(void* owner, void* data) {
try {
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;

if (CURSOR)
Expand All @@ -334,8 +339,7 @@ void Events::listener_mapWindow(void* owner, void* data) {
int posY = 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 =
PMONITOR->vecSize.x - (!POSXRAW.contains('%') ? std::stoi(POSXRAW) : std::stof(POSXRAW.substr(0, POSXRAW.length() - 1)) * 0.01 * PMONITOR->vecSize.x);

Expand All @@ -354,8 +358,7 @@ void Events::listener_mapWindow(void* owner, void* data) {
}

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 =
PMONITOR->vecSize.y - (!POSYRAW.contains('%') ? std::stoi(POSYRAW) : std::stof(POSYRAW.substr(0, POSYRAW.length() - 1)) * 0.01 * PMONITOR->vecSize.y);

Expand All @@ -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);

PWINDOW->m_vRealPosition = Vector2D(posX, posY) + PMONITOR->vecPosition;
Expand Down

0 comments on commit 9192b20

Please sign in to comment.