Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions include/modules/hyprland/workspaces.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -56,6 +56,7 @@ class Workspaces : public AModule, public EventHandler {
auto taskbarReverseDirection() const -> bool { return m_taskbarReverseDirection; }
auto onClickWindow() const -> std::string { return m_onClickWindow; }
auto getIgnoredWindows() const -> std::vector<std::regex> { return m_ignoreWindows; }
auto maxWindows() const -> int { return m_maxWindows; }

enum class ActiveWindowPosition { NONE, FIRST, LAST };
auto activeWindowPosition() const -> ActiveWindowPosition { return m_activeWindowPosition; }
Expand Down Expand Up @@ -89,6 +90,7 @@ class Workspaces : public AModule, public EventHandler {
auto populateIgnoreWorkspacesConfig(const Json::Value& config) -> void;
auto populateFormatWindowSeparatorConfig(const Json::Value& config) -> void;
auto populateWindowRewriteConfig(const Json::Value& config) -> void;
auto populateMaxWindowsConfig(const Json::Value& config) -> void;
auto populateWorkspaceTaskbarConfig(const Json::Value& config) -> void;

void registerIpc();
Expand Down Expand Up @@ -202,6 +204,7 @@ class Workspaces : public AModule, public EventHandler {
};
std::string m_onClickWindow;
std::string m_currentActiveWindowAddress;
int m_maxWindows = 0;

std::vector<std::regex> m_ignoreWorkspaces;
std::vector<std::regex> m_ignoreWindows;
Expand Down
5 changes: 5 additions & 0 deletions man/waybar-hyprland-workspaces.5.scd
Original file line number Diff line number Diff line change
Expand Up @@ -98,6 +98,11 @@ This setting is ignored if *workspace-taskbar.enable* is set to true.
- {button} Pressed button number, see https://api.gtkd.org/gdk.c.types.GdkEventButton.button.html. ++
See https://github.com/Alexays/Waybar/wiki/Module:-Hyprland#workspace-taskbars-example for a full example.

*max-windows*: ++
typeof: int ++
default: 0 (unlimited) ++
Maximum number of windows to show per workspace. When set, newest windows beyond the limit are not shown. Set to 0 for unlimited windows.

*show-special*: ++
typeof: bool ++
default: false ++
Expand Down
15 changes: 10 additions & 5 deletions src/modules/hyprland/workspace.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -247,13 +247,14 @@ void Workspace::update(const std::string& workspace_icon) {
auto windowSeparator = m_workspaceManager.getWindowSeparator();

bool isNotFirst = false;
auto end_it = m_workspaceManager.maxWindows() == 0 ? m_windowMap.end() : m_windowMap.begin() + m_workspaceManager.maxWindows();

for (const auto& window_repr : m_windowMap) {
for (auto it = m_windowMap.begin(); it != end_it; ++it) {
if (isNotFirst) {
windows.append(windowSeparator);
}
isNotFirst = true;
windows.append(window_repr.repr_rewrite);
windows.append(it->repr_rewrite);
}
}

Expand Down Expand Up @@ -339,12 +340,16 @@ void Workspace::updateTaskbar(const std::string& workspace_icon) {
};

if (m_workspaceManager.taskbarReverseDirection()) {
for (auto it = m_windowMap.rbegin(); it != m_windowMap.rend(); ++it) {
auto rend_it = m_workspaceManager.maxWindows() == 0 ? m_windowMap.rend() : m_windowMap.rbegin() + m_workspaceManager.maxWindows();

for (auto it = m_windowMap.rbegin(); it != rend_it; ++it) {
processWindow(*it);
}
} else {
for (const auto& window_repr : m_windowMap) {
processWindow(window_repr);
auto end_it = m_workspaceManager.maxWindows() == 0 ? m_windowMap.end() : m_windowMap.begin() + m_workspaceManager.maxWindows();

for (auto it = m_windowMap.begin(); it != end_it; ++it) {
processWindow(*it);
}
}

Expand Down
10 changes: 10 additions & 0 deletions src/modules/hyprland/workspaces.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -665,6 +665,7 @@ auto Workspaces::parseConfig(const Json::Value& config) -> void {
populateIgnoreWorkspacesConfig(config);
populateFormatWindowSeparatorConfig(config);
populateWindowRewriteConfig(config);
populateMaxWindowsConfig(config);

if (withWindows) {
populateWorkspaceTaskbarConfig(config);
Expand Down Expand Up @@ -746,6 +747,15 @@ auto Workspaces::populateWindowRewriteConfig(const Json::Value& config) -> void
[this](std::string& window_rule) { return windowRewritePriorityFunction(window_rule); });
}

auto Workspaces::populateMaxWindowsConfig(const Json::Value& config) -> void {
if (config["max-windows"].isInt()) {
m_maxWindows = config["max-windows"].asInt();
if (m_maxWindows < 0) {
m_maxWindows = 0;
}
}
}

auto Workspaces::populateWorkspaceTaskbarConfig(const Json::Value& config) -> void {
const auto& workspaceTaskbar = config["workspace-taskbar"];
if (!workspaceTaskbar.isObject()) {
Expand Down