From 844c33c9801177adf65ea7ed163a8a6df36a9a37 Mon Sep 17 00:00:00 2001 From: Darksome Date: Thu, 18 Aug 2022 22:23:28 +0300 Subject: [PATCH 1/3] Add mapwindow, unmapwindow and movewindow IPC events --- src/events/Windows.cpp | 3 +++ src/layout/IHyprLayout.cpp | 10 +++++++++- src/managers/KeybindManager.cpp | 2 ++ 3 files changed, 14 insertions(+), 1 deletion(-) diff --git a/src/events/Windows.cpp b/src/events/Windows.cpp index 660b08a2..ba2a5942 100644 --- a/src/events/Windows.cpp +++ b/src/events/Windows.cpp @@ -295,6 +295,8 @@ void Events::listener_mapWindow(void* owner, void* data) { const auto TIMER = wl_event_loop_add_timer(g_pCompositor->m_sWLEventLoop, setAnimToMove, PWINDOW); wl_event_source_timer_update(TIMER, PWINDOW->m_vRealPosition.getDurationLeftMs() + 5); + g_pEventManager->postEvent(SHyprIPCEvent{"mapwindow", getFormat("%x,%s,%s,%s", PWINDOW, PWORKSPACE->m_szName.c_str(), g_pXWaylandManager->getAppIDClass(PWINDOW).c_str(), PWINDOW->m_szTitle.c_str())}); + if (workspaceSilent) { // move the window if (g_pCompositor->m_pLastWindow == PWINDOW) { @@ -335,6 +337,7 @@ void Events::listener_unmapWindow(void* owner, void* data) { CWindow* PWINDOW = (CWindow*)owner; Debug::log(LOG, "Window %x unmapped (class %s)", PWINDOW, g_pXWaylandManager->getAppIDClass(PWINDOW).c_str()); + g_pEventManager->postEvent(SHyprIPCEvent{"unmapwindow", getFormat("%x", PWINDOW)}); if (!PWINDOW->m_bIsX11) { Debug::log(LOG, "Unregistered late callbacks XDG"); diff --git a/src/layout/IHyprLayout.cpp b/src/layout/IHyprLayout.cpp index 4a3f1800..173668bc 100644 --- a/src/layout/IHyprLayout.cpp +++ b/src/layout/IHyprLayout.cpp @@ -206,8 +206,16 @@ void IHyprLayout::onMouseMove(const Vector2D& mousePos) { if (PMONITOR) { DRAGGINGWINDOW->m_iMonitorID = PMONITOR->ID; - DRAGGINGWINDOW->m_iWorkspaceID = PMONITOR->activeWorkspace; + + if (DRAGGINGWINDOW->m_iWorkspaceID != PMONITOR->activeWorkspace) { + DRAGGINGWINDOW->m_iWorkspaceID = PMONITOR->activeWorkspace; + auto PWORKSPACE = g_pCompositor->getWorkspaceByID(DRAGGINGWINDOW->m_iWorkspaceID); + if (PWORKSPACE) { + g_pEventManager->postEvent(SHyprIPCEvent{"movewindow", getFormat("%x,%s", DRAGGINGWINDOW, PWORKSPACE->m_szName.c_str())}); + } + } + DRAGGINGWINDOW->updateToplevel(); } diff --git a/src/managers/KeybindManager.cpp b/src/managers/KeybindManager.cpp index 9939993a..c17886ff 100644 --- a/src/managers/KeybindManager.cpp +++ b/src/managers/KeybindManager.cpp @@ -670,6 +670,8 @@ void CKeybindManager::moveActiveToWorkspace(std::string args) { g_pInputManager->refocus(); PWINDOW->updateToplevel(); + + g_pEventManager->postEvent(SHyprIPCEvent{"movewindow", getFormat("%x,%s", PWINDOW, PWORKSPACE->m_szName.c_str())}); } void CKeybindManager::moveActiveToWorkspaceSilent(std::string args) { From 37e1450a4d028d974a7d38742a7bc5b093efa263 Mon Sep 17 00:00:00 2001 From: Darksome Date: Sat, 20 Aug 2022 13:25:56 +0300 Subject: [PATCH 2/3] Impl CCompositor::moveWindowToWorkspace --- src/Compositor.cpp | 14 ++++++++++++++ src/Compositor.hpp | 1 + src/events/Windows.cpp | 8 +++++--- src/layout/IHyprLayout.cpp | 12 ++---------- src/managers/KeybindManager.cpp | 4 +--- 5 files changed, 23 insertions(+), 16 deletions(-) diff --git a/src/Compositor.cpp b/src/Compositor.cpp index 5d6d65ec..f345e300 100644 --- a/src/Compositor.cpp +++ b/src/Compositor.cpp @@ -876,6 +876,20 @@ void CCompositor::moveWindowToTop(CWindow* pWindow) { } } +void CCompositor::moveWindowToWorkspace(CWindow* pWindow, int workspaceID) { + if (!windowValidMapped(pWindow)) + return; + + if (pWindow->m_iWorkspaceID != workspaceID) { + pWindow->m_iWorkspaceID = workspaceID; + + const auto PWORKSPACE = g_pCompositor->getWorkspaceByID(pWindow->m_iWorkspaceID); + if (PWORKSPACE) { + g_pEventManager->postEvent(SHyprIPCEvent{"movewindow", getFormat("%x,%s", pWindow, PWORKSPACE->m_szName.c_str())}); + } + } +} + void CCompositor::cleanupFadingOut(const int& monid) { for (auto& w : m_vWindowsFadingOut) { diff --git a/src/Compositor.hpp b/src/Compositor.hpp index 2e8c8dfe..8e380c94 100644 --- a/src/Compositor.hpp +++ b/src/Compositor.hpp @@ -132,6 +132,7 @@ public: bool doesSeatAcceptInput(wlr_surface*); bool isWindowActive(CWindow*); void moveWindowToTop(CWindow*); + void moveWindowToWorkspace(CWindow*, int); void cleanupFadingOut(const int& monid); CWindow* getWindowInDirection(CWindow*, char); void deactivateAllWLRWorkspaces(wlr_ext_workspace_handle_v1* exclude = nullptr); diff --git a/src/events/Windows.cpp b/src/events/Windows.cpp index ba2a5942..1eb35cc8 100644 --- a/src/events/Windows.cpp +++ b/src/events/Windows.cpp @@ -295,8 +295,6 @@ void Events::listener_mapWindow(void* owner, void* data) { const auto TIMER = wl_event_loop_add_timer(g_pCompositor->m_sWLEventLoop, setAnimToMove, PWINDOW); wl_event_source_timer_update(TIMER, PWINDOW->m_vRealPosition.getDurationLeftMs() + 5); - g_pEventManager->postEvent(SHyprIPCEvent{"mapwindow", getFormat("%x,%s,%s,%s", PWINDOW, PWORKSPACE->m_szName.c_str(), g_pXWaylandManager->getAppIDClass(PWINDOW).c_str(), PWINDOW->m_szTitle.c_str())}); - if (workspaceSilent) { // move the window if (g_pCompositor->m_pLastWindow == PWINDOW) { @@ -331,13 +329,17 @@ void Events::listener_mapWindow(void* owner, void* data) { PWINDOW->updateToplevel(); Debug::log(LOG, "Map request dispatched, monitor %s, xywh: %f %f %f %f", PMONITOR->szName.c_str(), PWINDOW->m_vRealPosition.goalv().x, PWINDOW->m_vRealPosition.goalv().y, PWINDOW->m_vRealSize.goalv().x, PWINDOW->m_vRealSize.goalv().y); + + auto workspaceID = requestedWorkspace != "" ? requestedWorkspace : PWORKSPACE->m_szName; + g_pEventManager->postEvent(SHyprIPCEvent{"openwindow", getFormat("%x,%s,%s,%s", PWINDOW, workspaceID.c_str(), g_pXWaylandManager->getAppIDClass(PWINDOW).c_str(), PWINDOW->m_szTitle.c_str())}); } void Events::listener_unmapWindow(void* owner, void* data) { CWindow* PWINDOW = (CWindow*)owner; Debug::log(LOG, "Window %x unmapped (class %s)", PWINDOW, g_pXWaylandManager->getAppIDClass(PWINDOW).c_str()); - g_pEventManager->postEvent(SHyprIPCEvent{"unmapwindow", getFormat("%x", PWINDOW)}); + + g_pEventManager->postEvent(SHyprIPCEvent{"closewindow", getFormat("%x", PWINDOW)}); if (!PWINDOW->m_bIsX11) { Debug::log(LOG, "Unregistered late callbacks XDG"); diff --git a/src/layout/IHyprLayout.cpp b/src/layout/IHyprLayout.cpp index 173668bc..f641ebc1 100644 --- a/src/layout/IHyprLayout.cpp +++ b/src/layout/IHyprLayout.cpp @@ -206,15 +206,7 @@ void IHyprLayout::onMouseMove(const Vector2D& mousePos) { if (PMONITOR) { DRAGGINGWINDOW->m_iMonitorID = PMONITOR->ID; - - if (DRAGGINGWINDOW->m_iWorkspaceID != PMONITOR->activeWorkspace) { - DRAGGINGWINDOW->m_iWorkspaceID = PMONITOR->activeWorkspace; - - auto PWORKSPACE = g_pCompositor->getWorkspaceByID(DRAGGINGWINDOW->m_iWorkspaceID); - if (PWORKSPACE) { - g_pEventManager->postEvent(SHyprIPCEvent{"movewindow", getFormat("%x,%s", DRAGGINGWINDOW, PWORKSPACE->m_szName.c_str())}); - } - } + g_pCompositor->moveWindowToWorkspace(DRAGGINGWINDOW, PMONITOR->activeWorkspace); DRAGGINGWINDOW->updateToplevel(); } @@ -239,7 +231,7 @@ void IHyprLayout::changeWindowFloatingMode(CWindow* pWindow) { if (!TILED) { const auto PNEWMON = g_pCompositor->getMonitorFromVector(pWindow->m_vRealPosition.vec() + pWindow->m_vRealSize.vec() / 2.f); pWindow->m_iMonitorID = PNEWMON->ID; - pWindow->m_iWorkspaceID = PNEWMON->activeWorkspace; + g_pCompositor->moveWindowToWorkspace(pWindow, PNEWMON->activeWorkspace); // save real pos cuz the func applies the default 5,5 mid const auto PSAVEDPOS = pWindow->m_vRealPosition.vec(); diff --git a/src/managers/KeybindManager.cpp b/src/managers/KeybindManager.cpp index c17886ff..7581f643 100644 --- a/src/managers/KeybindManager.cpp +++ b/src/managers/KeybindManager.cpp @@ -629,7 +629,7 @@ void CKeybindManager::moveActiveToWorkspace(std::string args) { OLDWORKSPACE->m_bHasFullscreenWindow = false; - PWINDOW->m_iWorkspaceID = PWORKSPACE->m_iID; + g_pCompositor->moveWindowToWorkspace(PWINDOW, PWORKSPACE->m_iID); PWINDOW->m_iMonitorID = PWORKSPACE->m_iMonitorID; PWINDOW->m_bIsFullscreen = false; @@ -670,8 +670,6 @@ void CKeybindManager::moveActiveToWorkspace(std::string args) { g_pInputManager->refocus(); PWINDOW->updateToplevel(); - - g_pEventManager->postEvent(SHyprIPCEvent{"movewindow", getFormat("%x,%s", PWINDOW, PWORKSPACE->m_szName.c_str())}); } void CKeybindManager::moveActiveToWorkspaceSilent(std::string args) { From f7f34468823b15e7a6d75710df0bff274a8e1981 Mon Sep 17 00:00:00 2001 From: Darksome Date: Sun, 21 Aug 2022 18:01:26 +0300 Subject: [PATCH 3/3] CCompositor::moveWindowToWorkspace -> CWindow::moveToWorkspace --- src/Compositor.cpp | 14 -------------- src/Compositor.hpp | 1 - src/Window.cpp | 11 +++++++++++ src/Window.hpp | 1 + src/layout/IHyprLayout.cpp | 4 ++-- src/managers/KeybindManager.cpp | 2 +- 6 files changed, 15 insertions(+), 18 deletions(-) diff --git a/src/Compositor.cpp b/src/Compositor.cpp index 3a73c1b4..088440f1 100644 --- a/src/Compositor.cpp +++ b/src/Compositor.cpp @@ -884,20 +884,6 @@ void CCompositor::moveWindowToTop(CWindow* pWindow) { } } -void CCompositor::moveWindowToWorkspace(CWindow* pWindow, int workspaceID) { - if (!windowValidMapped(pWindow)) - return; - - if (pWindow->m_iWorkspaceID != workspaceID) { - pWindow->m_iWorkspaceID = workspaceID; - - const auto PWORKSPACE = g_pCompositor->getWorkspaceByID(pWindow->m_iWorkspaceID); - if (PWORKSPACE) { - g_pEventManager->postEvent(SHyprIPCEvent{"movewindow", getFormat("%x,%s", pWindow, PWORKSPACE->m_szName.c_str())}); - } - } -} - void CCompositor::cleanupFadingOut(const int& monid) { for (auto& w : m_vWindowsFadingOut) { diff --git a/src/Compositor.hpp b/src/Compositor.hpp index 8e380c94..2e8c8dfe 100644 --- a/src/Compositor.hpp +++ b/src/Compositor.hpp @@ -132,7 +132,6 @@ public: bool doesSeatAcceptInput(wlr_surface*); bool isWindowActive(CWindow*); void moveWindowToTop(CWindow*); - void moveWindowToWorkspace(CWindow*, int); void cleanupFadingOut(const int& monid); CWindow* getWindowInDirection(CWindow*, char); void deactivateAllWLRWorkspaces(wlr_ext_workspace_handle_v1* exclude = nullptr); diff --git a/src/Window.cpp b/src/Window.cpp index 926d2da6..e9af0349 100644 --- a/src/Window.cpp +++ b/src/Window.cpp @@ -205,4 +205,15 @@ void CWindow::updateSurfaceOutputs() { wlr_surface_for_each_surface(g_pXWaylandManager->getWindowSurface(this), sendLeaveIter, PLASTMONITOR->output); wlr_surface_for_each_surface(g_pXWaylandManager->getWindowSurface(this), sendEnterIter, PNEWMONITOR->output); +} + +void CWindow::moveToWorkspace(int workspaceID) { + if (m_iWorkspaceID != workspaceID) { + m_iWorkspaceID = workspaceID; + + const auto PWORKSPACE = g_pCompositor->getWorkspaceByID(m_iWorkspaceID); + if (PWORKSPACE) { + g_pEventManager->postEvent(SHyprIPCEvent{"movewindow", getFormat("%x,%s", this, PWORKSPACE->m_szName.c_str())}); + } + } } \ No newline at end of file diff --git a/src/Window.hpp b/src/Window.hpp index 181ae74e..6504ef99 100644 --- a/src/Window.hpp +++ b/src/Window.hpp @@ -151,4 +151,5 @@ public: void destroyToplevelHandle(); void updateToplevel(); void updateSurfaceOutputs(); + void moveToWorkspace(int); }; diff --git a/src/layout/IHyprLayout.cpp b/src/layout/IHyprLayout.cpp index f641ebc1..09ca27c7 100644 --- a/src/layout/IHyprLayout.cpp +++ b/src/layout/IHyprLayout.cpp @@ -206,7 +206,7 @@ void IHyprLayout::onMouseMove(const Vector2D& mousePos) { if (PMONITOR) { DRAGGINGWINDOW->m_iMonitorID = PMONITOR->ID; - g_pCompositor->moveWindowToWorkspace(DRAGGINGWINDOW, PMONITOR->activeWorkspace); + DRAGGINGWINDOW->moveToWorkspace(PMONITOR->activeWorkspace); DRAGGINGWINDOW->updateToplevel(); } @@ -231,7 +231,7 @@ void IHyprLayout::changeWindowFloatingMode(CWindow* pWindow) { if (!TILED) { const auto PNEWMON = g_pCompositor->getMonitorFromVector(pWindow->m_vRealPosition.vec() + pWindow->m_vRealSize.vec() / 2.f); pWindow->m_iMonitorID = PNEWMON->ID; - g_pCompositor->moveWindowToWorkspace(pWindow, PNEWMON->activeWorkspace); + pWindow->moveToWorkspace(PNEWMON->activeWorkspace); // save real pos cuz the func applies the default 5,5 mid const auto PSAVEDPOS = pWindow->m_vRealPosition.vec(); diff --git a/src/managers/KeybindManager.cpp b/src/managers/KeybindManager.cpp index a79c0396..3f2e0a2c 100644 --- a/src/managers/KeybindManager.cpp +++ b/src/managers/KeybindManager.cpp @@ -679,7 +679,7 @@ void CKeybindManager::moveActiveToWorkspace(std::string args) { OLDWORKSPACE->m_bHasFullscreenWindow = false; - g_pCompositor->moveWindowToWorkspace(PWINDOW, PWORKSPACE->m_iID); + PWINDOW->moveToWorkspace(PWORKSPACE->m_iID); PWINDOW->m_iMonitorID = PWORKSPACE->m_iMonitorID; PWINDOW->m_bIsFullscreen = false;