Sway is a tiling Wayland compositor which has mostly the same features, look and workflow as the i3 X11 window manager. Because Sway uses Wayland instead of X11, the tools to setup X11 don’t always work in sway. This includes tools like xrandr, which are used in X11 window managers or desktops to setup monitors. This is why monitors have to be setup by editing the sway config file, and that’s what this article is about.
Getting your monitor ID’s
First, you have to get the names sway uses to refer to your monitors. You can do this by running:
$ swaymsg -t get_outputs
You will get information about all of your monitors, every monitor separated by an empty line.
You have to look for the first line of every section, and for what’s after “Output”. For example, when you see a line like “Output DVI-D-1 ‘Philips Consumer Electronics Company’”, the output ID is “DVI-D-1”. Note these ID’s and which physical monitors they belong to.
Editing the config file
If you haven’t edited the Sway config file before, you have to copy it to your home directory by running this command:
cp -r /etc/sway/config ~/.config/sway/config
Now the default config file is located in ~/.config/sway and called “config”. You can edit it using any text editor.
Now you have to do a little bit of math. Imagine a grid with the origin in the top left corner. The units of the X and Y coordinates are pixels. The Y axis is inverted. This means that if you, for example, start at the origin and you move 100 pixels to the right and 80 pixels down, your coordinates will be (100, 80).
You have to calculate where your displays are going to end up on this grid. The locations of the displays are specified with the top left pixel. For example, if we want to have a monitor with name HDMI1 and a resolution of 1920×1080, and to the right of it a laptop monitor with name eDP1 and a resolution of 1600×900, you have to type this in your config file:
output HDMI1 pos 0 0 output eDP1 pos 1920 0
You can also specify the resolutions manually by using the res option:
output HDMI1 pos 0 0 res 1920x1080 output eDP1 pos 1920 0 res 1600x900
Binding workspaces to monitors
Using sway with multiple monitors can be a little bit tricky with workspace management. Luckily, you can bind workspaces to a specific monitor, so you can easily switch to that monitor and use your displays more efficiently. This can simply be done by the workspace command in your config file. For example, if you want to bind workspace 1 and 2 to monitor DVI-D-1 and workspace 8 and 9 to monitor HDMI-A-1, you can do that by using:
workspace 1 output DVI-D-1 workspace 2 output DVI-D-1
workspace 8 output HDMI-A-1 workspace 9 output HDMI-A-1
That’s it! These are the basics of multi monitor setup in sway. A more detailed guide can be found at https://github.com/swaywm/sway/wiki#Multihead.
Onyeibo
Refreshing and resourceful. Thank you
onyx
So are you saying through this, mixed with the Nvidia proprietary drivers on an Optimus laptop, I can render a second workspace on another monitor? As far as I know we cant do this right now with Optimus but this would be awesome as a workaround.
Sebastiaan
Sway doesn’t work with proprietary drivers, at all. There’s a work around for it with a argument you can pass to Sway, but it’s not very user friendly.
Diego Abad
This this the argument you need to pass if want use nvidia:
“–my-next-gpu-wont-be-nvidia and DO NOT report issues.” 🙂
sygnal
No, and you should consider using more user & open source friendly hardware in the future. AMD work fantastic on Linux and Sway out of the box! Hell, even Intel is getting in the game!
arte219
Sway won’t work with the nvidia proprietary drivers, but you can use the i3 window manager. it has the same workflow, it only misses a few things the sway devs added in (such as native i3-gaps and wallpaper support) but these functionalities can be added by installing a few packages.
raphgro
Thanks.
Klaus
And what about multiple touch screens? Is there any support for having multiple touch screens now? In X it was so easy, but with wayland I did not know anyone who was able to get it work.