From 1a55fb417093fb945942dba63d0edb9467d782ef Mon Sep 17 00:00:00 2001
From: abbadanor <69853409+abbadanor@users.noreply.github.com>
Date: Mon, 7 Nov 2022 13:16:30 +0100
Subject: [PATCH] Dispatcher to center floating window (#961)

Co-authored-by: Adam Nord <adam.nord@abbgymnasiet.se>
Co-authored-by: vaxerski <vaxry@vaxry.net>
---
 src/managers/KeybindManager.cpp | 17 +++++++++++++++--
 src/managers/KeybindManager.hpp |  1 +
 2 files changed, 16 insertions(+), 2 deletions(-)

diff --git a/src/managers/KeybindManager.cpp b/src/managers/KeybindManager.cpp
index e690c7f3e..0e6f14859 100644
--- a/src/managers/KeybindManager.cpp
+++ b/src/managers/KeybindManager.cpp
@@ -16,6 +16,7 @@ CKeybindManager::CKeybindManager() {
     m_mDispatchers["pseudo"]                    = toggleActivePseudo;
     m_mDispatchers["movefocus"]                 = moveFocusTo;
     m_mDispatchers["movewindow"]                = moveActiveTo;
+    m_mDispatchers["centerwindow"]              = centerWindow;
     m_mDispatchers["togglegroup"]               = toggleGroup;
     m_mDispatchers["changegroupactive"]         = changeGroupActive;
     m_mDispatchers["togglesplit"]               = toggleSplit;
@@ -579,6 +580,18 @@ void CKeybindManager::toggleActiveFloating(std::string args) {
     g_pLayoutManager->getCurrentLayout()->changeWindowFloatingMode(PWINDOW);
 }
 
+void CKeybindManager::centerWindow(std::string args) {
+    const auto PWINDOW = g_pCompositor->m_pLastWindow;
+
+    if (!PWINDOW || !PWINDOW->m_bIsFloating || PWINDOW->m_bIsFullscreen)
+        return;
+
+    const auto PMONITOR = g_pCompositor->getMonitorFromID(PWINDOW->m_iMonitorID);
+
+    PWINDOW->m_vRealPosition = PMONITOR->vecPosition + PMONITOR->vecSize / 2.f - PWINDOW->m_vRealSize.goalv() / 2.f;
+    PWINDOW->m_vPosition = PWINDOW->m_vRealPosition.goalv();
+}
+
 void CKeybindManager::toggleActivePseudo(std::string args) {
     const auto ACTIVEWINDOW = g_pCompositor->m_pLastWindow;
 
@@ -617,7 +630,7 @@ void CKeybindManager::changeworkspace(std::string args) {
             return;
         } else {
             workspaceToChangeTo = PCURRENTWORKSPACE->m_iPrevWorkspaceID;
-            
+
             if (const auto PWORKSPACETOCHANGETO = g_pCompositor->getWorkspaceByID(workspaceToChangeTo); PWORKSPACETOCHANGETO)
                 workspaceName = PWORKSPACETOCHANGETO->m_szName;
             else
@@ -650,7 +663,7 @@ void CKeybindManager::changeworkspace(std::string args) {
         const auto PPREVWORKSPACE = g_pCompositor->getWorkspaceByID(PCURRENTWORKSPACE->m_iPrevWorkspaceID);
 
         workspaceToChangeTo = PCURRENTWORKSPACE->m_iPrevWorkspaceID;
-        
+
         if (PPREVWORKSPACE)
             workspaceName = PPREVWORKSPACE->m_szName;
         else
diff --git a/src/managers/KeybindManager.hpp b/src/managers/KeybindManager.hpp
index e3404c33c..15748709e 100644
--- a/src/managers/KeybindManager.hpp
+++ b/src/managers/KeybindManager.hpp
@@ -92,6 +92,7 @@ private:
     static void         moveActiveToWorkspace(std::string);
     static void         moveActiveToWorkspaceSilent(std::string);
     static void         moveFocusTo(std::string);
+    static void         centerWindow(std::string);
     static void         moveActiveTo(std::string);
     static void         toggleGroup(std::string);
     static void         changeGroupActive(std::string);