git.lucas.co / cce-ui
GPU-accelerated UI toolkit (Vulkan)
git clone https://git.lucas.co/cce-ui.git

commitd242bb0371d86a32a9569f14384a80bd0f061532
parent568e667559
authorLucas Galante <[email protected]>
date2026-09-06 13:07
Remove the backplate read-aliases and deprecated backplate_* getters (7a-3)

Every live config now spells the root plate style.surface.plate.root.*,
so the legacy backplate.* pointer and registry aliases, the deprecated
backplate_* wrapper getters, and the backplate entry in PROP_NODES come
out. A backplate block in a config is now ignored; tests assert that.
Registry slot names and BACKPLATE_* statics keep their historical names.

Co-Authored-By: Claude Fable 5.1 <[email protected]>

 docs/rfc-core-rebuild.md | 10 ++++++-
 src/color.rs             | 72 +++++++-----------------------------------------
 src/config.rs            | 29 +++++++++----------
 src/layout.rs            | 46 +++++--------------------------
 4 files changed, 41 insertions(+), 116 deletions(-)

diff --git a/docs/rfc-core-rebuild.md b/docs/rfc-core-rebuild.md
index 991134b..b5c37e0 100644
--- a/docs/rfc-core-rebuild.md
+++ b/docs/rfc-core-rebuild.md
@@ -2445,7 +2445,15 @@ Constraint respected: **each crate still builds standalone** — the new core is
       `Application::is_movable_backplate_at` trait-method NAME is 7b vocabulary
       (behavioral role naming), not 7a's. With 7a-2 done, 7a is COMPLETE: new code uses
       `root_plate_*` / `plate.root.*`; the deprecated wrappers and the legacy config
-      spelling remain indefinitely for out-of-tree configs.
+      spelling were kept for out-of-tree configs.
+    - **7a-3 — DONE (2026-09-06).** Every live config (shared, cce-graph, cce-designer,
+      cce-notifier's per-app `plate { }`) was rewritten to the canonical spelling, then the
+      aliases came out: the `backplate.*` pointer/registry read-aliases in cce-ui, the
+      compositor's `backplate` node fallback, cce-grid's and cce-notifier's fallbacks, the
+      `#[deprecated] backplate_*` getters, and `backplate` in `PROP_NODES`. A `backplate`
+      block in a config is now silently ignored. Registry slot names, `BACKPLATE_*` statics,
+      the compositor's serde fields and `set_backplate_*` setters keep the historical
+      name — internal vocabulary, not aliases.
   - **7b — `PlateSpec` + window-corner math toolkit-side.** Introduce the spec, port
     `pane_plate_radii` in, and give the engine a root-plate paint path fed by a spec instead of
     each app's hand-rolled quads (DemoApp first, then the clients). The designer's per-pane
diff --git a/src/color.rs b/src/color.rs
index e6b8e16..1703e14 100644
--- a/src/color.rs
+++ b/src/color.rs
@@ -285,12 +285,10 @@ fn parse_and_set_colors(content: &str) {
         }
     }
 
-    // Phase 7a: `/style/surface/plate/root/...` is the canonical spelling of
-    // the root-plate style; the `backplate` pointers are its read-alias, and
-    // the chains are canonical-first so the new spelling wins when both are
-    // present.
+    // `/style/surface/plate/root/...` is the one spelling of the root-plate
+    // style (RFC Phase 7a; the legacy `backplate` read-alias was removed
+    // 2026-09-06 once every live config had migrated).
     if let Some(radius) = val.pointer("/style/surface/plate/root/corner_radius")
-        .or_else(|| val.pointer("/style/surface/backplate/corner_radius"))
         .and_then(|v| v.as_f64())
     {
         if let Ok(mut lock) = BACKPLATE_CORNER_RADIUS.write() {
@@ -298,29 +296,22 @@ fn parse_and_set_colors(content: &str) {
         }
      }
 
-    if let Some(c) = get_color("/style/surface/plate/root/color")
-        .or_else(|| get_color("/style/surface/backplate/color"))
-    {
+    if let Some(c) = get_color("/style/surface/plate/root/color") {
         if let Ok(mut lock) = PAGE_LOW_COLOR.write() { *lock = c; }
         if let Ok(mut lock) = BACKPLATE_OPACITY.write() { *lock = Some(c[3]); }
     }
 
-    if let Some(c) = get_color("/style/surface/plate/root/menubar/color")
-        .or_else(|| get_color("/style/surface/backplate/menubar/color"))
-    {
+    if let Some(c) = get_color("/style/surface/plate/root/menubar/color") {
         if let Ok(mut lock) = BACKPLATE_MENUBAR_COLOR.write() { *lock = c; }
     }
-    if let Some(c) = get_color("/style/surface/plate/root/menubar/text_color")
-        .or_else(|| get_color("/style/surface/backplate/menubar/text_color"))
-    {
+    if let Some(c) = get_color("/style/surface/plate/root/menubar/text_color") {
         if let Ok(mut lock) = BACKPLATE_MENUBAR_TEXT_COLOR.write() { *lock = c; }
     }
     if let Some(o) = val.pointer("/style/surface/menu/opacity").and_then(|v| v.as_f64()) {
         if let Ok(mut lock) = MENU_OPACITY.write() { *lock = (o as f32).clamp(0.0, 1.0); }
     }
 
-    let menubar_blur_ptr = val.pointer("/style/surface/plate/root/menubar/blur")
-        .or_else(|| val.pointer("/style/surface/backplate/menubar/blur"));
+    let menubar_blur_ptr = val.pointer("/style/surface/plate/root/menubar/blur");
     if let Some(blur) = menubar_blur_ptr.and_then(|v| v.as_bool()) {
         if let Ok(mut lock) = BACKPLATE_MENUBAR_BLUR.write() { *lock = blur; }
     } else if let Some(blur_val) = menubar_blur_ptr.and_then(|v| v.as_f64()) {
@@ -1251,21 +1242,14 @@ pub fn set_popover_bg_color(color: [f32; 4]) {
     }
 }
 
-/// Corner radius of the root plate (`style.surface.plate.root.corner_radius`;
-/// legacy `backplate.corner_radius` reads as an alias). The window silhouette
-/// value — the compositor clips windows from the SHARED copy of this.
+/// Corner radius of the root plate (`style.surface.plate.root.corner_radius`).
+/// The window silhouette value — the compositor clips windows from the SHARED
+/// copy of this.
 pub fn root_plate_corner_radius() -> f32 {
     load_colors_once();
     *BACKPLATE_CORNER_RADIUS.read().unwrap()
 }
 
-/// Legacy alias for [`root_plate_corner_radius`] (RFC Phase 7a; callers
-/// migrate in 7a-2, after which this gains `#[deprecated]`).
-#[deprecated(note = "renamed in RFC Phase 7a; use the root_plate_* getter")]
-pub fn backplate_corner_radius() -> f32 {
-    root_plate_corner_radius()
-}
-
 pub fn ramp_background_color() -> [f32; 4] {
     load_colors_once();
     *RAMP_BACKGROUND_COLOR.read().unwrap()
@@ -1592,12 +1576,6 @@ pub fn root_plate_opacity() -> f32 {
     page_low_color()[3]
 }
 
-/// Legacy alias for [`root_plate_opacity`] (RFC Phase 7a).
-#[deprecated(note = "renamed in RFC Phase 7a; use the root_plate_* getter")]
-pub fn active_backplate_opacity() -> f32 {
-    root_plate_opacity()
-}
-
 pub fn tree_background_color() -> [f32; 4] { *TREE_BACKGROUND_COLOR.read().unwrap() }
 pub fn tree_border_color() -> [f32; 4] { *TREE_BORDER_COLOR.read().unwrap() }
 pub fn tree_border_hover_color() -> [f32; 4] { *TREE_BORDER_HOVER_COLOR.read().unwrap() }
@@ -1683,11 +1661,6 @@ pub fn root_plate_menubar_color() -> [f32; 4] {
     *BACKPLATE_MENUBAR_COLOR.read().unwrap()
 }
 
-/// Legacy alias for [`root_plate_menubar_color`] (RFC Phase 7a).
-#[deprecated(note = "renamed in RFC Phase 7a; use the root_plate_* getter")]
-pub fn backplate_menubar_color() -> [f32; 4] {
-    root_plate_menubar_color()
-}
 pub fn set_backplate_menubar_color(c: [f32; 4]) {
     if let Ok(mut lock) = BACKPLATE_MENUBAR_COLOR.write() { *lock = c; }
 }
@@ -1697,11 +1670,6 @@ pub fn root_plate_menubar_text_color() -> [f32; 4] {
     *BACKPLATE_MENUBAR_TEXT_COLOR.read().unwrap()
 }
 
-/// Legacy alias for [`root_plate_menubar_text_color`] (RFC Phase 7a).
-#[deprecated(note = "renamed in RFC Phase 7a; use the root_plate_* getter")]
-pub fn backplate_menubar_text_color() -> [f32; 4] {
-    root_plate_menubar_text_color()
-}
 pub fn set_backplate_menubar_text_color(c: [f32; 4]) {
     if let Ok(mut lock) = BACKPLATE_MENUBAR_TEXT_COLOR.write() { *lock = c; }
 }
@@ -1711,11 +1679,6 @@ pub fn root_plate_menubar_blur() -> bool {
     *BACKPLATE_MENUBAR_BLUR.read().unwrap()
 }
 
-/// Legacy alias for [`root_plate_menubar_blur`] (RFC Phase 7a).
-#[deprecated(note = "renamed in RFC Phase 7a; use the root_plate_* getter")]
-pub fn backplate_menubar_blur() -> bool {
-    root_plate_menubar_blur()
-}
 pub fn set_backplate_menubar_blur(b: bool) {
     if let Ok(mut lock) = BACKPLATE_MENUBAR_BLUR.write() { *lock = b; }
 }
@@ -1725,11 +1688,6 @@ pub fn root_plate_statusbar_color() -> [f32; 4] {
     *BACKPLATE_STATUSBAR_COLOR.read().unwrap()
 }
 
-/// Legacy alias for [`root_plate_statusbar_color`] (RFC Phase 7a).
-#[deprecated(note = "renamed in RFC Phase 7a; use the root_plate_* getter")]
-pub fn backplate_statusbar_color() -> [f32; 4] {
-    root_plate_statusbar_color()
-}
 pub fn set_backplate_statusbar_color(c: [f32; 4]) {
     if let Ok(mut lock) = BACKPLATE_STATUSBAR_COLOR.write() { *lock = c; }
 }
@@ -1739,11 +1697,6 @@ pub fn root_plate_statusbar_text_color() -> [f32; 4] {
     *BACKPLATE_STATUSBAR_TEXT_COLOR.read().unwrap()
 }
 
-/// Legacy alias for [`root_plate_statusbar_text_color`] (RFC Phase 7a).
-#[deprecated(note = "renamed in RFC Phase 7a; use the root_plate_* getter")]
-pub fn backplate_statusbar_text_color() -> [f32; 4] {
-    root_plate_statusbar_text_color()
-}
 pub fn set_backplate_statusbar_text_color(c: [f32; 4]) {
     if let Ok(mut lock) = BACKPLATE_STATUSBAR_TEXT_COLOR.write() { *lock = c; }
 }
@@ -1753,11 +1706,6 @@ pub fn root_plate_statusbar_blur() -> bool {
     *BACKPLATE_STATUSBAR_BLUR.read().unwrap()
 }
 
-/// Legacy alias for [`root_plate_statusbar_blur`] (RFC Phase 7a).
-#[deprecated(note = "renamed in RFC Phase 7a; use the root_plate_* getter")]
-pub fn backplate_statusbar_blur() -> bool {
-    root_plate_statusbar_blur()
-}
 pub fn set_backplate_statusbar_blur(b: bool) {
     if let Ok(mut lock) = BACKPLATE_STATUSBAR_BLUR.write() { *lock = b; }
 }
diff --git a/src/config.rs b/src/config.rs
index a36e5e5..198f667 100644
--- a/src/config.rs
+++ b/src/config.rs
@@ -335,7 +335,7 @@ pub fn parse_config_path(key: &str, default_section: &str) -> (String, String, O
 const PROP_NODES: &[&str] = &[
     "gestures", "key_bindings", "pointer_bind", "gesture_bind",
     "button", "button_strip", "dropdown", "toggle", "spinbox", "slider", "font_selector",
-    "status", "overlay", "backplate", "root", "desktop", "list", "section", "textbox", "multiline", "editor", "tree",
+    "status", "overlay", "root", "desktop", "list", "section", "textbox", "multiline", "editor", "tree",
     "menubar", "statusbar", "node", "relief"
 ];
 
@@ -982,19 +982,21 @@ mod tests {
     }
 
     #[test]
-    fn test_backplate_menubar_statusbar_styling() {
+    fn test_root_plate_menubar_statusbar_styling() {
         // Global color state: serialize against the other reload_colors tests,
         // and fire both once-per-process live-config loads before our reload
         // so neither can rewrite the state mid-assert.
         let _guard = crate::color::test_color_state_lock();
-        let _ = crate::color::backplate_statusbar_blur();
+        let _ = crate::color::root_plate_statusbar_blur();
         crate::layout::lazy_init_style_registry();
 
         let content = r##"
             style {
                 surface {
-                    backplate blur=(f64)0.1 color=(rgba)"#5e657acf" corner_radius=(i64)12 {
-                        menubar blur=(bool)true color=(rgba)"#1a1d26d0" text_color=(rgba)"#e2e4f0ff"
+                    plate {
+                        root blur=(f64)0.1 color=(rgba)"#5e657acf" corner_radius=(i64)12 {
+                            menubar blur=(bool)true color=(rgba)"#1a1d26d0" text_color=(rgba)"#e2e4f0ff"
+                        }
                     }
                     statusbar blur=(bool)false color=(rgba)"#12141cd0" text_color=(rgba)"#b5b9c8ff"
                 }
@@ -1010,8 +1012,7 @@ mod tests {
         // Parse into json and set colors
         crate::color::reload_colors(content);
 
-        // Verify values are parsed correctly — read through the CANONICAL
-        // getters: a legacy-spelling config must feed them (Phase 7a alias).
+        // Verify values are parsed correctly through the root_plate_* getters.
         assert_eq!(crate::color::root_plate_menubar_blur(), true);
         
         let dd_color = crate::color::dropdown_background_color();
@@ -1028,9 +1029,9 @@ mod tests {
         assert!(statusbar_txt[0] > 0.0);
     }
 
-    /// Phase 7a: `style.surface.plate.root.*` is the canonical root-plate
-    /// spelling — it feeds the same values as `backplate.*`, and wins when
-    /// both spellings are present (canonical-first pointer chains).
+    /// `style.surface.plate.root.*` is the only root-plate spelling: the
+    /// legacy `backplate.*` block is ignored, whether it stands beside the
+    /// canonical block or alone (its read-alias was removed 2026-09-06).
     #[test]
     fn test_plate_root_canonical_spelling() {
         // Global color state: serialize against the other reload_colors tests,
@@ -1053,11 +1054,11 @@ mod tests {
             }
         "##;
         crate::color::reload_colors(content);
-        assert_eq!(crate::color::root_plate_corner_radius(), 17.0, "canonical wins over legacy");
-        assert_eq!(crate::color::backplate_corner_radius(), 17.0, "legacy getter follows");
+        assert_eq!(crate::color::root_plate_corner_radius(), 17.0, "canonical read; legacy ignored");
         assert_eq!(crate::color::root_plate_menubar_blur(), true);
 
-        // Legacy-only spelling still feeds the canonical getter.
+        // A legacy-only spelling no longer feeds the getter: the value from
+        // the canonical load above stands.
         let legacy = r##"
             style {
                 surface {
@@ -1066,7 +1067,7 @@ mod tests {
             }
         "##;
         crate::color::reload_colors(legacy);
-        assert_eq!(crate::color::root_plate_corner_radius(), 9.0);
+        assert_eq!(crate::color::root_plate_corner_radius(), 17.0, "legacy spelling is not read");
     }
 
     #[test]
diff --git a/src/layout.rs b/src/layout.rs
index 9d19c73..252278f 100644
--- a/src/layout.rs
+++ b/src/layout.rs
@@ -163,31 +163,19 @@ fn flatten_json_to_flat_props(val: &serde_json::Value, prefix: &str, flat_props:
                 "style.surface.desktop.grid_cell_width" => "grid_cell_width",
                 "style.surface.desktop.grid_cell_height" => "grid_cell_height",
                 "style.surface.plate.padding" => "plate_padding",
-                // Phase 7a: `style.surface.plate.root.*` is the CANONICAL
-                // spelling of the root-plate style; `backplate.*` is its
-                // silent read-alias (same registry slots; the slot names
-                // keep the historical prefix). Both spellings write the one
-                // slot, so with both present the LAST in document order
-                // wins here — the color.rs pointer chains are canonical-
-                // first; single-spelling configs (all real ones) are exact.
+                // `style.surface.plate.root.*` is the one spelling of the
+                // root-plate style (RFC Phase 7a). The slot names keep the
+                // historical `backplate_` prefix; the legacy `backplate.*`
+                // config read-alias was removed 2026-09-06.
                 "style.surface.plate.root.padding" => "backplate_padding",
-                "style.surface.backplate.padding" => "backplate_padding",
                 "style.surface.plate.root.gap" => "backplate_gap",
-                "style.surface.backplate.gap" => "backplate_gap",
                 "style.surface.plate.root.color" => "backplate_color",
-                "style.surface.backplate.color" => "backplate_color",
                 "style.surface.plate.root.blur" => "backplate_blur",
-                "style.surface.backplate.blur" => "backplate_blur",
                 "style.surface.plate.root.corner_radius" => "backplate_corner_radius",
-                "style.surface.backplate.corner_radius" => "backplate_corner_radius",
                 "style.surface.plate.root.menubar.color" => "backplate_menubar_color",
-                "style.surface.backplate.menubar.color" => "backplate_menubar_color",
                 "style.surface.plate.root.menubar.text_color" => "backplate_menubar_text_color",
-                "style.surface.backplate.menubar.text_color" => "backplate_menubar_text_color",
                 "style.surface.plate.root.menubar.blur" => "backplate_menubar_blur",
-                "style.surface.backplate.menubar.blur" => "backplate_menubar_blur",
                 "style.surface.plate.root.menubar.font" => "menubar_font",
-                "style.surface.backplate.menubar.font" => "menubar_font",
                 "style.surface.statusbar.color" => "backplate_statusbar_color",
                 "style.surface.statusbar.text_color" => "backplate_statusbar_text_color",
                 "style.surface.statusbar.blur" => "backplate_statusbar_blur",
@@ -1607,12 +1595,7 @@ pub fn corner_shape() -> f32 {
 /// override file — or its corners detach from the silhouette (and from the
 /// desktop grid's cells, which share the same knob).
 pub fn window_corner_radius() -> f32 {
-    // Canonical-first (RFC Phase 7a): the shared config may spell the
-    // silhouette radius either way; both feed the one value.
-    crate::config::get_i64_shared_opt("/style/surface/plate/root/corner_radius")
-        .unwrap_or_else(|| {
-            crate::config::get_i64_shared("/style/surface/backplate/corner_radius", 12)
-        }) as f32
+    crate::config::get_i64_shared("/style/surface/plate/root/corner_radius", 12) as f32
 }
 
 /// The curvature-matched corner-span factor for window-scale squircle corners.
@@ -1805,36 +1788,21 @@ pub fn bevel_profile_generation() -> u64 {
 }
 
 /// Padding between the window plate's edge and the objects sitting on it, in
-/// logical px (`style.surface.plate.root.padding` in config.kdl; the legacy
-/// `style.surface.backplate.padding` spelling reads as an alias). DE-wide so
+/// logical px (`style.surface.plate.root.padding` in config.kdl). DE-wide so
 /// every app's content sits the same distance off the plate rim.
 pub fn root_plate_padding() -> f32 {
     lazy_init_style_registry();
     get_style_registry().read().unwrap().get_float("backplate_padding").unwrap_or(16.0)
 }
 
-/// Legacy alias for [`root_plate_padding`] (RFC Phase 7a; callers migrate in
-/// 7a-2, after which this gains `#[deprecated]`).
-#[deprecated(note = "renamed in RFC Phase 7a; use the root_plate_* getter")]
-pub fn backplate_padding() -> f32 {
-    root_plate_padding()
-}
-
 /// Gap between sibling objects on the window plate, in logical px
-/// (`style.surface.plate.root.gap`; `backplate.gap` is the legacy alias) —
-/// pane splits, control rows. The companion to [`root_plate_padding`]:
+/// (`style.surface.plate.root.gap`) — pane splits, control rows. The companion to [`root_plate_padding`]:
 /// rim distance vs object spacing.
 pub fn root_plate_gap() -> f32 {
     lazy_init_style_registry();
     get_style_registry().read().unwrap().get_float("backplate_gap").unwrap_or(12.0)
 }
 
-/// Legacy alias for [`root_plate_gap`] (RFC Phase 7a).
-#[deprecated(note = "renamed in RFC Phase 7a; use the root_plate_* getter")]
-pub fn backplate_gap() -> f32 {
-    root_plate_gap()
-}
-
 /// Roll-off width for the wall where a bar (menubar / status bar / the demo's
 /// header band) steps down into the window plate. Wider than the plate's own
 /// perimeter roll on purpose: the carve depth saturates at `bevel_width` in the