Provided by: sfwbar_1.0~beta13-1build2_amd64 

NAME
SFWBar - S* Floating Window taskBar
SYNOPSIS
sfwbar [options]
DESCRIPTION
SFWBar is a taskbar for wayland compositors. Originally written for Sway, it should work with any
compositor supporting layer-shell protocol. SFWBar assists in handling of floating windows on a wayland
desktop. It provides a taskbar, a pager, a task switcher, a system tray, a floating window placement
engine, a simple widget set for display data extracted from various system files. SFWBar can work with
any wayland compositor supporting layer shell protocol. Taskbar and switcher require either sway or
wlr-foreign-toplevel protocol support. Placer and pager require sway.
OPTIONS
SFWBar executable can be invoked with the following options:
-f | --config
Specify a filename of a configuration file
-c | --css
Specify a filename of a css file
-s | --socket
Specify a location of sway ipc socket
-m | --monitor
Specify a monitor to display the bar on ("-m list" to list available monitors)
-b | --bar_id
Specify a sway bar_id on which sfwbar will listen for status changes
CONFIGURATION
SFWBar reads configuration from a config file (sfwbar.config by default). The program checks users XDG
config directory (usually ~/.config/sfwbar/) for this file, followed by system xdg data directories.
Additionally, user can specify a location and a name of the config file using -f command line option.
Appearance of the program can be specified using CSS properties, these are sourced either from the css
section of the main configuration file or from a file with a .css extension with the same base name as
the config file located in the same directory as the config file. The name of the css file can be also
specified using -c option.
The config file consists of the following top level sections:
Placer
Placer section enables intelligent placement of new floating windows. If enabled the program will first
attempt to place the window in a location, where it won't overlap with other windows. If such location
doesn't exist, the window will be placed in a cascading pattern from top-left to bottom-right. The Placer
declaration accepts parameters "xstep" and "ystep" that specify the steps in the window cascade. These
are specified in percentage of the desktop dimensions. The cascade placement will start at a location
specified by "xorigin" "yorigin" parameters. I.e.:
placer {
xorigin = 5
yorigin = 5
xstep = 5
ystep = 5
children = false
}
"children" parameter specifies if new windows opened by a program with other windows already opened
should be placed. These are usually dialog windows and SFWBar won't place them by default. If the placer
section is not present in the file, SFWBar will let the compositor determine the locations for new
windows.
Task Switcher
Task switcher implements a keyboard shortcut to cycle focus across windows (i.e. Alt-Tab). The action is
triggered upon receiving a change in a bar hidden_state property or signal SIGUSR1. This can be
configured in Sway, via one of the following bindings:
bindsym Alt-Tab bar hidden_state toggle
or
bindsym Alt-Tab exec killall -SIGUSR1 sfwbar
(for non-sway compositors, use SIGUSR1 trigger)
NixOS + Hyprland (probably other non-sway compositors) use:
bind = ALT, Tab, exec, killall -SIGUSR1 .sfwbar-wrapped
Task switcher is configured in the "switcher" section of the configuration file. The following
parameters are accepted:
interval
an timeout after the last task switch event after which the selected window is activated
labels [true|false]
display window titles in the task list
icons [true|false]
display window icons in the task list
cols a number of columns in the task list
css css code applicable to the switcher grid. You can specify more detailed css code in the main CSS
file. Using style name #switcher for the task switcher window and the main grid and names
#switcher_normal and #switcher_active for inactive and active window representations respectively.
Layout
Defines the layout of the taskbar. The layout holds a set of widgets. Widgets can be nested in case of a
grid widget, which acts as a container.
The following widget types are supported:
taskbar
a special widget displaying a list of all floating windows. (requires a compositor supporting
wlr-foreign-toplevel protocol or i3 ipc)
pager a special widget displaying a list of all workspaces. (requires a compositor supporting
wlr-foreign-toplevel protocol or i3 ipc)
tray a special widget displaying a list of tray icons received via status notifier item interface
grid a layout grid capable of containing other widgets. You can use these to further subdivide each
cell of the main grid and arrange items within it.
label a label displaying text sourced from an expression. Labels accept pango markup to further theme
text within them.
scale a progress bar with a progress value specified by an expression
chart a chart plotting the value of the expression over time
image display an icon or an image from a file. The name of an icon or a file is specified by an
expression and can change dynamically.
button add a clickable button with an icon/image.
Each widget is placed within the parent grid. By default, widgets are placed next to the previous widget
along the "direction" of the grid (left to right by default). You can specify widget's positions within a
grid by using a property "loc(x,y[,w,h])" with the first two parameters specifying the location of the
widget within the parent grid and the last two parameters specifying the widget dimensions in grid cells:
layout "id" {
label {
style = "mystyle"
value = SwapUsed / SwapTotal + "%"
loc(2,1,1,1)
}
}
The optional "id" string of the layout, specifies the bar to populate and can control positioning of the
grid within a bar using syntax of "name:position", valid positions are start, center and end. This allows
placement of some widgets in the center of the bar. In case of a single bar, the name of a bar can be
omitted, i.e. ":center". External widgets can be included in layout using the following syntax:
layout {
include("MyWidget.widget")
}
The above will include all scanner variables data and widget sub-layout from file MyWidget.widget
Grid widgets can contain other widgets, these are declared within the grid definition i.e.
grid {
css = "* { border: none }"
label "id" {
...
}
}
Widgets can optionally have unique id's assigned to them in order to allow manipulating them in the
future. Widgets can have the following properties:
value an expression specifying the value to display. This can be a static value (i.e. "string" or 1) or
an expression (i.e. "Value is:" + $MyString or 2 * MyNumber.val). See expressions section for
more detail. For Label widgets value tells text to display. For Scale widgets it specifies a
fraction to display. For Chart widgets it specifies a fraction of the next datapoint. For Image
widgets and buttons it provides an icon or an image file name.
style a style name for the widget. Styles can be used in CSS to theme widgets. Multiple widgets can
have the same style. A style name can be used in css using gtk+ named widget convention, i.e.
label#mystyle. Style property can be set to an expression to change styles in response to changes
in system parameters.
tooltip
sets a tooltip for a widget. A tooltip can be a static value or an expression. In case of the
latter, the tooltip will be dynamically updated every time it pops up.
interval
widget update frequency in milliseconds..
trigger
trigger on which event updates. Triggers are emitted by Client sources a widget should not have
both an interval and a trigger specified. (if both are specified, interval is ignored and trigger
is used).
css additional css properties for the widget. These properties will only apply to the widget in
question.
action an action to execute upon interaction with a widget. Actions can be attached to any widget.
Multiple actions can be attached to various pointer events. The notation is action[<event>] =
<action>. Event values are 1,2,3 or LeftClick, MiddleClick or RightClick respectively. For mouse
scroll events, use values 4,5,6,7 or ScrollUp, ScrollDown, ScrollLeft and ScrollRight
respectively. If no index is specified the action is attached to a left mouse button click.
Additionallly, modifiers can be specified using the notation of [Modifier+]Index. I.e.
action[Ctrl+LeftClick]. The following modifiers supported: Shift, Ctrl, Mod1, Mod2, Mod3, Mod4,
Mod5i, Super, Hyper and Meta. Multiple modifiers can be added, i.e. action[Ctrl+Shift+ScrollUp].
action[0] will be executed on startup. You can use this action to set initial configuration for a
widget. See Actions section for more details on how actions are specified.
Taskbar widget may contain the following options
labels [true|false]
an indicator whether to display an application title within the taskbar
icons [true|false]
an indicator whether to display application icons within the taskbar
filter_output [true|false]
This property is deprecated, please use filter instead. specifies whether taskbar should only
list windows present on the same output as the taskbar
filter [output|workspace]
Specifies whether taskbar should only list windows present on the same output or workspace as the
taskbar itself.
title_width
set maximum width of an application title in characters
sort [true|false]
setting of whether taskbar items should be sorted. If the items are not sorted, user can sort them
manually via drag-and-drop mechanism. Items are sorted by default, set this to false to enable
drag-and-drop.
rows a number of rows in a taskbar.
cols a number of columns in a taskbar. If both rows and cols are specified, rows will be used. If
neither is specified, the default is rows=1
group [true|false]
if set to true, the taskbar items will be grouped by app_id, the main taskbar will contain one
item per app_id with an icon and a label set to app_id. On over, it will popup a "group taskbar"
containing items for individual windows. You can specify taskbar parameters for the group
taskbars using group prefix, i.e. group cols = 1. The properties supported for groups are cols,
rows, style, css, title_width, labels, icons.
Pager widget may contain the following options
preview [true|false]
specifies whether workspace previews are displayed on mouse hover over pager buttons
sort [true|false]
setting of whether pager items should be sorted. If the items are not sorted, user can sort them
manually via drag-and-drop mechanism. Items are sorted by default, set this to false to enable
drag-and-drop.
numeric [true|false]
if true, the workspaces will be sorted as numbers, otherwise they will be sorted as strings
(defaults to true).
pins a list of "pinned" workspaces. These will show up in the pager even if the workspace is empty.
rows a number of rows in a pager.
cols a number of columns in a pager. If both rows and cols are specified, rows will be used. If
neither is specified, the default is rows=1
tray widget may contain the following options
rows a number of rows in a pager.
cols a number of columns in a pager. If both rows and cols are specified, rows will be used. If
neither is specified, the default is rows=1
sort [true|false]
setting of whether tray items should be sorted. If the items are not sorted, user can sort them
manually via drag-and-drop mechanism. Items are sorted by default, set this to false to enable
drag-and-drop.
popup window may contain the following options
AutoClose [true|false]
specify whether the popup window should close if user clicks anywhere outside of the window.
PopUp
Popup windows can be defined the same way as layouts. The only difference is that popup's are not part of
a bar and will not be displayed by default. Instead they are displayed when a PopUp action is invoked on
a widget. i.e.:
PopUp "MyPopup" {
label { value = "test" }
}
Layout {
label {
value = "click me"
action = PopUp "MyPopup"
}
}
The PopUp action toggles visibility of the popup window. I.e. the first time it's invoked, the window
will pop up and on the second invocation it will pop down. As a result it should be safe to bind the
PopUp to multiple widgets.
Menus
User defined menus can be attached to any widget (see action widget property). Menus are defined using a
Menu section in the config file. The example syntax is as following:
menuclear("menu_name")
menu ("menu_name") {
item("item1", Exec "command")
separator
submenu("sub","mysubmenu") {
item("item2", SwayCmd "focus next")
}
}
Command MenuClear deletes any existing items from a menu. Each menu has a name used to link the menu to
the widget action and a list of menu items. If a menu with the same name is defined more than once, the
items from subsequence declarations will be appended to the original menu. If you want to re-define the
menu, use MenuClear action to clear the original menu.
The following menu items are supported:
item an actionable menu item. This item has two parameters, the first one is a label, the second is an
action to execute when the item is activated. See Actions section for more details on supported
actions.
separator
a menu separator. This item has no parameters
submenu
attach a submenu. The first parameter parameter is a label to display in the parent menu, the
second optional parameter is a menu name, if a menu name is assigned, further items can be added
to a submenu as to any other menu.
Triggers
Triggers are emitted in response to various events, such as compositor state changes, real time signals
or notifications from modules. Some triggers can be defined as part of the configuration (i.e.
SocketClient or ExecClient scanner sources), others are built in, or defined in modules.
Built-in triggers are:
─────────────────────────────────────────────────────────────────
SIGRTMIN+X RT signal SIGRTMIN+X has been
received (X is a number)
─────────────────────────────────────────────────────────────────
sway Data has been received on SwayClient
scanner source
─────────────────────────────────────────────────────────────────
mpd Data has been received on MpdClient
scanner source
─────────────────────────────────────────────────────────────────
<output>-connected an output has been connected (i.e.
eDP-1-connected)
─────────────────────────────────────────────────────────────────
<output>-disconnected an output has been disconnected
┌───────────────────────┬───────────────────────────────────────┐
│ │ │
Actions │ │ │
--
MISCELLANEOUS
If the icon is missing for a specific program in the taskbar or switcher, it is likely due to an missing
icon or application not setting app_id correctly. You can check app_id's of running programs by running
sfwbar -d -g app_id. if app_id is present, you need to add an icon with the appropriate name to your
icon theme. If it's blank, you can try mapping it from the program's title (please note that the title
may change during runtime, so matching it can be tricky). Mapping is supported via top-level MapAppId
keyword. I.e.
MapAppId app_id, pattern
where app_id is the desired app_id and pattern is a regular expression to match the title against.
If you are using an XWayland app, they usually do not have an app_id set. If an icon is not showing, you
can add your icon to the following locations: 1. $HOME/.icons 2. One of the directories listed in
$XDG_DATA_DIRS/icons 3. /usr/share/pixmaps 4. Location of the main config file currently in use 5.
$XDG_CONFIG_HOME/sfwbar/
If an app_id is not set, and sway is being used, sfwbar will fallback to using the instance in the
window-properties.
You can find the app_id that is being used with sfwbar by using the sfwbar -d -g app_id command, which
will show a list of running applications if your compositor supports the wlr-foreign-toplevel protocol
(i.e. labwc, wayfire, sway): ` 14:49:25.41 app_id: 'jetbrains-clion', title 'sfwbar – pager.c' `
Alternatively your desktop environment might have a command to display a list: - Sway: swaymsg -t
get_tree - Hyperland: hyprctl -j clients
When using swaymsg -t get_tree, with CLion this will show the following:
"window_properties": {
"class": "jetbrains-clion",
"instance": "jetbrains-clion",
"title": "sfwbar – trayitem.c",
"transient_for": null,
"window_type": "normal"
}
So we can put an icon called jetbrains-clion.svg (or other formats, see the [Arch wiki](‐
https://wiki.archlinux.org/title/desktop_entries#Icons)) for information about file formats.
CSS STYLE
SFWBar uses gtk+ widgets and can accept all css properties supported by gtk+. SFWBar widgets correspond
to gtk+ widgets as following:
┌───────────────┬────────────────┬──────────────────────────────┐
│ SFWBar widget │ gtk+ widget │ css class │
├───────────────┼────────────────┼──────────────────────────────┤
│ label │ GtkLabel │ label │
├───────────────┼────────────────┼──────────────────────────────┤
│ image │ GtkImage │ image │
├───────────────┼────────────────┼──────────────────────────────┤
│ button │ GtkButton │ button │
├───────────────┼────────────────┼──────────────────────────────┤
│ scale │ GtkProgressBar │ progressbar, trough, │
│ │ │ progress │
└───────────────┴────────────────┴──────────────────────────────┘
Taskbar, Pager, Tray and Switcher use combinations of these widgets and can be themed using gtk+ nested
css convention, i.e. grid#taskbar button { ... } (this example assumes you assigned style = taskbar to
your taskbar widget).
In addition to standard gtk+ css properties SFWBar implements several additional properties. These are:
┌───────────────────────┬───────────────────────────────────────┐
│ property │ description │
├───────────────────────┼───────────────────────────────────────┤
│ -GtkWidget-align │ specify text alignment for a label, │
│ │ defined as a fraction. (0 = left │
│ │ aligned, 1 = right aligned, 0.5 = │
│ │ centered) │
├───────────────────────┼───────────────────────────────────────┤
│ -GtkWidget-ellipsize │ specify whether a text in a label │
│ │ should be ellipsized if it's too long │
│ │ to fit in allocated space │
├───────────────────────┼───────────────────────────────────────┤
│ -GtkWidget-direction │ specify a direction for a widget. │
│ │ For scale, it's a direction towards │
│ │ which scale grows. For a grid, it's │
│ │ a direction in which a new widget is │
│ │ position relative to the last placed │
│ │ widget. For a window it's an edge │
│ │ along which the bar is positioned. │
│ │ Possible values │
│ │ [top|bottom|left|right] │
├───────────────────────┼───────────────────────────────────────┤
│ -GtkWidget-max-width │ Limit maximum width of a widget (in │
│ │ pixels) │
├───────────────────────┼───────────────────────────────────────┤
│ -GtkWidget-max-height │ Limit maximum height of a widget (in │
│ │ pixels) │
├───────────────────────┼───────────────────────────────────────┤
│ -GtkWidget-hexpand │ specify if a widget should expand │
│ │ horizontally to occupy available │
│ │ space. [true|false] │
├───────────────────────┼───────────────────────────────────────┤
│ -GtkWidget-vexpand │ as above, for vertical expansion. │
├───────────────────────┼───────────────────────────────────────┤
│ -GtkWidget-halign │ Horizontally align widget within any │
│ │ free space allocated to it, values │
│ │ supported are: fill, start, end, │
│ │ center and baseline. The last │
│ │ vertically aligns widgets to align │
│ │ text within. │
├───────────────────────┼───────────────────────────────────────┤
│ -GtkWidget-valign │ Vertically align widget. │
├───────────────────────┼───────────────────────────────────────┤
│ -GtkWidget-visible │ Control visibility of a widget. If │
│ │ set to false, widget will be hidden. │
├───────────────────────┼───────────────────────────────────────┤
│ -ScaleImage-color │ Specify a color to repaint an image │
│ │ with. The image will be painted with │
│ │ this color using image's alpha │
│ │ channel as a mask. The color's own │
│ │ alpha value can be used to tint an │
│ │ image. │
├───────────────────────┼───────────────────────────────────────┤
│ -ScaleImage-symbolic │ Render an image as a symbolic icon. │
│ │ If set to true, the image will be │
│ │ re-colored to the gtk theme │
│ │ foreground color, preserving the │
│ │ image alpha channel. This property is │
│ │ ignored if -ScaleImage-color is │
│ │ specified. │
└───────────────────────┴───────────────────────────────────────┘
Taskbar and pager buttons are assigned the following styles
───────────────────────────────────────────────────────────
style name description
───────────────────────────────────────────────────────────
sfwbar toplevel bar window
───────────────────────────────────────────────────────────
layout top level layout grid
───────────────────────────────────────────────────────────
taskbar_normal taskbar button for a window
───────────────────────────────────────────────────────────
taskbar_active taskbar button for currently focused
window
───────────────────────────────────────────────────────────
pager_normal pager button for a workspace
───────────────────────────────────────────────────────────
pager_visible pager button for a visible workspace
───────────────────────────────────────────────────────────
pager_focused pager button for a currently focused
workspace
───────────────────────────────────────────────────────────
switcher switcher window and top level grid
───────────────────────────────────────────────────────────
switcher_active switcher active window representation
───────────────────────────────────────────────────────────
switcher_normal switcher inactive window
representation
───────────────────────────────────────────────────────────
tray tray menus and menu items
───────────────────────────────────────────────────────────
tray_active active tray icon
───────────────────────────────────────────────────────────
tray_attention tray icon requiring user attention
───────────────────────────────────────────────────────────
tray_passive passive tray icon
───────────────────────────────────────────────────────────
menu_item menu items (each contains an image
and a label)
┌─────────────────┬───────────────────────────────────────┐
│ │ │
--
COPYRIGHT │ │ │
GPLv3+ │ │ │
│ │ │
│ │ │
│ │ │ SFWBAR(1)
│ │ │
│ │ │
│ │ │
│ │ │
│ │ │
│ │ │
│ │ │
│ │ │
│ │ │
│ │ │
│ │ │
│ │ │
│ │ │
│ │ │
│ │ │
│ │ │
│ │ │
│ │ │
│ │ │
│ │ │
│ │ │
│ │ │
│ │ │
│ │ │
│ │ │
│ │ │