From 1074d411eb1acef1e6c634fc78f40aa7ca0becd6 Mon Sep 17 00:00:00 2001 From: vaxerski <43317083+vaxerski@users.noreply.github.com> Date: Sun, 21 Nov 2021 21:16:19 +0100 Subject: [PATCH] sanity checks --- src/windowManager.cpp | 36 ++++++++++++++++++++++++++++++++++++ src/windowManager.hpp | 1 + 2 files changed, 37 insertions(+) diff --git a/src/windowManager.cpp b/src/windowManager.cpp index 74203a2..7fbc18a 100644 --- a/src/windowManager.cpp +++ b/src/windowManager.cpp @@ -213,6 +213,35 @@ bool CWindowManager::handleEvent() { return true; } +// TODO: add an empty space check +void CWindowManager::performSanityCheckForWorkspace(int WorkspaceID) { + for (auto& windowA : windows) { + if (windowA.getWorkspaceID() != WorkspaceID) + continue; + + for (auto& windowB : windows) { + if (windowB.getWorkspaceID() != WorkspaceID) + continue; + + if (windowB.getDrawable() == windowA.getDrawable()) + continue; + + // Check if A and B overlap, if don't, continue + if ((windowA.getPosition().x >= (windowB.getPosition() + windowB.getSize()).x || windowB.getPosition().x >= (windowA.getPosition() + windowA.getSize()).x + || windowA.getPosition().y >= (windowB.getPosition() + windowB.getSize()).y || windowB.getPosition().y >= (windowA.getPosition() + windowA.getSize()).y)) { + continue; + } + + // Overlap detected! Fix window B + if (windowB.getIsFloating()) { + calculateNewTileSetOldTile(&windowB); + } else { + calculateNewFloatingWindow(&windowB); + } + } + } +} + void CWindowManager::cleanupUnusedWorkspaces() { std::vector temp = workspaces; @@ -678,6 +707,10 @@ void CWindowManager::changeWorkspaceByID(int ID) { if (workspace.getID() == ID) { activeWorkspaces[workspace.getMonitor()] = workspace.getID(); LastWindow = -1; + + // Perform a sanity check for the new workspace + performSanityCheckForWorkspace(ID); + return; } } @@ -689,6 +722,9 @@ void CWindowManager::changeWorkspaceByID(int ID) { workspaces.push_back(newWorkspace); activeWorkspaces[MONITOR->ID] = workspaces[workspaces.size() - 1].getID(); LastWindow = -1; + + // Perform a sanity check for the new workspace + performSanityCheckForWorkspace(ID); } void CWindowManager::setAllWindowsDirty() { diff --git a/src/windowManager.hpp b/src/windowManager.hpp index 480ce95..50a10e4 100644 --- a/src/windowManager.hpp +++ b/src/windowManager.hpp @@ -44,6 +44,7 @@ public: void setupManager(); bool handleEvent(); void refreshDirtyWindows(); + void performSanityCheckForWorkspace(int); void setFocusedWindow(xcb_drawable_t);