Migration de i3wm (Xorg) à Sway (Wayland)

Cela fait un bon moment que je vois passer des articles sur sway, présenté comme le digne successeur de i3. J’en suis un utilisateur depuis longtemps maintenant, et avant ça j’étais sur wmii. C’était donc logique que je cherche à en savoir plus, voire le tester pour éventuellement l’adopter.

Seulement il n’est compatible qu’avec Wayland. Et ça, je ne connais pas bien. En plus quand j’ai commencé à voir le projet, c’était tout récent, et donc forcément ça m’a un peu refroidi. Mais depuis, l’eau a coulé sous les ponts, et la stabilité semble être au rendez-vous.

Il est donc temps que je teste. Que dis-je, migre du vénérable i3 vers le fougueux sway. Nombreuses (mais simples) bidouilles en perspective ! C’est parti !

Packages installés

Ça fait un certain nombre vu comme ça, mais en vrai ils ne sont pas si lourds. Xeyes n’est là que pour détecter les applis qui ne tournent pas nativement sous wayland. Quand c’est le cas, vous pouvez voir les yeux bouger, sinon ils perdent la souris et ne bougent plus. Vous noterez qu’il n’y a pas de terminal ici, mais c’est parce que j’utilise alacritty depuis un moment et il est compatible wayland.

Accessoirement, il manque aussi le paquet principal pour wayland. Il était déjà sur mon système depuis un moment.

Préconf de sway

Avant, un premier lancement, quelques petites manipulations, histoire de ne pas avoir de mauvaises surprises comment par exemple le gestionnaire qui ne démarre pas ou un clavier dans une autre disposition. D’abord, copier le fichier de /etc dans mon home :

cd ~/.config
mkdir sway
cd sway
cp /etc/sway/config .

Et la conf clavier FR avec variante :

input "1:1:AT_Translated_Set_2_keyboard" {
    xkb_layout "fr"
    xkb_variant "latin9"
    xkb_options "grp:win_space_toggle"
    xkb_model "pc104"
}

Manipuler les workspace avec un clavier FR

Là il va falloir ruser, car les chiffres ne sont pas accessibles immédiatement sur nos clavier. Il va donc falloir modifier les affectations dans cette section.

Mon astuce, vu que je renomme aussi mes espaces, c’est de déclarer les touches via des variables :

    set $numkey1 ampersand
    set $numkey2 eacute
    set $numkey3 quotedbl
    set $numkey4 apostrophe
    set $numkey5 parenleft
    set $numkey6 minus
    set $numkey7 egrave
    set $numkey8 underscore
    set $numkey9 ccedilla
    set $numkey0 agrave

Si vous êtes en bépo, tournez-vous vers cette astuce

À partir de là vous pouvez faire vos réglage de cette manière (exemple en ne prenant que l’espace numéro 1):

    # déclaration des espaces
    set $workspace1 "1 "
    # naviguer entre les espaces
    bindsym $mod+$numkey1 workspace $workspace1
    # déplacer une fenetre vers un autre espace
    bindsym $mod+Shift+$numkey1 move container to workspace $workspace1

Forcer l’activation de xwayland

Le wiki Arch dit, à l’heure de l’écriture, que c’est activé par défaut, mais j’ai eu des crashs au lancement d’une app xwayland … Hum hum. Donc, pour contrer ça il faut rajouter xwayland enable dans la conf de sway.

Pour le lancement auto de sway au login (tty)

Je n’utilise pas de gestionnaire de connexion, donc j’ai simplement rajouté ceci dans le ~/.bash_profile :

if [ -z $DISPLAY ] && [ "$(tty)" == "/dev/tty1" ]; then
    export QT_QPA_PLATFORMTHEME="qt5ct"
    # forcer firefox à utilier wayland nativement
    export MOZ_ENABLE_WAYLAND=1
    exec sway
fi

Les autres lancements qui étaient dans le .xinitrc

Je n’avais pas grand-chose en plus de la variable d’environnement pour QT, juste le lancement de udiskie et xcompmgr. Le premier est maintenant lancé par sway (via exec --no-startup-id udiskie), le second n’est plus appelé. Ces choses sont directement gérées par le gestionnaire de fenêtres.

On a maintenant le minimum vital : le gestionnaire de fenêtres qui se lance, et les paquets d’utilitaires qui sont installés. Il est temps de paramétrer tout ça aux petits oignons.

Migrer la conf

Vu que sway est (quasiment) compatible avec i3, on peut maintenant se mettre à reprendre les bouts de configuration de l’ancien vers le nouveau. À quelques détails près.

Le menu pour lancer les programmes

J’adorais dmenu, alors en remplacement je me suis tourné vers bemenu qui propose la même simplicité. Pour l’utiliser j’ai mis :

set $menu bemenu-run -p '»' --hb=#285577 --hf=#ffffff --tb=#285577 --tf=#ffffff| xargs swaymsg exec --

Notez que là, il s’agit de la customisation de quelques couleurs et du prompt, mais vous pouvez simplement mettre bemenu-run sans aucun argument.

Les règles de placement auto dans les workspaces

C’est là qu’il faut se rappeler que certaines applications fonctionnent sous xwayland. Cette différence se fait sentir au niveau de la propriété à utiliser pour la règle d’assignation :

Pour vous aider, voici une petite commande à passer pour que sway vous dise qui utilise quoi : swaymsg -t get_tree. Grep conseillé sur le nom de votre appli. :)

Le fond d’écran

Cette partie est gérée nativement par sway. On peut donc retirer l’appel à feh. Il y a une ligne toute prête dans la conf d’origine pour nous montrer comment faire.

Les screenshots

Il faut simplement remplacer l’appel à scrot par grim. Et pour avoir le choix de la zone à capturer : grim + slurp.

bindsym Print exec grim /home/chagratt/MesDocs/Images/captures/capture-$(date +%Y-%m-%d_%H-%m-%s).png
bindsym $mod+Print exec grim -g "$(slurp)" /home/chagratt/MesDocs/Images/captures/capture-$(date +%Y-%m-%d_%H-%m-%s).png

Les notifications

Activer mako au démarrage pour les notifications de bureau : exec --no-startup-id mako

Le verrouillage de l’écran

Ça va se faire avec swaylock, et plus précisément dans mon cas via un script externe vu que je joue avec une capture d’écran et ImageMagick. L’appel au script à mettre dans la conf est simple :

bindsym $mod+Shift+x exec /home/chagratt/MesDocs/Developpement/shell/snippets/swaylock.sh

Et le script qui permet de jouer avec la capture qu’on floute, d’insérer une icone et un petit texte :

#!/bin/bash
# packages needed :
# - grim
# - imagemagick
# - swaylock
# thanks to : https://thomas-leister.de/en/sway-window-manager/#lockscreen

readonly ICON="${HOME}/MesDocs/Images/lock-icon.png"
readonly TMPBG=$(mktemp /tmp/bg.XXXXXXXXX.png)
readonly TMPTXT=$(mktemp /tmp/txt.XXXXXXXXX.png)
readonly SCREENWIDTH=1366

grim "${TMPBG}"
convert "${TMPBG}" -scale 25% -blur 0x2 -scale 400% -fill black -colorize 50% "${TMPBG}"
convert "${TMPBG}" "${ICON}" -gravity center -composite -matte "${TMPBG}"
convert -size ${SCREENWIDTH}x60 xc:black -font Liberation-Sans -pointsize 26 -fill white -gravity center -annotate +0+0 'Type password to unlock' ${TMPTXT};
convert ${TMPBG} ${TMPTXT} -gravity center -geometry +0+200 -composite ${TMPBG}
swaylock -s fill -i "${TMPBG}"

rm -f "${TMPBG}"
rm -f "${TMPTXT}"

Le jeu de couleurs en fonction de l’heure

Redshift ne fonctionnant pas sous wayland sans patch, je me suis dirigé vers un remplaçant natif. Voilà donc gammastep. Un fork pour lequel on peut carrément copier coller la conf, en remplaçant toutefois la référence à randr par wayland. Et en plus c’est packagé dans Arch. Nickel !

Ce qui n’était pas dans la conf, enfin pas tout à fait

Allez, c’est presque terminé, on a fait le plus dur. Même si on est sûr de l’ajustement depuis un moment.

La luminosité

Pour remplacer xbacklight j’ai choisi brightnessctl.

Pour utiliser les touches de raccourci, j’ai fait comme tout le monde :

bindsym XF86MonBrightnessDown exec --no-startup-id brightnessctl set 5%-
bindsym XF86MonBrightnessUp exec --no-startup-id brightnessctl set 5%+

Le son

Tant qu’à faire, j’ai été creuser les touches reconnues, et je me suis aperçu que je pouvais utiliser aussi les raccourcis pour controler alsa :

bindsym XF86AudioRaiseVolume exec --no-startup-id amixer set Master 5%+
bindsym XF86AudioLowerVolume exec --no-startup-id amixer set Master 5%-

La barre de statut

Là c’est le plus long, surtout une fois qu’un a choisi, car la plupart des softs ont des possibilités de paramétrage très poussés. Et comme c’est selon les gouts de chacun …

Dans mon cas c’est donc waybar qui vient en remplaçant. J’ai toutefois été me rapprocher le plus possible de ce que j’avais avec i3bar.

Waybar est packagé pour Arch, d’où mon choix, et il permet d’avoir facilement les informations dont j’ai besoin. Petit point négatif toutefois, la conf visuelle est faite via du CSS. Ce n’est pas un défaut en soi, mais on peut vite partir dans toutes les directions si on ne fait pas attention. Le mieux est d’aller voir le dépôt git du projet qui contient moult exemples, histoire de partir sur une base proche de ce que l’on cherche à obtenir.

Mettre à jour mon dépôt dotfiles

Alors ça, c’est totalement en fonction de vous, enfin, si vous avez un dossier qui centralise vos fichiers de conf ou pas. Si la réponse est oui, voici donc les éléments à récupérer :

Le reste

Il faut tester que ça marche. Le son, le micro, la vidéo vos jeux … Et pour ça, aucun secret : faut utiliser. Jusqu’ici, ça va, tout fonctionne, c’est chouette !

Et quand on est sûrs que TOUT fonctionne nickel

Simple : il faut … Désinstaller.

Et virer les vieux fichiers de confs associés :

La semi-conclusion

Terminé ! Ouf ! En vrai ça à l’air long, mais pas tant que ça de mon point de vue. Le plus long, comme toujours, ce sont les ajustements cosmétiques (coucou waybar !).

Plus qu’à profiter.

Bon et bien pour le moment, mis à part la satisfaction d’avoir un pile technique plus moderne, rien à signaler ni à ajouter. Ça tourne au moins aussi bien (heureusement), je ne change pas mes habitudes, je n’ai eu aucun problème notable.

J’ai même pu avoir un fonctionnement plus moderne sur quelques points. Par exemple avec waybar il y a des petits info-bulles complémentaires (paramétrables) au survol de certaines informations, ce qui fait un bon gain de place. Pour les captures d’écran avec le combo grim + slurp, la sélection de la zone se fait facilement. Avant j’avais juste tout l’écran.

Après j’ai la chance d’avoir une utilisation et un matériel simples (pas de carte graphique externe).

La section du dessus est juste là en prévision. Mais pour le moment, au cas où, je n’ai pas encore viré Xorg ni i3, sait-on jamais.

Quelques liens qui m’ont été utiles