Title: Gérer ses écrans à chaud avec Sway Category: linux Tags: bureau, Sway, pl-fr Date: 2020-08-01 1:34 cover: assets/backgrounds/article_gerer-ses-ecrans-a-chaud-avec-sway.jpg Depuis quelques temps, j'utilise [Sway][l_sway], gestionnaire de fenêtre du type *Tiling-Manager*, reprenant le principe du célèbre *[i3][l_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 : ```shell swaymsg -t get-outputs ``` Et sa sortie : ```shell 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 : ```shell 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 : ```shell 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]({attach}./images/positionnement_ecrans.svg) 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 : ```shell 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`) ```shell # 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 : ```shell 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`][l_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 : ```shell swaymsg 'move workspace to DP-1' ``` ![Capture d'écran montrant le lanceur avec des commandes swaymsg]({attach}./images/screen_sway_lanceur.png) 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][l_sway_dotfile] ## 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**. [l_sway]:https://swaywm.org/ [l_i3]:https://i3wm.org/ [l_fzf]:https://github.com/junegunn/f [l_sway_dotfile]:https://git.epha.se/ephase/sway_config/