No description
Find a file
Votre Nom 8a897d975d 🎉🎉🎉 Phase 6.4 — Wayland complet : un client externe affiche ses pixels
Capture preuve : docs/phase6-4-wayland-client-surface.png — pattern ARGB
320x240 écrit par un binaire client Wayland externe affiché par notre
compositor sur le framebuffer Redox dans QEMU.

Crates ajoutés :

redox-wl-wayland-frontend (lib, ~430 lignes) :
- WaylandFrontend struct avec SurfaceRegistry intégré + Display<Self>
  + ListeningSocket
- bind_absolute(path), accept_pending_clients(), dispatch_clients(),
  flush_clients(), notify_frame_done()
- ShmPool : mmap + munmap on drop
- BufferData : Arc<Mutex<ShmPool>> + offset/w/h/stride/format
- SurfaceData : Arc<...> qui contient SurfaceId + pending_buffer
  + pending_frame_callbacks
- Dispatch impls : wl_compositor v5, wl_shm v1 (advertise ARGB+XRGB),
  wl_shm_pool, wl_buffer, wl_surface (attach/damage/commit/frame/destroy),
  wl_callback, wl_region (no-op)

Sémantique commit : copy-on-commit (lit pixels via mmap, copie dans
SurfaceBuffer owned). Plus simple que de garder le mmap vivant. Au
commit, raise auto la surface (politique simple).

redox-wl-compositor (bin, ~150 lignes) :
- ouvre RedoxOutput + InputBackend partagé
- bind WaylandFrontend sur /tmp/redox-wl-comp.sock
- export WAYLAND_DISPLAY env var
- boucle main 30 fps : accept clients → dispatch → input → render →
  notify_frame_done → flush
- Esc = exit propre

redox-wl-test-client-shm (bin, ~170 lignes) :
- attente du socket compositor (50 retries × 100ms)
- Connection::from_backend après UnixStream::connect
- Dispatch handlers minimal pour wl_registry, compositor, shm, pool,
  buffer, surface
- shm_open + ftruncate + mmap + pattern ARGB déterministe (orange
  + bandes diagonales)
- shm.create_pool(fd) + pool.create_buffer + compositor.create_surface
- surface.attach + damage_buffer + commit
- reste connecté 25s pour qu'on capture l'écran

Validation runtime : compositor en init VT=2, client lancé en parallèle
via 30_console. Logs serial montrent toute la séquence :
  [client] globals : compositor=true shm=true
  [client] shm créé, peint 320x240 ARGB
  [client] surface attach + damage + commit envoyés
  [comp]  tick=30 surfaces=1 elapsed=1.2s
  [comp]  tick=510 surfaces=1 elapsed=20.7s    ← surface persiste 20+s

PNG capturée à T+12s montre la surface du client visible sur le
framebuffer. Position (0,0) parce que xdg-shell absent (placement
absent). Reportable phase 7.

Image Redox restaurée à boot Orbital normal.

docs/phase6-4-wayland-frontend.md : compte-rendu complet, archi,
sémantique commit, limitations, plan phase 7.

Phase 6 entièrement close. Le compositor naissant fonctionne avec un
vrai client Wayland externe sur Redox.

Leyoda 2026 – GPLv3
2026-05-09 13:30:05 +02:00
crates 🎉🎉🎉 Phase 6.4 — Wayland complet : un client externe affiche ses pixels 2026-05-09 13:30:05 +02:00
docs 🎉🎉🎉 Phase 6.4 — Wayland complet : un client externe affiche ses pixels 2026-05-09 13:30:05 +02:00
.gitignore 🎉 Phase 4 vraie validée visuellement : pixels custom plein écran 2026-05-09 10:46:20 +02:00
README.md Phase 4.4 : binaire prêt pour test sur image bootée 2026-05-08 20:04:16 +02:00
REDOX_COSMIC_XWAYLAND_RS_PLAN.md Initial commit: phases 1-3 du portage Wayland Rust pour Redox OS 2026-05-08 17:41:55 +02:00

redox-wayland-compositor

Portage de Wayland sur Redox OS, en Rust pur, visant à terme à remplacer Orbital comme serveur graphique de base.

État : phases 1+2+3 du plan directeur complétées le 2026-05-08.

Le pipeline shm Wayland complet est validé end-to-end sur Redox via redoxer (crate redox-wl-test-shm-pipeline) : socket Unix réel, wl_compositor + wl_shm globals, fd passing via SCM_RIGHTS, wl_shm_pool + wl_buffer, wl_surface.attach/damage/commit, lecture pixels côté serveur via le fd reçu — pixel-perfect.

Structure

.
├── REDOX_COSMIC_XWAYLAND_RS_PLAN.md   # plan directeur 14 phases / 5 ans
├── docs/
│   ├── existing-redox-gui.md          # phase 1 : audit Orbital + graphics-ipc + inputd + relibc
│   └── redox-wayland-primitives.md    # phase 2 : 5 primitives + POC pixels validés sur Redox
├── crates/
│   ├── redox-wl-test-unix-socket/        # primitive 1 : SOCK_STREAM Wayland-shaped
│   ├── redox-wl-test-fd-passing/         # primitive 2 : SCM_RIGHTS mono-process (artefact)
│   ├── redox-wl-test-fd-passing-fork/    # primitive 2b : SCM_RIGHTS via fork (vrai cas Wayland)
│   ├── redox-wl-test-shm-open/           # primitive 3 : shm_open + mmap MAP_SHARED
│   ├── redox-wl-test-poll-multifd/       # primitive 4 : poll() multiplexing + POLLHUP
│   ├── redox-wl-poc-pixels/              # POC : datapath shm + SCM_RIGHTS bout en bout
│   ├── redox-wl-test-handshake/          # phase 3 : wayland-rs server/client registry
│   ├── redox-wl-test-shm-pipeline/       # phase 3 : pipeline shm complet validé
│   └── redox-wl-test-display-backend/    # phase 4.1 : ouvre display Redox via inputd + V2GraphicsHandle
└── (pas de Cargo.toml racine : chaque crate est standalone — voir note ci-dessous)

Note structure : pas de workspace Cargo racine. Chaque crate dans crates/ est autonome avec son propre Cargo.toml et son propre target/ lors de la build. Raison : redoxer build/redoxer run cherche le binaire dans <crate>/target/... et n'arrive pas à le retrouver si le target/ est centralisé au niveau workspace. Ce sera repensé quand on aura un compositor unique vs plusieurs binaires de tests.

Prérequis

  • Rust nightly (récent — testé 2026-05-07)
  • Target installé : rustup target add x86_64-unknown-redox --toolchain nightly
  • cargo install redoxer puis redoxer install (sysroot Redox ~456 Mo)
  • Repo upstream Smithay/wayland-rs cloné en ../wayland-rs/ (paths relatifs depuis crates/*/Cargo.toml)

Reproduire les tests

Chaque crate s'exécute via redoxer (mini-VM Redox sous QEMU) :

cd crates/redox-wl-test-shm-pipeline
redoxer run --release

Pattern attendu en fin d'exécution : [test-XX] PASS: ....

Important : utiliser redoxer build ou redoxer run, pas cargo build --target=x86_64-unknown-redox direct qui fait un fail au link (undefined reference CMSG_NXTHDR/CMSG_DATA) parce que le linker host ne sait pas chaîner librelibc.a du sysroot Redox. redoxer configure le linker correctement.

Tests qui exigent un vrai framebuffer

Les binaires qui touchent au display (à partir de redox-wl-test-display-backend) ne tourneront pas sous redoxer run standard car celui-ci est headless. Deux voies pour les exécuter :

Voie A — redoxer exec --gui (mini-VM interactive)

cd crates/redox-wl-test-display-backend
redoxer build --release
redoxer exec --gui target/x86_64-unknown-redox/release/redox-wl-test-display-backend

Ouvre une fenêtre QEMU, boote une mini-VM Redox avec framebuffer, lance le binaire. À fermer manuellement quand le test est fini.

Voie B — Image complète + make qemu

Pousser le binaire dans une image Redox bootable via redoxfs-fuse, puis booter en mode interactif. Étapes :

# 1. Monter l'image (redoxfs reste en foreground tant que monté)
mkdir -p /tmp/redox-mnt
~/Projets/Redox/redox-src/build/fstools/bin/redoxfs \
    ~/Projets/Redox/redox-src/build/x86_64/desktop/harddrive.img \
    /tmp/redox-mnt &
sleep 2

# 2. Copier le binaire dans /usr/bin de l'image
cp ~/Projets/Redox/redox-wayland-compositor/crates/redox-wl-test-display-backend/target/x86_64-unknown-redox/release/redox-wl-test-display-backend \
    /tmp/redox-mnt/usr/bin/

# 3. Démonter
fusermount -u /tmp/redox-mnt
rmdir /tmp/redox-mnt

# 4. Booter (avec clavier FR si besoin, voir hook QEMU_USER_FLAGS dans mk/qemu.mk)
cd ~/Projets/Redox/redox-src
make qemu audio=no QEMU_USER_FLAGS="-k fr"

Une fois Redox bootée :

  • Ctrl+Alt+F2 pour basculer sur le VT 2 (console texte), sans Orbital
  • Login : root / mot de passe password
  • Lancer : redox-wl-test-display-backend

Le binaire écrit aussi sur /scheme/debug (serial), donc même si tu lances depuis Orbital (VT 3) la sortie sera visible côté host dans le terminal qui a lancé make qemu.

Roadmap

Voir REDOX_COSMIC_XWAYLAND_RS_PLAN.md pour le plan complet 14 phases / 5 ans.

Prochaine étape : phase 4 — display backend Redox via graphics-ipc::V2GraphicsHandle.

Licence

Leyoda 2026 — GPLv3+