Swaybar
Swaybar is the default bar that comes with Sway, a tiling window manager for Wayland. By default it displays only the workspace indicator and time, it looks like this:
It’s functional but a little plain. This is what mine looks like:
Aesthetic Changes
There are main ways to make it look better:
Fonts
Fonts can be specified in ~/.config/sway/config
: just add font pango:Fira Sans SemiBold 9
or similar somewhere.
This font is also used for window titles, if you haven’t disabled them with default_border pixel
.
Colors
To change the bar colors, edit the colors
subsection in the bar
block:
bar {
colors {
statusline #ebdbb2
background #3c3836
# Outline, Background, Foreground
inactive_workspace #282828 #282828 #928374
focused_workspace #83a598 #458588 #eddbb2
}
}
Functional Changes
How do we add more useful things to the bar?
The first step is to move the status_command
into its own file, replace the line with status_command ~/.config/sway/bar.sh
or whatever file you’d like, then create that file and make sure to run chmod +x ~/.config/sway/bar.sh
so it can be executed.
Inside this file you will need a while
loop so that it always updates at a constant step:
while true
do
msg='This will display on the bar'
echo "$msg"
sleep 1
done
Now adding things to the bar is simply echo
ing output from the script.
For cleanliness, I put all of the components I want to display in their own variables just as shown above with msg
.
To divide things up for readability, I separate my components with vertical pipe characters: echo "$msg | $time"
, etc.
Custom Time Format
I didn’t like the default datetime format, so I split it up. Inside the while loop I have the following:
# $(cmd) stores the output of cmd
date=$(date +'%A, %b %d')
time=$(date +'%I%M %p')
# => Friday, Mar 05 | 03:47 PM
echo "$date | $time"
sleep 1
Volume
This will work for both pulseaudio and pipewire, which I recently switched to.
Install pamixer
if you don’t have it already, then you can store the output of pamixer --get-volume
in a variable, and echo "$vol%
to suffix it with a percent sign.
MPD Music
The command to be stored and echo'd
here is mpc -f "%title% - %artist%" | head -n 1
.
head
is used to remove unwanted lines from mpc
(may need to be installed) output.
Weather
This took me a bit to get right.
We want a fast refresh rate (sleep 1
= update every second) for time and music, but making an HTTP request to get the current temperature every second is:
- unnecessary
- wasteful of power
- likely to get your IP address rate-limited/banned
My solution is to read from a temporary file every second, but only update the temporary file every 15 minutes.
In my bar.sh
script, I have temp=$(cat /tmp/weather)
.
In the Sway configuration file I have exec ~/.config/sway/weather.sh
to start the script to update the temporary file when Sway starts.
weather.sh
is a bit more involved:
while true
do
# Get output silently, remove unwanted lines, reformat, output to temp file
curl -s wttr.in?QT0 | grep -m 1 ' °F' | perl -pe 's/.*?\+(\d+2)(\(d+\))? °F.*$/$1$2 °F/' > /tmp/weather
sleep 900
done
You may want to curl wttr.in
to make sure it is getting weather data for the correct location.
If it isn’t, add /cityname
to the end of the URL.
Conclusion
It’s easy to add any information you want to Swaybar.
Simply echo
the data you want in a script pointed to by the Sway configuration file.
If Swaybar doesn’t meet your customization/aesthetic needs, have a look at Waybar.
Comments