mirror of
https://github.com/hyprwm/hyprland-plugins.git
synced 2024-12-22 15:09:47 +01:00
hyprbars: support a dynamic nobar window rule
fixes #70 fixes #28 ref #74
This commit is contained in:
parent
97e9d252ff
commit
18daf37b7c
4 changed files with 38 additions and 7 deletions
|
@ -52,4 +52,10 @@ Use the `hyprbars-button` keyword.
|
|||
|
||||
```ini
|
||||
hyprbars-button = color, size, icon, on-click
|
||||
```
|
||||
```
|
||||
|
||||
## Window rules
|
||||
|
||||
Hyprbars supports the following _dynamic_ window rules:
|
||||
|
||||
`plugin:hyprbars:nobar` -> disables the bar on matching windows.
|
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -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();
|
||||
|
||||
|
|
|
@ -30,7 +30,7 @@ static void onCloseWindow(void* self, std::any data) {
|
|||
// data is guaranteed
|
||||
const auto PWINDOW = std::any_cast<PHLWINDOW>(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<PHLWINDOW>(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) {
|
||||
|
|
Loading…
Reference in a new issue