From 9556bdabda987acb8bb8959cbfbe1e6f157cccf2 Mon Sep 17 00:00:00 2001 From: hansi Date: Mon, 24 Mar 2025 11:47:29 +0400 Subject: [PATCH] feat: add display-condition configuration option --- man/waybar-niri-workspaces.5.scd | 10 ++++++++++ src/modules/niri/workspaces.cpp | 19 ++++++++++++++----- 2 files changed, 24 insertions(+), 5 deletions(-) diff --git a/man/waybar-niri-workspaces.5.scd b/man/waybar-niri-workspaces.5.scd index 0c0249ca..12d79cdf 100644 --- a/man/waybar-niri-workspaces.5.scd +++ b/man/waybar-niri-workspaces.5.scd @@ -41,6 +41,16 @@ Addressed by *niri/workspaces* default: false ++ If set to true, only the active or focused workspace will be shown. +*display-condition*: ++ + typeof: string ++ + oneof: "show-all", "keep-named", "only-populated" ++ + default: "show-all" ++ + Specifies the conditions for showing workspace widgets. ++ + ++ + *show-all*: displays widgets for all workspaces. ++ + *keep-named*: always displays named workspaces, irrespective of whether they contain windows or not. ++ + *only-populated*: only displays widgets for workspaces that have windows. + *on-update*: ++ typeof: string ++ Command to execute when the module is updated. diff --git a/src/modules/niri/workspaces.cpp b/src/modules/niri/workspaces.cpp index d2fcad5d..6141e9e9 100644 --- a/src/modules/niri/workspaces.cpp +++ b/src/modules/niri/workspaces.cpp @@ -32,13 +32,22 @@ void Workspaces::doUpdate() { auto ipcLock = gIPC->lockData(); const auto alloutputs = config_["all-outputs"].asBool(); + const auto display_cond = config_["display-condition"].asString(); std::vector my_workspaces; const auto &workspaces = gIPC->workspaces(); - std::copy_if(workspaces.cbegin(), workspaces.cend(), std::back_inserter(my_workspaces), - [&](const auto &ws) { - if (alloutputs) return true; - return ws["output"].asString() == bar_.output->name; - }); + std::copy_if( + workspaces.cbegin(), workspaces.cend(), std::back_inserter(my_workspaces), + [&](const auto &ws) { + if (display_cond == "only-populated") { + if (ws["active_window_id"].isNull() && !ws["is_active"].asBool()) return false; + } else if (display_cond == "keep-named") { + if (ws["name"].isNull() && ws["active_window_id"].isNull() && !ws["is_active"].asBool()) + return false; + } + + if (alloutputs) return true; + return ws["output"].asString() == bar_.output->name; + }); // Remove buttons for removed workspaces. for (auto it = buttons_.begin(); it != buttons_.end();) {