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/events/Windows.cpp b/src/events/Windows.cpp index 071061f6..c195a115 100644 --- a/src/events/Windows.cpp +++ b/src/events/Windows.cpp @@ -331,12 +331,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{"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 4a3f1800..09ca27c7 100644 --- a/src/layout/IHyprLayout.cpp +++ b/src/layout/IHyprLayout.cpp @@ -206,8 +206,8 @@ void IHyprLayout::onMouseMove(const Vector2D& mousePos) { if (PMONITOR) { DRAGGINGWINDOW->m_iMonitorID = PMONITOR->ID; - DRAGGINGWINDOW->m_iWorkspaceID = 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; - pWindow->m_iWorkspaceID = 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 c38d82dc..8d09d650 100644 --- a/src/managers/KeybindManager.cpp +++ b/src/managers/KeybindManager.cpp @@ -717,7 +717,7 @@ void CKeybindManager::moveActiveToWorkspace(std::string args) { OLDWORKSPACE->m_bHasFullscreenWindow = false; - PWINDOW->m_iWorkspaceID = PWORKSPACE->m_iID; + PWINDOW->moveToWorkspace(PWORKSPACE->m_iID); PWINDOW->m_iMonitorID = PWORKSPACE->m_iMonitorID; PWINDOW->m_bIsFullscreen = false;