🎉 Phase 5 — input backend Redox validé runtime

Crates ajoutés :
- redox-wl-input (lib) : InputBackend wrappe Arc<ConsumerHandle>
  + enum InputEvent { Key, TextInput, PointerMotion(Relative)?,
  PointerButton, PointerScroll, Quit, Unhandled, Handoff }
- redox-wl-test-input (bin) : ouvre display + take CRTC + peint bleu
  marine + polle events 30s en logguant chaque event

Modifs redox-wl-display :
- _consumer: ConsumerHandle → consumer: Arc<ConsumerHandle>
- + pub fn consumer() -> Arc<ConsumerHandle> pour partage avec input

Validation runtime sur Redox bootée via QEMU + monitor unix socket :
20 events injectés via `sendkey` et `mouse_button` HMP commands, tous
reçus et traduits correctement :
- a/b/c PRESS+RELEASE — keymap directe
- shift+a → 'A' uppercase — modificateur fonctionnel
- ctrl+c → ctrl PRESS + 'c' PRESS — composition fonctionnelle
- mouse_button 1/0 → PointerButton L=true/false
- Esc, Enter, Shift, Ctrl reçus avec scancode brut

Décision architecturale : un seul ConsumerHandle partagé via Arc entre
RedoxOutput (pour vie du VT) et InputBackend (lecteur unique d'events).
Sinon deux consumers = deux VTs distincts dont un seul reçoit les events.

Capture preuve : docs/phase5-blue-screen-with-input.png — bleu marine
plein écran 1280x800 confirmant que display + input fonctionnent
ensemble dans le même binaire.

docs/phase5-input-backend.md : compte-rendu complet.

Image restaurée à boot Orbital normal après session.

Leyoda 2026 – GPLv3
This commit is contained in:
Votre Nom 2026-05-09 11:22:54 +02:00
parent 753a30757b
commit a9bb88d9f3
7 changed files with 542 additions and 2 deletions

View file

@ -18,6 +18,7 @@
use std::io;
use std::os::fd::AsRawFd;
use std::slice;
use std::sync::Arc;
use drm::Device as _;
use drm::buffer::{Buffer as _, DrmFourcc};
@ -32,7 +33,10 @@ pub struct RedoxOutput {
/// Consumer handle GARDÉ EN VIE pour que le VT alloué par inputd persiste.
/// Si on drop ce handle, inputd retire le VT de sa table et toute opération
/// `inputd -A <vt>` ultérieure dira "non-existent VT".
_consumer: ConsumerHandle,
/// Exposé via `consumer()` pour partage avec un éventuel `InputBackend`
/// (qui polle les events sur le même fd, sans réouvrir un consumer
/// supplémentaire — sinon on aurait deux VTs et un seul recevrait les events).
consumer: Arc<ConsumerHandle>,
handle: V2GraphicsHandle,
width: u32,
height: u32,
@ -101,7 +105,7 @@ impl RedoxOutput {
.ok_or_else(|| io::Error::other("no crtc compatible with encoder"))?;
Ok(Self {
_consumer: consumer,
consumer: Arc::new(consumer),
handle,
width: w as u32,
height: h as u32,
@ -128,6 +132,13 @@ impl RedoxOutput {
pub fn vt(&self) -> usize {
self.vt
}
/// Renvoie un Arc partagé du `ConsumerHandle` pour un `InputBackend` qui
/// veut polle les events sur le même VT que le display.
/// Le caller ne doit PAS lire les events depuis ce handle (RedoxOutput
/// ne lit pas non plus) — c'est l'`InputBackend` qui sera lecteur unique.
pub fn consumer(&self) -> Arc<ConsumerHandle> {
Arc::clone(&self.consumer)
}
/// Alloue un CpuBackedBuffer ARGB8888 plein écran, l'ajoute comme
/// framebuffer DRM et appelle `set_crtc` pour qu'il soit affiché.