← Tous les billets

Screencast / partage d'écran avec Wayland et Sway

En ces temps de confinement, les besoins et envies de partage d'écran sous Wayland sont d'actualité, et c'est l'occasion de s'y re-pencher. Je tourne avec Gentoo et Sway (et c'est génial, rapide et super efficace). Bref, j'ai besoin de partager une appli Python / wxPython pour une démo / réunion dans deux semaines.

Pour savoir où vous en êtes, il y a une page de test pour le partage d'écran avec votre navigateur : gum_test.html.

Le navigateur est mon choix par défaut pour la visio sous Linux, parce que j'ai rarement envie d'installer les applis dédiées. Si ça marche avec le lien ci-dessus, ça devrait marcher avec Jitsi ou Zoom (dont je ne souhaite vraiment pas installer l'appli !). Hélas, la réunion sera sous GoToMeeting, donc il y a un facteur surprise, mais ça doit être aussi du WebRTC, n'est-ce pas :)

La marche à suivre est à peu près tracée ici. Et d'après l'auteur, ça marche, ô joie ! Après cette lueur de joie, quelques heures de sueurs, de la réussite et un peu de désillusion, j'ai conclu avec un compromis puisque je n'aurai besoin de la fonctionnalité que quelques instants… (Divulgâchage : ça implique Xwayland.)

Le fond

Attention : j'ai eu quelques crashs plus ou moins violents sur la route, dont sway… Les instructions ne fonctionneront probablement pas en les copiant directement car il manque quelques cd ou autres.

Pipewire 0.3 (git)

« PipeWire is a server and user space API to deal with multimedia pipelines. »

C'est lui qui va transmettre le flux vidéo entre la capture au niveau Wayland et le navigateur… Right ? Gentoo n'a que la version 0.2 dans les repos, et ça ne suffit pas pour compiler xdg-desktop-portal-wlr !

git clone https://github.com/PipeWire/pipewire.git
# [...]
meson build -Djack=false -Dvulkan=false -Dpipewire-jack=false --prefix=/usr/ --libdir=/usr/lib/
sudo ninja -C build install
systemctl --user start pipewire.service

xdg-desktop-portal (git)

« Desktop integration portal » — vous ouvre les portes du « bureau » par le biais de requêtes D-Bus.

git clone https://github.com/flatpak/xdg-desktop-portal.git
# [...]
systemctl --user start xdg-desktop-portal.service

xdg-desktop-portal-wlr (git)

« xdg-desktop-portal backend for wlroots » — implémente le portail pour wlroots, le compositeur Wayland de sway.

git clone https://github.com/emersion/xdg-desktop-portal-wlr.git
# [...]
xdg-desktop-portal-wlr -lTRACE -p BGRx

-lTRACE pour le debug.

/etc/environment

XDG_CURRENT_DESKTOP=sway

Est nécessaire pour le lancement du portail. Attention, ça casse potentiellement la barre d'icônes libappindicator dans Waybar.

Tester avec cast.py

Le script est ici (Python) : https://gitlab.gnome.org/snippets/19. Et là, miracle, si tout va bien, on voit son écran. Il faudra peut-être redémarrer avant que ça fonctionne. Pour moi, ça ne marche pas !

La forme

Si vous pensiez vous en être tiré, eh bien soit c'est le cas et vous pouvez caster un de vos écrans, soit vous êtes comme moi et maintenant, il faut un navigateur (ou une application tierce) natif Wayland et qui utilise pipewire. Et là, misère. Ce n'est pas le cas de mon fidèle qutebrowser. Ni de firefox-bin (Wayland mais pas pipewire) ou google-chrome-stable (pipewire mais Xwayland). En fait il faut un Firefox patché à la Fedora ou un chromium compilé avec Wayland et pipewire. Comme mon temps de compilation est déjà abusivement long pour qutebrowser (3 h pour le qtwebengine), je n'ai pas du tout envie de compiler chromium ou firefox en plus !

La solution qui n'en est pas vraiment une…

Parmi tous les tests effectués, je me suis retrouvé à un moment à pouvoir sélectionner une fenêtre à caster : celle de Google Chrome. Celui-ci est un des rares énergumènes qui tourne sous Xwayland. Du coup, j'essaie : si je lance mon appli en mode de compatibilité Xwayland, sera-t-elle elle aussi visible dans ce choix de fenêtres ? Eh oui !

GDK_BACKEND=x11 python __main__.py

Ça marche même avec Firefox pourtant lancé en mode Wayland. Et bien ça ira pour cette fois : on peut choisir une application Xwayland dans le protocole WebRTC. Peut-être qu'en regardant comment fonctionne le VNC sous Wayland (wayvnc, article à suivre ?), je trouverai quelque chose de sympa :)