diff --git a/hyprbars/README.md b/hyprbars/README.md index e966503..89abc21 100644 --- a/hyprbars/README.md +++ b/hyprbars/README.md @@ -52,4 +52,10 @@ Use the `hyprbars-button` keyword. ```ini hyprbars-button = color, size, icon, on-click -``` \ No newline at end of file +``` + +## Window rules + +Hyprbars supports the following _dynamic_ window rules: + +`plugin:hyprbars:nobar` -> disables the bar on matching windows. \ No newline at end of file diff --git a/hyprbars/barDeco.cpp b/hyprbars/barDeco.cpp index 68f0ba4..19a76ff 100644 --- a/hyprbars/barDeco.cpp +++ b/hyprbars/barDeco.cpp @@ -31,11 +31,11 @@ SDecorationPositioningInfo CHyprBar::getPositioningInfo() { static auto* const PPRECEDENCE = (Hyprlang::INT* const*)HyprlandAPI::getConfigValue(PHANDLE, "plugin:hyprbars:bar_precedence_over_border")->getDataStaticPtr(); SDecorationPositioningInfo info; - info.policy = DECORATION_POSITION_STICKY; + info.policy = m_bHidden ? DECORATION_POSITION_ABSOLUTE : DECORATION_POSITION_STICKY; info.edges = DECORATION_EDGE_TOP; info.priority = **PPRECEDENCE ? 10005 : 5000; info.reserved = true; - info.desiredExtents = {{0, **PHEIGHT}, {0, 0}}; + info.desiredExtents = {{0, m_bHidden ? 0 : **PHEIGHT}, {0, 0}}; return info; } @@ -381,7 +381,7 @@ void CHyprBar::renderBarButtonsText(CBox* barBox, const float scale, const float } void CHyprBar::draw(CMonitor* pMonitor, float a) { - if (!validMapped(m_pWindow)) + if (m_bHidden || !validMapped(m_pWindow)) return; const auto PWINDOW = m_pWindow.lock(); @@ -536,3 +536,12 @@ CBox CHyprBar::assignedBoxGlobal() { PHLWINDOW CHyprBar::getOwner() { return m_pWindow.lock(); } + +void CHyprBar::setHidden(bool hidden) { + if (m_bHidden == hidden) + return; + + m_bHidden = hidden; + + g_pDecorationPositioner->repositionDeco(this); +} diff --git a/hyprbars/barDeco.hpp b/hyprbars/barDeco.hpp index f270ef9..4d2cd97 100644 --- a/hyprbars/barDeco.hpp +++ b/hyprbars/barDeco.hpp @@ -33,6 +33,8 @@ class CHyprBar : public IHyprWindowDecoration { PHLWINDOW getOwner(); + void setHidden(bool hidden); + private: SWindowDecorationExtents m_seExtents; @@ -44,6 +46,7 @@ class CHyprBar : public IHyprWindowDecoration { CTexture m_tButtonsTex; bool m_bWindowSizeChanged = false; + bool m_bHidden = false; Vector2D cursorRelativeToBar(); diff --git a/hyprbars/main.cpp b/hyprbars/main.cpp index 7c98309..060f1a5 100644 --- a/hyprbars/main.cpp +++ b/hyprbars/main.cpp @@ -30,7 +30,7 @@ static void onCloseWindow(void* self, std::any data) { // data is guaranteed const auto 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; }); + 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; @@ -39,10 +39,21 @@ static void onCloseWindow(void* self, std::any data) { PWINDOW->removeWindowDeco(*BARIT); } -void onPreConfigReload() { +static void onPreConfigReload() { g_pGlobalState->buttons.clear(); } +static void onUpdateWindowRules(PHLWINDOW window) { + const auto BARIT = std::find_if(g_pGlobalState->bars.begin(), g_pGlobalState->bars.end(), [window](const auto& bar) { return bar->getOwner() == window; }); + + if (BARIT == g_pGlobalState->bars.end()) + return; + + const auto HASNOBAR = std::find_if(window->m_vMatchedRules.begin(), window->m_vMatchedRules.end(), [](const auto& rule) { return rule.szRule == "plugin:hyprbars:nobar"; }) != window->m_vMatchedRules.end(); + + (*BARIT)->setHidden(HASNOBAR); +} + Hyprlang::CParseResult onNewButton(const char* K, const char* V) { std::string v = V; CVarList vars(v); @@ -88,6 +99,8 @@ APICALL EXPORT PLUGIN_DESCRIPTION_INFO PLUGIN_INIT(HANDLE handle) { static auto P = HyprlandAPI::registerCallbackDynamic(PHANDLE, "openWindow", [&](void* self, SCallbackInfo& info, std::any data) { onNewWindow(self, data); }); static auto P2 = HyprlandAPI::registerCallbackDynamic(PHANDLE, "closeWindow", [&](void* self, SCallbackInfo& info, std::any data) { onCloseWindow(self, data); }); + static auto P3 = HyprlandAPI::registerCallbackDynamic(PHANDLE, "windowUpdateRules", + [&](void* self, SCallbackInfo& info, std::any data) { onUpdateWindowRules(std::any_cast(data)); }); HyprlandAPI::addConfigValue(PHANDLE, "plugin:hyprbars:bar_color", Hyprlang::INT{configStringToInt("rgba(33333388)")}); HyprlandAPI::addConfigValue(PHANDLE, "plugin:hyprbars:bar_height", Hyprlang::INT{15}); @@ -103,7 +116,7 @@ APICALL EXPORT PLUGIN_DESCRIPTION_INFO PLUGIN_INIT(HANDLE handle) { HyprlandAPI::addConfigValue(PHANDLE, "plugin:hyprbars:bar_button_padding", Hyprlang::INT{5}); HyprlandAPI::addConfigKeyword(PHANDLE, "hyprbars-button", onNewButton, Hyprlang::SHandlerOptions{}); - static auto P3 = HyprlandAPI::registerCallbackDynamic(PHANDLE, "preConfigReload", [&](void* self, SCallbackInfo& info, std::any data) { onPreConfigReload(); }); + static auto P4 = HyprlandAPI::registerCallbackDynamic(PHANDLE, "preConfigReload", [&](void* self, SCallbackInfo& info, std::any data) { onPreConfigReload(); }); // add deco to existing windows for (auto& w : g_pCompositor->m_vWindows) {