Scripting Monitors (Gnome & Wayland on Fedora)
On my PC (Fedora 39, Gnome Desktop Environment via Wayland) I often find myself switching monitor configuration. I have a dual-4k-screen setup, and jump between a few modes:
- Normal/Development - Dual screen, both at 175% scale
- Gaming - Single screen at 100% scale
- Recording - Dual screen, alternate primary screen, one 2x scale, one 1.2x scale
While not tricky, it’s a fiddly process to frequently configure monitor settings. Therefore I wanted to automate this process. Looking online, most tools and guides used old techniques which were incompatible with my current desktop environment.
Then I came across gnome-monitor-config.
After compiling and testing this out, it seemed to do the job!
Then I found I didn’t need to compile it myself since it’s already available in the
Fedora repos under the “gnome-monitor-config” package, so I just needed a
sudo dnf install gnome-monitor-config
to get it installed.
Once available, I then wrote a simple bash script with my various configurations:
#!/bin/bash
if [ -z "$1" ]; then
echo "Setting monitors to default state"
echo "================================="
gnome-monitor-config set -LM DP-2 -m 3840x2160@59.997 -x 2192 -y 0 -t normal -s 1.7518248558044434 \
-LpM DP-1 -m 3840x2160@59.997 -x 0 -y 0 -t normal -s 1.7518248558044434
else
case "$1" in
"gaming")
echo "Setting monitors up for gaming"
echo "=============================="
gnome-monitor-config set -LpM DP-1 -m 3840x2160@59.997 -x 0 -y 0 -t normal -s 1
;;
"recording")
echo "Setting monitors for recording"
echo "=============================="
gnome-monitor-config set -LpM DP-2 -m 3840x2160@59.997 -x 1920 -y 0 -t normal -s 1.5 \
-LM DP-1 -m 3840x2160@59.997 -x 0 -y 0 -t normal -s 2
;;
*)
echo "Unknown argument: $1; Valid arguments: gaming, recording (pass nothing for default)"
;;
esac
fi
With this saved to a monitors
executable file in my PATH
, I can just run monitors gaming
to configure things for gaming, monitors recording
for recording, or just monitors
to
return things to my default setup.
Details of the syntax and options can be found in the readme
of the gnome-monitor-config repo. The only thing I found fiddly was the x
and y
positioning.
This had to be correct with monitors adjacent, which may not be obvious to work out when scaling is involved.
To get correct figures, I found I could configure my monitors as normal via gnome settings, then read
my ~/.config/monitors.xml
file to understand the values gnome uses and accepts.
This has seemed to work pretty well so far. I sometimes see some rendering noise/artifacts after switching, but not always and it goes away in seconds.