Files
Waybar/man/waybar-niri-workspaces.5.scd
T
AlexandClaude Opus 4.8 f72f84e011 fix: backward-compat + bug fixes and man-page build fix for 0.16.0
Post-0.15.0 review of the 0.15.0..HEAD range surfaced regressions and
bugs. This restores backward compatibility for existing configs/CSS,
fixes confirmed defects, and repairs the scdoc man-page build break on
master. Pango-markup tooltips are intentional and were kept.

Backward-compat restorations:
- AModule: honor legacy numeric Gdk::CursorType cursor values (int overload)
- memory: correct GiB divisor (was ~2.3% low); round bare {} placeholders
- wireplumber: scale max-volume into the linear domain so the cap works again
- idle_inhibitor: gate right/middle-click deactivate & scroll on dynamic-timeouts;
  accept both dynamic-timeout(s); widen timeout to double (no fractional truncation)
- custom: keep #custom-<name>.<class> CSS selectors working (classes on box_)
- image: don't wordexp-split a single path; fall back to the literal path
- niri/window: restore hide-when-empty (new show-empty opt-in); escape tooltip
- wlr/taskbar: plain-text tooltip when markup is disabled

Bug fixes:
- tray: fix use-after-free in onAdd; guard the watcher retry timeout
- hyprland: clamp max-windows iterator (OOB); drop duplicate language tooltip block
- niri/window: supply {col}/{max_col} args in the empty branch (fmt::format_error)
- mpris: escape {dynamic}/{player} tooltip; fix dangling player; albumArtist source
- mango: fix use-after-free race (dispatch under callback_mutex_)
- mpd: contain throwing checkErrors in noexcept idle paths (no std::terminate/UAF)
- keyboard_state: always render every lock label, with guarded defaults
- bluetooth: bound GATT ReadValue timeout, opt-in + services-resolved gating,
  preserve authoritative Battery1 percentage
- wireplumber: fix WpDevice reference leak / NULL handling
- battery, clock, dwl, wayfire, graph, custom_graph, transform, river: assorted
  crash/logic fixes

Man page / build:
- niri-workspaces: fix scdoc "indented by an amount greater than 1"
  (workspace-taskbar sub-options were mis-indented; breaks man-page build)
- document new show-empty (niri/window); correct network {txBitrate}/{rxBitrate}

Not compiled locally (no gtkmm on this host); C++ build relies on CI.
Man pages validated with scdoc 1.11.4.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-04 02:14:13 +02:00

206 lines
5.9 KiB
Scdoc

waybar-niri-workspaces(5)
# NAME
waybar - niri workspaces module
# DESCRIPTION
The *workspaces* module displays the currently used workspaces in niri.
# CONFIGURATION
Addressed by *niri/workspaces*
*all-outputs*: ++
typeof: bool ++
default: false ++
If set to false, workspaces will only be shown on the output they are on. If set to true all workspaces will be shown on every output.
*sort-by-name*: ++
typeof: bool ++
default: false ++
Sort workspaces by name (numeric sort when all names are numbers). Unnamed workspaces fall back to their index on the output.
*sort-by-coordinates*: ++
typeof: bool ++
default: false ++
Sort workspaces by output and index. If both *sort-by-name* and *sort-by-coordinates* are true, sorting by name is applied.
*sort-by-id*: ++
typeof: bool ++
default: false ++
Sort workspaces by id, taking precedence over other sort options.
*sort-by-number*: ++
typeof: bool ++
default: false ++
Deprecated alias for *sort-by-id*; prefer *sort-by-id* instead.
If none of the sorting options are enabled, workspaces keep their output/index order.
*format*: ++
typeof: string ++
default: {value} ++
The format, how information should be displayed.
*format-icons*: ++
typeof: array ++
Based on the workspace name, index and state, the corresponding icon gets selected. See *icons*.
*disable-click*: ++
typeof: bool ++
default: false ++
If set to false, you can click to change workspace. If set to true this behaviour is disabled.
*enable-bar-scroll*: ++
typeof: bool ++
default: false ++
If set to false, you can't scroll to cycle throughout workspaces from the entire bar. If set to true this behaviour is enabled.
*disable-markup*: ++
typeof: bool ++
default: false ++
If set to true, button label will escape pango markup.
*current-only*: ++
typeof: bool ++
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.
*hide-empty*: ++
typeof: bool ++
default: false ++
If set to true, empty workspaces will not be shown.
*on-update*: ++
typeof: string ++
Command to execute when the module is updated.
*expand*: ++
typeof: bool ++
default: false ++
Enables this module to consume all left over space dynamically.
*workspace-taskbar*: ++
typeof: object ++
Contains settings for the workspace taskbar, which displays app icons within each workspace.
*enable*: ++
typeof: bool ++
default: false ++
Enables the workspace taskbar mode.
*icon-size*: ++
typeof: int ++
default: 18 ++
Size of the icons in the workspace taskbar.
*ignore-workspaces*: ++
typeof: array ++
default: [] ++
Regexes to match against workspaces names and index's. If there's a match, the workspace will not be shown.
*format-window-separator*: ++
typeof: string ++
default: " " ++
Separator used between window representations generated by *window-rewrite*.
*window-rewrite*: ++
typeof: object ++
default: {} ++
Rules to map window app_id and/or title to a specific string representation (e.g., an icon). Keys are regular expressions matching `app_id<regex>` and/or `title<regex>`. Values are the replacement strings, which can contain `{app_id}` and `{title}` placeholders.
*window-rewrite-default*: ++
typeof: string ++
default: "?" ++
The default representation for windows that don't match any rule in *window-rewrite*.
# FORMAT REPLACEMENTS
*{value}*: Name of the workspace, or index for unnamed workspaces,
as defined by niri.
*{name}*: Name of the workspace for named workspaces.
*{icon}*: Icon, as defined in *format-icons*.
*{index}*: Index of the workspace on its output.
*{output}*: Output where the workspace is located.
*{total}*: The total number of workspaces.
*{windows}*: Concatenated representation of windows in the workspace, using *window-rewrite* rules and *format-window-separator*.
# ICONS
Additional to workspace name matching, the following *format-icons* can be set.
- *default*: Will be shown, when no string matches are found.
- *focused*: Will be shown, when workspace is focused.
- *active*: Will be shown, when workspace is active on its output.
- *urgent*: Will be shown, when workspace has urgent windows.
- *empty*: Will be shown, when workspace is empty.
# EXAMPLES
```
"niri/workspaces": {
"format": "{icon} {windows}",
"format-window-separator": "|",
"window-rewrite-default": "",
"window-rewrite": {
"app_id<firefox>": "",
"app_id<foot>": "",
"app_id<org.gnome.Nautilus> title<.*Downloads.*>": "",
"app_id<org.gnome.Nautilus>": ""
},
"format-icons": {
// Named workspaces
// (you need to configure them in niri)
"browser": "",
"discord": "",
"chat": "<b></b>",
// Icons by state
"active": "",
"default": ""
}
}
```
```
"niri/workspaces": {
"format": "{icon}",
"workspace-taskbar": {
"enable": true,
"icon-size": 18
}
}
```
# Style
- *#workspaces button*
- *#workspaces button.focused*: The single focused workspace.
- *#workspaces button.active*: The workspace is active (visible) on its output.
- *#workspaces button.urgent*: The workspace has one or more urgent windows.
- *#workspaces button.empty*: The workspace is empty.
- *#workspaces button.current_output*: The workspace is from the same output as
the bar that it is displayed on.
- *#workspaces button#niri-workspace-<name>*: Workspaces named this, or index
for unnamed workspaces.
- *#workspaces button.niri-workspace*: The main container for the workspace.
- *#workspaces button .niri-taskbar-btn*: The icon buttons within the taskbar.