summaryrefslogtreecommitdiff
path: root/src/Compositor.cpp
diff options
context:
space:
mode:
authorvaxerski <43317083+vaxerski@users.noreply.github.com>2022-04-09 13:26:55 +0200
committervaxerski <43317083+vaxerski@users.noreply.github.com>2022-04-09 13:26:55 +0200
commit3d5e2c1dc34e1099fd56bad61848f7a48268ea77 (patch)
tree352c6faa9f939f3f6b6ae2c793246cf92aa5dfdc /src/Compositor.cpp
parent7449a0c44c578c1be4de1726349cf6d28d08f31b (diff)
Added movefocus dispatcher
Diffstat (limited to 'src/Compositor.cpp')
-rw-r--r--src/Compositor.cpp61
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