diff --git a/src/main.cpp b/src/main.cpp index e69ada5..9838f0a 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -1,6 +1,7 @@ #include "globals.hpp" #include +#include #include #include // version.hpp will be generated by meson @@ -285,12 +286,16 @@ class CRenderWobblyWindowPassElement final: public IPassElement { PHLWINDOWREF m_pWindow; }; -// TODO: unregister on close void registerWindow(PHLWINDOW pWindow) { g_windowPositions[pWindow] = pWindow->m_realPosition->value(); } +void unregisterWindow(PHLWINDOW pWindow) { + g_windowPositions.erase(PHLWINDOWREF {pWindow}); +} + static SP g_openWindow = nullptr; +static SP g_closeWindow = nullptr; inline CFunctionHook* g_pRenderWindowHook = nullptr; typedef void (*origRenderWindow)( @@ -518,6 +523,14 @@ APICALL EXPORT PLUGIN_DESCRIPTION_INFO PLUGIN_INIT(HANDLE handle) { } ); + g_closeWindow = HyprlandAPI::registerCallbackDynamic( + PHANDLE, + "closeWindow", + [](void* self, SCallbackInfo& info, std::any data) { + unregisterWindow(std::any_cast(data)); + } + ); + static const auto METHODS = HyprlandAPI::findFunctionsByName(PHANDLE, "renderWindow"); g_pRenderWindowHook = HyprlandAPI::createFunctionHook(handle, METHODS[0].address, (void*)&hkRenderWindow);