GPU-accelerated UI toolkit (Vulkan)
git clone https://git.lucas.co/cce-ui.git
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