diff options
| author | vaxerski <43317083+vaxerski@users.noreply.github.com> | 2022-04-09 13:26:55 +0200 |
|---|---|---|
| committer | vaxerski <43317083+vaxerski@users.noreply.github.com> | 2022-04-09 13:26:55 +0200 |
| commit | 3d5e2c1dc34e1099fd56bad61848f7a48268ea77 (patch) | |
| tree | 352c6faa9f939f3f6b6ae2c793246cf92aa5dfdc /src/Compositor.cpp | |
| parent | 7449a0c44c578c1be4de1726349cf6d28d08f31b (diff) | |
Added movefocus dispatcher
Diffstat (limited to 'src/Compositor.cpp')
| -rw-r--r-- | src/Compositor.cpp | 61 |
1 files changed, 61 insertions, 0 deletions
diff --git a/src/Compositor.cpp b/src/Compositor.cpp index bd843ef5..ecefbaba 100644 --- a/src/Compositor.cpp +++ b/src/Compositor.cpp @@ -568,4 +568,65 @@ void CCompositor::cleanupWindows() { return; } } +} + +CWindow* CCompositor::getWindowInDirection(CWindow* pWindow, char dir) { + const auto POSA = pWindow->m_vPosition; + const auto SIZEA = pWindow->m_vSize; + + auto longestIntersect = -1; + CWindow* longestIntersectWindow = nullptr; + + for (auto& w : m_lWindows) { + if (&w == pWindow || !windowValidMapped(&w) || w.m_bIsFloating || w.m_iWorkspaceID != pWindow->m_iWorkspaceID) + continue; + + const auto POSB = w.m_vPosition; + const auto SIZEB = w.m_vSize; + switch (dir) { + case 'l': + if (STICKS(POSA.x, POSB.x + SIZEB.x)) { + const auto INTERSECTLEN = std::max((double)0, std::min(POSA.y + SIZEA.y, POSB.y + SIZEB.y) - std::max(POSA.y, POSB.y)); + if (INTERSECTLEN > longestIntersect) { + longestIntersect = INTERSECTLEN; + longestIntersectWindow = &w; + } + } + break; + case 'r': + if (STICKS(POSA.x + SIZEA.x, POSB.x)) { + const auto INTERSECTLEN = std::max((double)0, std::min(POSA.y + SIZEA.y, POSB.y + SIZEB.y) - std::max(POSA.y, POSB.y)); + if (INTERSECTLEN > longestIntersect) { + longestIntersect = INTERSECTLEN; + longestIntersectWindow = &w; + } + } + break; + case 't': + case 'u': + if (STICKS(POSA.y, POSB.y + SIZEB.y)) { + const auto INTERSECTLEN = std::max((double)0, std::min(POSA.x + SIZEA.x, POSB.x + SIZEB.x) - std::max(POSA.x, POSB.x)); + if (INTERSECTLEN > longestIntersect) { + longestIntersect = INTERSECTLEN; + longestIntersectWindow = &w; + } + } + break; + case 'b': + case 'd': + if (STICKS(POSA.y + SIZEA.y, POSB.y)) { + const auto INTERSECTLEN = std::max((double)0, std::min(POSA.x + SIZEA.x, POSB.x + SIZEB.x) - std::max(POSA.x, POSB.x)); + if (INTERSECTLEN > longestIntersect) { + longestIntersect = INTERSECTLEN; + longestIntersectWindow = &w; + } + } + break; + } + } + + if (longestIntersect != -1) + return longestIntersectWindow; + + return nullptr; }
\ No newline at end of file |
