Gérer ses écrans à chaud avec Sway

Depuis quelques temps, j’utilise Sway, gestionnaire de fenêtre du type Tiling-Manager, reprenant le principe du célèbre i3 et utilisant Wayland comme protocole de serveur d’affichage. C’est le gestionnaire de fenêtre par défaut sur mes trois machines (et même celle de “jeu”).

Pour pouvoir configurer les sorties écran à chaud avec Sway, il est possible d’utiliser la commande swaymsg, voici quelques exemple.

Trouver le nom des sorties.

Afin de pouvoir paramétrer comme il se doit ses différents écrans, il faut d’abord trouver leurs noms, la commande pour les trouver est :

swaymsg -t get-outputs

Et sa sortie :

Output eDP-1 'Sharp Corporation 0x144A 0x00000000' (focused)
  Current mode: 3200x1800 @ 59.981998 Hz
  Position: 1920,0
  Scale factor: 2.000000
  Scale filter: nearest
  Subpixel hinting: unknown
  Transform: normal
  Workspace: 1
  Max render time: off
  Adaptive sync: disabled
  Available modes:
    3200x1800 @ 47.985001 Hz
    3200x1800 @ 59.981998 Hz

Output DP-1 'Iiyama North America PL2482HS 1175301402148'
  Current mode: 1920x1080 @ 74.973000 Hz
  Position: 0,0
  Scale factor: 1.000000
  Scale filter: nearest
  Subpixel hinting: unknown
  Transform: normal
  Workspace: 5
  Max render time: off
  Adaptive sync: disabled
  Available modes:
    720x400 @ 70.082001 Hz
    [...]

Cette commande (dont j’ai raccourci la sortie) donne tout un tas d’informations utiles sur les écrans reliés à la machine. Si vous avez déjà toutes celles nécessaires mais il vous manque les noms associés, il et possible de lancer la commande suivante :

swaymsg -t get_outputs -p | grep Output | cut -d' ' -f2-

eDP-1 'Sharp Corporation 0x144A 0x00000000' (focused)
DP-1 'Iiyama North America PL2482HS 1175301402148'

On voit ainsi rapidement quel nom porte chaque écran (eDP-1 mon écran interne et DP-1 l’externe).

Changer la disposition.

Lors du branchement de mon écran externe, il est positionné à gauche de celui du portable, or c’est l’inverse que je veux, il suffit alors de faire dans un terminal :

swaymsg 'output eDP-1 pos 0 0; output DP-1 pos 1600 0'

Je place ainsi l’écran interne en position 0 0 et l’écran HDMI en position 1600 0. Comme l’écran interne est de type HiDPI (3200x1800) et qu’un facteur d’agrandissement de 2 est paramétré dans mon fichier de configuration, j’ai utilisé la taille “virtuelle” de l’écran (1600 0) pour positionner le suivant.

Schéma de positionnement des
écrans

Vous notez qu’il est possible de passer plusieurs commandes à swaymsg en les séparant par un point-virgule.

Changer le fond d’écran

Il est aussi possible de changer le fond d’écran, par exemple si je veux changer celui de l’écran HDMI :

swaymsg 'output DP-1 background ~/documents/ressources/wallpapers/morty.jpg fill'

Le chemin vers l’image doit être absolu sinon ça ne fonctionne pas. Le dernier paramètre spécifie le mode d’adaptation de l’image.

Bouger un espace de travail déjà ouvert vers l’écran fraichement connecté.

Je viens donc de brancher un écran à chaud, j’aimerai que certains espaces de travail de Sway déjà utilisés “déménagent” sur ce dernier.

Petite précision, dans mon fichier de configuration de Sway, j’ai personnalisé le nom de mes espaces de travail via des variables, voici un exemple de personnalisation (~/.config/sway/config)

# Workspaces:
# -----------
[...] 
set $ws1 1: term
set $ws2 2: mail
set $ws3 3: www
set $ws4 4: irc

# switch to workspace
bindsym $mod+1 workspace $ws1
[...]

Je vais donc pouvoir utiliser ces variables avec swaymsg. Je veux donc que l’espace de travail 2: mail déjà utilisé se retrouve sur mon écran HDMI, depuis un terminal ouvert sur $ws1 je vais donc lancer la commande :

swaymsg 'workspace $ws2; move to DP-1'

Utiliser swaymsg avec un lanceur maison

Pour lancer les applications depuis Sway, j’utilise un lanceur maison : un simple terminal s’ouvre et un script se lance avec fzf et me permet de taper le nom de l’application à lancer. Celui-ci me permet aussi de lancer directement les commandes swaymsg. Par exeample, pour déplacer mon espace de travail courant sur l’écran HDMI j’appelle mon lanceur avec ctrl+d puis lance :

swaymsg 'move workspace to DP-1'

Capture d'écran montrant le lanceur avec des commandes swaymsg

Je peux aussi lancer n’importe quelle commande listée dans cet article de cette façon, le code du script est disponible dans le dépôt suivant

En conclusion

Sway et Wayland facilitent vraiment la gestion des écrans : finis les problèmes de reconnaissance du matériel qu’on avait avec Xorg. Il est tout de même nécessaire d’affiner les réglages, et swaymsg le permet facilement.

Aidé par un lanceur maison, cette configuration se montre facile et rapide à mettre en œuvre.