diff options
| author | Vaxry <vaxry@vaxry.net> | 2023-11-11 15:18:04 +0000 |
|---|---|---|
| committer | Vaxry <vaxry@vaxry.net> | 2023-11-11 15:18:17 +0000 |
| commit | bea828ea4585bab206b8772b838f496e0eada12e (patch) | |
| tree | fa03be2903d8270b307fa1a3e0389fe65a4bb505 /src/render/decorations/DecorationPositioner.cpp | |
| parent | c5d1faf72dc5e7e4fa357007974ced0f573f1f32 (diff) | |
decoration-positioner: improve extent handling
Diffstat (limited to 'src/render/decorations/DecorationPositioner.cpp')
| -rw-r--r-- | src/render/decorations/DecorationPositioner.cpp | 38 |
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) { |
