🎉 Phase 7.3 — curseur software validé runtime
Sprite curseur 16x16 ARGB dessiné par-dessus la composition après `SurfaceRegistry::compose_into()`, avec alpha blending non prémultiplié (`out = src + dst * (1 - src.a)`) et hot-spot configurable. Frontend additions : - `cursor_surface_id` / `cursor_hot_x` / `cursor_hot_y` / `cursor_visible` dans `WaylandFrontend` - `is_cursor: AtomicBool` dans `SurfaceData` - `default_cursor_sprite()` : flèche hardcoded 16x16 - `blend_argb_over(src, dst)` avec fast paths a=0/a=255 - `draw_cursor<F: Framebuffer>(target)` : clip aux bords du fb, blit pixel par pixel - `set_cursor_initial_position` / `set_cursor_position` / `cursor_position` publiques - `wl_pointer.set_cursor` handler : store la surface client, marque `is_cursor = true`, l'exclut du Z-order (visible=false) - `wl_surface.commit` lit `is_cursor` → si curseur, pas de raise/focus et reste invisible dans la composition normale - `cursor_visible = true` au premier PointerMotion(Relative) Binaire compositor : - `set_cursor_initial_position(fb_w/2, fb_h/2)` au boot - `frontend.draw_cursor(&mut output)` après `compose_into` - timeout porté de 60s à 180s pour validation visuelle confortable Test client SHM : - timeout porté de 25s à 170s pour rester aligné avec le compositor Validation runtime : 5 screendumps à 5 positions distinctes prouvent que `draw_cursor` est appelé correctement quel que soit `(cursor_x, cursor_y)`, dont 2 captures par-dessus la fenêtre client SHM (overlay alpha-blended sur les bandes arc-en-ciel). Note runtime : Redox n'a pas de driver USB tablet opérationnel sous QEMU. `mouse_move` PS/2 du monitor QEMU ne produit pas non plus de PointerMotion côté inputd. Validation faite en mode programmatique via un cycle temporaire `set_cursor_position`, retiré du binaire après screendumps. À investiguer ps2d/vesad en phase 7.5 ou plus tard. Doc complète : `docs/phase7-3-cursor.md`. Leyoda 2026 – GPLv3
This commit is contained in:
parent
baa94701bf
commit
5f7587e79e
9 changed files with 536 additions and 16 deletions
|
|
@ -304,9 +304,9 @@ fn run() -> Result<(), Box<dyn std::error::Error>> {
|
|||
event_queue.flush()?;
|
||||
let _ = event_queue.roundtrip(&mut state);
|
||||
|
||||
// 5. Boucle vivante 25 secondes
|
||||
// 5. Boucle vivante 170 secondes
|
||||
let start = std::time::Instant::now();
|
||||
while start.elapsed() < Duration::from_secs(25) {
|
||||
while start.elapsed() < Duration::from_secs(170) {
|
||||
let _ = event_queue.dispatch_pending(&mut state);
|
||||
let _ = event_queue.flush();
|
||||
thread::sleep(Duration::from_millis(50));
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue