feat: add display-condition configuration option

This commit is contained in:
hansi
2025-03-24 11:47:29 +04:00
parent 8490a1d9b9
commit 9556bdabda
2 changed files with 24 additions and 5 deletions
+10
View File
@@ -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.
+14 -5
View File
@@ -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<Json::Value> 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();) {