From adec334acfb453014cdff1e5f070bb7c1c4e4a9b Mon Sep 17 00:00:00 2001 From: Vaxry Date: Thu, 21 Mar 2024 18:58:10 +0000 Subject: [PATCH] hyprbars: remove deco on unmap fixes #71 --- hyprbars/barDeco.cpp | 6 +++++- hyprbars/barDeco.hpp | 2 ++ hyprbars/main.cpp | 16 +++++++++++++++- 3 files changed, 22 insertions(+), 2 deletions(-) diff --git a/hyprbars/barDeco.cpp b/hyprbars/barDeco.cpp index ae20fc2..5a981f5 100644 --- a/hyprbars/barDeco.cpp +++ b/hyprbars/barDeco.cpp @@ -518,4 +518,8 @@ CBox CHyprBar::assignedBoxGlobal() { const auto WORKSPACEOFFSET = PWORKSPACE && !m_pWindow->m_bPinned ? PWORKSPACE->m_vRenderOffset.value() : Vector2D(); return box.translate(WORKSPACEOFFSET); -} \ No newline at end of file +} + +CWindow* CHyprBar::getOwner() { + return m_pWindow; +} diff --git a/hyprbars/barDeco.hpp b/hyprbars/barDeco.hpp index b2e12d4..06ae062 100644 --- a/hyprbars/barDeco.hpp +++ b/hyprbars/barDeco.hpp @@ -31,6 +31,8 @@ class CHyprBar : public IHyprWindowDecoration { virtual std::string getDisplayName(); + CWindow* getOwner(); + private: SWindowDecorationExtents m_seExtents; diff --git a/hyprbars/main.cpp b/hyprbars/main.cpp index 8812d32..19f2809 100644 --- a/hyprbars/main.cpp +++ b/hyprbars/main.cpp @@ -15,7 +15,7 @@ APICALL EXPORT std::string PLUGIN_API_VERSION() { return HYPRLAND_API_VERSION; } -void onNewWindow(void* self, std::any data) { +static void onNewWindow(void* self, std::any data) { // data is guaranteed auto* const PWINDOW = std::any_cast(data); @@ -26,6 +26,19 @@ void onNewWindow(void* self, std::any data) { } } +static void onCloseWindow(void* self, std::any data) { + // data is guaranteed + auto* const PWINDOW = std::any_cast(data); + + const auto BARIT = std::find_if(g_pGlobalState->bars.begin(), g_pGlobalState->bars.end(), [PWINDOW](const auto& bar) { return bar->getOwner() == PWINDOW; }); + + if (BARIT == g_pGlobalState->bars.end()) + return; + + // we could use the API but this is faster + it doesn't matter here that much. + PWINDOW->removeWindowDeco(*BARIT); +} + void onPreConfigReload() { g_pGlobalState->buttons.clear(); } @@ -74,6 +87,7 @@ APICALL EXPORT PLUGIN_DESCRIPTION_INFO PLUGIN_INIT(HANDLE handle) { g_pGlobalState = std::make_unique(); HyprlandAPI::registerCallbackDynamic(PHANDLE, "openWindow", [&](void* self, SCallbackInfo& info, std::any data) { onNewWindow(self, data); }); + HyprlandAPI::registerCallbackDynamic(PHANDLE, "closeWindow", [&](void* self, SCallbackInfo& info, std::any data) { onCloseWindow(self, data); }); HyprlandAPI::addConfigValue(PHANDLE, "plugin:hyprbars:bar_color", Hyprlang::INT{configStringToInt("rgba(33333388)")}); HyprlandAPI::addConfigValue(PHANDLE, "plugin:hyprbars:bar_height", Hyprlang::INT{15});