summaryrefslogtreecommitdiff
path: root/src/render/decorations/DecorationPositioner.cpp
diff options
context:
space:
mode:
authorVaxry <vaxry@vaxry.net>2023-11-11 15:18:04 +0000
committerVaxry <vaxry@vaxry.net>2023-11-11 15:18:17 +0000
commitbea828ea4585bab206b8772b838f496e0eada12e (patch)
treefa03be2903d8270b307fa1a3e0389fe65a4bb505 /src/render/decorations/DecorationPositioner.cpp
parentc5d1faf72dc5e7e4fa357007974ced0f573f1f32 (diff)
decoration-positioner: improve extent handling
Diffstat (limited to 'src/render/decorations/DecorationPositioner.cpp')
-rw-r--r--src/render/decorations/DecorationPositioner.cpp38
1 files changed, 34 insertions, 4 deletions
diff --git a/src/render/decorations/DecorationPositioner.cpp b/src/render/decorations/DecorationPositioner.cpp
index 98627d4c..55e5470d 100644
--- a/src/render/decorations/DecorationPositioner.cpp
+++ b/src/render/decorations/DecorationPositioner.cpp
@@ -226,11 +226,41 @@ SWindowDecorationExtents CDecorationPositioner::getWindowDecorationReserved(CWin
}
SWindowDecorationExtents CDecorationPositioner::getWindowDecorationExtents(CWindow* pWindow, bool inputOnly) {
- if (!inputOnly)
- return m_mWindowDatas[pWindow].extents;
+ CBox accum = pWindow->getWindowMainSurfaceBox().expand(pWindow->getRealBorderSize());
+
+ for (auto& data : m_vWindowPositioningDatas) {
+ if (data->pWindow != pWindow)
+ continue;
+
+ if (!(data->pDecoration->getDecorationFlags() & DECORATION_ALLOWS_MOUSE_INPUT) && inputOnly)
+ continue;
+
+ CBox decoBox;
+
+ if (data->positioningInfo.policy == DECORATION_POSITION_ABSOLUTE) {
+ decoBox = data->pWindow->getWindowMainSurfaceBox();
+ decoBox.addExtents(data->positioningInfo.desiredExtents);
+ } else {
+ decoBox = data->lastReply.assignedGeometry;
+ const auto EDGEPOINT = getEdgeDefinedPoint(data->positioningInfo.edges, pWindow);
+ decoBox.translate(EDGEPOINT);
+ }
+
+ SWindowDecorationExtents extentsToAdd;
+
+ if (decoBox.x < accum.x)
+ extentsToAdd.topLeft.x = accum.x - decoBox.x;
+ if (decoBox.y < accum.y)
+ extentsToAdd.topLeft.y = accum.y - decoBox.y;
+ if (decoBox.x + decoBox.w > accum.x + accum.w)
+ extentsToAdd.bottomRight.x = (decoBox.x + decoBox.w) - (accum.x + accum.w);
+ if (decoBox.y + decoBox.h > accum.y + accum.h)
+ extentsToAdd.bottomRight.y = (decoBox.y + decoBox.h) - (accum.y + accum.h);
+
+ accum.addExtents(extentsToAdd);
+ }
- // TODO:
- return m_mWindowDatas[pWindow].extents;
+ return accum.extentsFrom(pWindow->getWindowMainSurfaceBox());
}
CBox CDecorationPositioner::getBoxWithIncludedDecos(CWindow* pWindow) {