From dfb5c6645349edd9289f6a381ebdeac321eb9b8e Mon Sep 17 00:00:00 2001 From: Votre Nom Date: Sat, 16 May 2026 14:33:11 +0200 Subject: [PATCH] =?UTF-8?q?Phase=2013.2.b.2=20fix=20=E2=80=94=20raise=20de?= =?UTF-8?q?s=20subsurfaces=20avec=20leur=20parent?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Bug observé sur le client de test 13.2.b.3 : le carré rouge subsurface est rendu correctement au commit du child (à parent_pos + offset), mais le `parent_surface.commit()` final côté client appelle raise(parent) et place le parent au-dessus du child dans le z_order. Résultat visuel : parent overdraw child, subsurface invisible. Fix : après raise(parent_id), scanner surfaces_by_id pour trouver toutes les subsurfaces dont le subsurface_link.parent pointe vers cette SurfaceId, et les raise() juste après. Coût O(N) par raise, mais N est petit (1-10 toplevels typique). Note design : c'est une solution naïve. Une vraie implémentation maintient un index parent_id → Vec mis à jour à GetSubsurface et à Destroy. À durcir en phase 13.2.b.5 si le scan O(N) devient limitant (genre 50+ surfaces visibles). Les 2 tests natifs continuent de passer en non-régression. Leyoda 2026 – GPLv3 --- crates/redox-wl-wayland-frontend/src/lib.rs | 30 +++++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git a/crates/redox-wl-wayland-frontend/src/lib.rs b/crates/redox-wl-wayland-frontend/src/lib.rs index 4f85505..938e5a1 100644 --- a/crates/redox-wl-wayland-frontend/src/lib.rs +++ b/crates/redox-wl-wayland-frontend/src/lib.rs @@ -1603,6 +1603,36 @@ impl wayland_server::Dispatch> for Wayla // indépendamment de leur parent ; elles vivent à // parent.z + 1 par convention de leur création. state.registry.raise(id); + + // Phase 13.2.b.2 fix bug visuel : si on vient de raise un + // parent toplevel, raise aussi toutes ses subsurfaces + // pour qu'elles restent au-dessus dans le z_order. Sinon + // un re-commit du parent (sans buffer) après création + // des subsurfaces les masquerait. Cas observé sur le + // client de test 13.2.b.3 où le parent.commit() final + // de rafraîchissement faisait disparaître le carré rouge. + let parent_id_to_match = id; + let children_to_raise: Vec = state + .surfaces_by_id + .iter() + .filter_map(|(sid, surf)| { + let sd = surf.data::>()?; + let link = sd.subsurface_link.lock().unwrap(); + let ld = link.as_ref()?; + let parent_sid = ld + .parent + .data::>() + .and_then(|psd| *psd.id.lock().unwrap())?; + if parent_sid == parent_id_to_match { + Some(*sid) + } else { + None + } + }) + .collect(); + for cid in children_to_raise { + state.registry.raise(cid); + } } // Frame callbacks en attente → bump dans la queue globale