Screencast/partage d'écran avec wayland et sway
En ces temps de confinement, les besoins et envies de partage de l'é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 ou vous en êtes, il y a une page de test pour le partage d'écran avec votre navigateur : https://mozilla.github.io/webrtc-landing/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 ca marche avec le lien ci dessus, ca 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 conclus avec un compromis puisque je n’aurai besoin de la fonctionnalité que quelques instants… (Divulgachage : ça implique Xwayland
).
Le fond
Attention : j’ai eu quelques crash plus ou moins violent sur la route, dont sway
…
Les instructions ne fonctionneront probablement pas en les copiant directement car il manque quelque 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 le 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’icones 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 (mon écran externe dans mon cas). Il faudra peut être redémarrer avant que ça fonctionne. On peut ensuite tester dans son navigateur avec la page de test.
Pour moi, ça ne marche pas!
La forme :
Si vous pensiez vous en être tiré, et 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
(3h pour le qtwebengine) et que c’est lui que j’utilise tout le temps, je n’ai pas du tout envie de compiler chromium ou firefox en plus!
Une dernière alternative a tester: le flatpak Fedora du firefox patché.
Flatpak sous Gentoo, puis Firefox patché
Il faut un overlay pour flatpak
. Cela dit, c’est assez simple. Quelques minutes et Gigas d’installation plus tard, ca marche.
sudo layman -o https://raw.githubusercontent.com/fosero/flatpak-overlay/master/repositories.xml -f -a flatpak-overlay
sudo emerge -atv flatpak
flatpak install --from https://firefox-flatpak.mojefedora.cz/org.mozilla.FirefoxNightly.flatpakref
flatpak run org.mozilla.FirefoxNightly
Cette fois ci, après un crash un peu violent, le cast de l'écran en natif wayland fonctionne. L’affichage des polices est un peu foireux dans le flatpak. Je décide de m’arreter la, ça fait beaucoup trop d’installations et de temps et je n’aime pas trop le concept du flatpak juste pour un navigateur.. Par ailleurs, je réalise alors qu’on ne peut pas encore choisir de fenêtres à caster et c’est donc tout l'écran qui est partagé. Bref, c’est gagné mais pas encore parfait, etj’ai trouvé au passage une solution temporaire plus simple.
La solution qui n’en est pas vraiment une..
Parmi tout 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’essaye de voir, si je lance mon appli en mode de compatibilité Xwayland, elle sera elle aussi visible dans ce choix de fenêtres? Et oui!
GDK_BACKEND=x11 python __main__.py
Ça marche même avec Firefox pourtant lancé en mode wayland (smiley qui tire la langue sur le coté, j’accepte ça pour l’instant !).
Et bien ça ira pour cette fois, on peut choisir une application Xwayland dans le protocole WebRTC.. Ça ne marche pas avec qutebrowser qui ne propose toujours et uniquement que tout l'écran. Peut être qu’en regardant comment fonctionne le vnc sous wayland (wayvnc, article à suivre ?), je trouverai quelque chose de sympa :)