Journal Utilisez une tablette ou tout autre ordinateur comme second écran sous labwc/wlroot

Posté par  . Licence CC By‑SA.
Étiquettes :
6
12
sept.
2026

Il y a quelques temps, Sébastien Rohaut a rédigé un journal qui m'a particulièrement intéressé : Utilisez une tablette ou tout autre ordinateur comme second écran

Mais aucune des solutions proposées ne convenaient vraiment à mon besoin. J'ai déjà Moonlight/Sunshine mais c'est une solution de streaming de l'host à travers le réseau et ce n'est pas exactement ce que je recherche.

Je cherchais à utiliser une solution qui utilise les possibilités natives de Wayland / wlroot + VA API, à pouvoir utiliser le refresh rate natif de ma tablette (144hz), à fonctionner sous Wayland + labwc/wlroots et ne pas avoir le contrôle du host depuis la tablette. En USB idéalement pour limiter la latence.

J'ai trouvé un projet qui n'était pas loin de répondre à mon besoin : Moreland

Son problème principal : il n'a juste pas de support labwc/wlroot.

Qu'à cela ne tienne, je n'ai aucune expérience en Rust… alors passons par un LLM.

J'ai pu forker et ajouter le support labwc/wlroot ainsi que la visibilité du curseur matériel grâce au LLM : Moreland-labwc

Voila, une poignée de lignes modifiées et mon fork de moreland intègre le support labwc/wlroot à présent.

Reste à créer une sortie virtuelle. Et ça, labwc sait le faire nativement !

Dans mon rc.xml j'ajoute mon keybind pour créer et supprimer cette sortie virtuelle :

<keybind key="W-t">
  <action name="VirtualOutputAdd" output_name="moreland"/>
  <action name="Execute"
          command="sh -c 'sleep 0.2; ~/Scripts/moreland-start.sh'"/>
</keybind>
<keybind key="W-S-t">
  <action name="Execute" command="pkill -x moreland"/>
  <action name="VirtualOutputRemove" output_name="moreland"/>
</keybind>

Et mon script moreland-start.sh :

    wlr-randr \
      --output moreland \
      --custom-mode 2560x1810@120Hz \
      --pos 6002,0

    if ! pgrep -x moreland >/dev/null; then
        nohup moreland --fps 120 --position 6002 \
            >/dev/null 2>&1 &
    fi

J'ai choisi 120Hz plutôt que 144Hz parce que la latence était diablement meilleure, et à l'oeil voir les 24Hz manquants faut être quand même bien rodé…

C'est déjà fini… On branche sa tablette en USB et on utiliser notre keybind défini (super + T) pour créer notre sortie virtuelle et déclencher le script.

Titre de l’image
Partage d'écran sur la tablette, ici on voit la waybar en bas, une fenêtre Discord en fullscreen et une fenêtre Steam par-dessus. Désolé pour la qualité, c'était une photo POC pour un ami plutôt qu'une illustration de journal…

Je n'ai pas pu utiliser la résolution max de ma tablette parce qu'il y a visiblement un petit problème sur l'allocation de surfaces intermédiaires VA. Je n'ai pas cherché à résoudre ce cas parce que c'est très utilisable pour moi dans ces conditions, augmenter la résolution risque de réduire de trop la lisibilité pour moi.

Je n'ai pas proposé la PR en upstream parce que j'ai vibecodé et n'ai aucune maîtrise de Rust comme précisé précédemment. Cependant j'ai ouvert une discussion pour que l'auteur de Moreland soit au courant de ce qui a été fait sur le fork et qu'il puisse librement le rapatrier en upstream s'il estime ça pertinent :
https://github.com/adiimanav/moreland/discussions/5

J'ai décidé de partager avec vous ici pour compléter le journal de Sébastien Rohaut. Je trouve ma solution plus élégante parce qu'elle utilise uniquement les possibilités natives de Wayland, wlroot et VA API. Et elle est franchement simple à mettre en place. En contrepartie ça ne fonctionne qu'avec des GPU AMD et des DE/compositors supportés; en USB… Et X11 n'est évidemment pas supporté.

Et si ça vous intéresse, l'auteur de Moreland a l'air ouvert à la discussion pour intégrer des nouvelles features / corrections.

Désolé pour le côté un peu décousu et destructuré du journal, on est plus proche du billet de blog. Mais j'ose espérer qu'il servira à d'autres :).

Envoyer un commentaire

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.