git.lucas.co / cce-gallery
widget gallery and compositor test bench

commiteafda43ada01305d9af6c30ec41c072ac9efc10d
parent7d1fbeee29
authorLucas Galante <[email protected]>
date2026-06-18 01:22
refactor: update dependencies and rename clear-ui to cce-ui

 Cargo.toml  |  2 +-
 README.md   |  4 +--
 src/main.rs | 99 +++++++++++++++++++++++++++----------------------------------
 3 files changed, 46 insertions(+), 59 deletions(-)

diff --git a/Cargo.toml b/Cargo.toml
index cd42bf4..b680847 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -4,7 +4,7 @@ version = "0.1.0"
 edition = "2021"
 
 [dependencies]
-clear-ui = { path = "../clear-ui" }
+cce-ui = { path = "../cce-ui" }
 raw-window-handle = "0.6"
 wgpu = "24"
 bytemuck = { version = "1", features = ["derive"] }
diff --git a/README.md b/README.md
index 640e520..3ff0950 100644
--- a/README.md
+++ b/README.md
@@ -3,12 +3,12 @@
 This repository contains integration and verification tests for the `clear` desktop environment programs, specifically:
 - `clear-computing-environment-server` (Wayland compositor with background blur support)
 - `ccec` (window manager / layout agent)
-- `clear-ui` (WebGPU-based desktop widget system)
+- `cce-ui` (WebGPU-based desktop widget system)
 
 The tests run in a **headless Wayland session** using the `headless` backend of `wlroots` to ensure portability and automated execution.
 
 ## Features tested
-1. **Window Opacity**: Verifies that client windows (such as `clear-ui`) render with expected transparency/alpha settings.
+1. **Window Opacity**: Verifies that client windows (such as `cce-ui`) render with expected transparency/alpha settings.
 2. **Background Blur**: Confirms the compositor's background blur is successfully initialized and enabled for mapped window surface trees.
 3. **Window Layout and Tiling**: Verifies that IPC commands sent via `clearctl` dynamically update tiling layouts (Cascade, Grid, Vsplit, etc.) and window geometries as expected.
 
diff --git a/src/main.rs b/src/main.rs
index c13fa19..b5c7d07 100644
--- a/src/main.rs
+++ b/src/main.rs
@@ -1,4 +1,4 @@
-use clear_ui::widget::{
+use cce_ui::widget::{
     Button, Checkbox, ContentBg, Dropdown, Header, Label, Paginator, Panel, ProgressBar, RangeSlider, Slider, Spinbox, StatusBar,
     TextLabel, Toggle, Element, Trackpad, hover_animation,
 };
@@ -138,12 +138,12 @@ struct State {
     is_child: bool,
     opacity: bool,
     transparency: f32,
-    ui_context: clear_ui::context::UiContext,
+    ui_context: cce_ui::context::UiContext,
 }
 
 impl State {
     async fn new(
-        wayland_handle: &'static clear_ui::wayland::WaylandSurfaceHandle,
+        wayland_handle: &'static cce_ui::wayland::WaylandSurfaceHandle,
         pw: u32,
         ph: u32,
         scale: f64,
@@ -210,7 +210,7 @@ impl State {
 
         let shader = device.create_shader_module(wgpu::ShaderModuleDescriptor {
             label: Some("Shader"),
-            source: wgpu::ShaderSource::Wgsl(clear_ui::SHADER.into()),
+            source: wgpu::ShaderSource::Wgsl(cce_ui::SHADER.into()),
         });
 
         let pipeline_layout = device.create_pipeline_layout(&wgpu::PipelineLayoutDescriptor {
@@ -410,10 +410,10 @@ impl State {
             is_child,
             opacity,
             transparency,
-            ui_context: clear_ui::context::UiContext::new(),
+            ui_context: cce_ui::context::UiContext::new(),
         };
 
-        clear_ui::scale::set_scale_factor(scale as f32);
+        cce_ui::scale::set_scale_factor(scale as f32);
         state.apply_layout();
         state.upload_vertices();
         state
@@ -477,7 +477,7 @@ impl State {
         let sh = self.height;
         let mut verts = Vec::new();
         hover_animation::reset_frame_registration();
-        clear_ui::widget::popovers::clear();
+        cce_ui::widget::popovers::clear();
         
         for (i, w) in self.widgets.iter().enumerate() {
             if !self.is_widget_visible(i) {
@@ -488,12 +488,12 @@ impl State {
                 verts.extend(quad_vertices(qx, qy, qw, qh, sw, sh, qc));
             }
             if w.popover_rect().is_some() {
-                clear_ui::widget::popovers::register(w.as_ref());
+                cce_ui::widget::popovers::register(w.as_ref());
             }
         }
 
         // Draw popover quads on top
-        let mut popover_pc = clear_ui::layout::PopoverCollector::new();
+        let mut popover_pc = cce_ui::layout::PopoverCollector::new();
         for (i, w) in self.widgets.iter().enumerate() {
             if !self.is_widget_visible(i) {
                 continue;
@@ -615,21 +615,8 @@ impl State {
                 continue;
             }
             for label in w.text_labels() {
-                let mut covered = false;
-                for (pi, pw) in self.widgets.iter().enumerate() {
-                    if pi != i && is_visible(pi) {
-                        if let Some((px, py, pw_val, ph)) = pw.popover_rect() {
-                            if label.is_covered_by(px, py, pw_val, ph) {
-                                covered = true;
-                                break;
-                            }
-                        }
-                    }
-                }
-                if !covered {
-                    widget_buffers.push(make_text_buffer(font_system, &label.text, label.font_size));
-                    widget_labels.push(label);
-                }
+                widget_buffers.push(make_text_buffer(font_system, &label.text, label.font_size));
+                widget_labels.push(label);
             }
         }
 
@@ -651,7 +638,7 @@ impl State {
         }
 
         // Draw popover texts on top
-        let mut popover_pc = clear_ui::layout::PopoverCollector::new();
+        let mut popover_pc = cce_ui::layout::PopoverCollector::new();
         for (i, w) in self.widgets.iter().enumerate() {
             if !is_visible(i) {
                 continue;
@@ -715,7 +702,7 @@ impl State {
                 let sidebar_w = self.widgets[1].as_page_selector().unwrap().sidebar_w();
                 demo_positions(self.width, self.height, sidebar_w)
             };
-            clear_ui::scale::set_scale_factor(self.scale as f32);
+            cce_ui::scale::set_scale_factor(self.scale as f32);
             self.apply_layout();
             self.upload_vertices();
         }
@@ -1095,9 +1082,9 @@ impl PointerHandler for AppState {
                 }
                 PointerEventKind::Press { button, .. } => {
                     let btn = match *button {
-                        272 => clear_ui::widget::MouseButton::Left,
-                        273 => clear_ui::widget::MouseButton::Right,
-                        274 => clear_ui::widget::MouseButton::Middle,
+                        272 => cce_ui::widget::MouseButton::Left,
+                        273 => cce_ui::widget::MouseButton::Right,
+                        274 => cce_ui::widget::MouseButton::Middle,
                         _ => continue,
                     };
                     if let Some(st) = &mut self.state {
@@ -1126,7 +1113,7 @@ impl PointerHandler for AppState {
                                 break;
                             }
                         }
-                        if btn == clear_ui::widget::MouseButton::Left {
+                        if btn == cce_ui::widget::MouseButton::Left {
                             if let Some(old) = st.focused_widget {
                                 if Some(old) != clicked_idx {
                                     st.widgets[old].unfocus();
@@ -1137,18 +1124,18 @@ impl PointerHandler for AppState {
                         if let Some(i) = clicked_idx {
                             if st.widgets[i].mouse_input(
                                 btn,
-                                clear_ui::widget::ElementState::Pressed,
+                                cce_ui::widget::ElementState::Pressed,
                                 st.cursor_x,
                                 st.cursor_y,
                                 &mut st.ui_context,
                             ) {
                                 changed = true;
                             }
-                            if btn == clear_ui::widget::MouseButton::Left && st.widgets[i].draggable() {
+                            if btn == cce_ui::widget::MouseButton::Left && st.widgets[i].draggable() {
                                 st.widgets[i].drag_begin(st.cursor_x, st.cursor_y);
                                 st.drag_widget = Some(i);
                             }
-                            if btn == clear_ui::widget::MouseButton::Left {
+                            if btn == cce_ui::widget::MouseButton::Left {
                                 st.widgets[i].focus();
                                 st.focused_widget = Some(i);
                             }
@@ -1161,14 +1148,14 @@ impl PointerHandler for AppState {
                 }
                 PointerEventKind::Release { button, .. } => {
                     let btn = match *button {
-                        272 => clear_ui::widget::MouseButton::Left,
-                        273 => clear_ui::widget::MouseButton::Right,
-                        274 => clear_ui::widget::MouseButton::Middle,
+                        272 => cce_ui::widget::MouseButton::Left,
+                        273 => cce_ui::widget::MouseButton::Right,
+                        274 => cce_ui::widget::MouseButton::Middle,
                         _ => continue,
                     };
                     if let Some(st) = &mut self.state {
                         let mut changed = false;
-                        if btn == clear_ui::widget::MouseButton::Left {
+                        if btn == cce_ui::widget::MouseButton::Left {
                             if let Some(idx) = st.drag_widget {
                                 st.widgets[idx].drag_end();
                                 st.drag_widget = None;
@@ -1194,12 +1181,12 @@ impl PointerHandler for AppState {
                             if !is_visible(i) {
                                 continue;
                             }
-                            if w.mouse_input(btn, clear_ui::widget::ElementState::Released, st.cursor_x, st.cursor_y, &mut st.ui_context) {
+                            if w.mouse_input(btn, cce_ui::widget::ElementState::Released, st.cursor_x, st.cursor_y, &mut st.ui_context) {
                                 changed = true;
                             }
                         }
                         
-                        if btn == clear_ui::widget::MouseButton::Left {
+                        if btn == cce_ui::widget::MouseButton::Left {
                             if st.is_child {
                                 if st.widgets[3].take_click() {
                                     self.exit = true;
@@ -1438,7 +1425,7 @@ impl PointerHandler for AppState {
                     if let Some(st) = &mut self.state {
                         let h_scroll = horizontal.absolute as f32;
                         let v_scroll = vertical.absolute as f32;
-                        let delta = clear_ui::widget::MouseScrollDelta::LineDelta(-h_scroll / 10.0, -v_scroll / 10.0);
+                        let delta = cce_ui::widget::MouseScrollDelta::LineDelta(-h_scroll / 10.0, -v_scroll / 10.0);
                         let mut changed = false;
                         for w in &mut st.widgets {
                             if w.mouse_wheel(&delta, st.cursor_x, st.cursor_y, &mut st.ui_context) {
@@ -1488,29 +1475,29 @@ impl KeyboardHandler for AppState {
         event: smithay_client_toolkit::seat::keyboard::KeyEvent,
     ) {
         let logical_key = match event.keysym {
-            xkeysym::Keysym::Escape => clear_ui::widget::Key::Named(clear_ui::widget::NamedKey::Escape),
-            xkeysym::Keysym::Return => clear_ui::widget::Key::Named(clear_ui::widget::NamedKey::Enter),
-            xkeysym::Keysym::BackSpace => clear_ui::widget::Key::Named(clear_ui::widget::NamedKey::Backspace),
-            xkeysym::Keysym::Down => clear_ui::widget::Key::Named(clear_ui::widget::NamedKey::ArrowDown),
-            xkeysym::Keysym::Up => clear_ui::widget::Key::Named(clear_ui::widget::NamedKey::ArrowUp),
-            xkeysym::Keysym::Left => clear_ui::widget::Key::Named(clear_ui::widget::NamedKey::ArrowLeft),
-            xkeysym::Keysym::Right => clear_ui::widget::Key::Named(clear_ui::widget::NamedKey::ArrowRight),
-            xkeysym::Keysym::Tab => clear_ui::widget::Key::Named(clear_ui::widget::NamedKey::Tab),
-            xkeysym::Keysym::Delete => clear_ui::widget::Key::Named(clear_ui::widget::NamedKey::Delete),
-            xkeysym::Keysym::space => clear_ui::widget::Key::Named(clear_ui::widget::NamedKey::Space),
+            xkeysym::Keysym::Escape => cce_ui::widget::Key::Named(cce_ui::widget::NamedKey::Escape),
+            xkeysym::Keysym::Return => cce_ui::widget::Key::Named(cce_ui::widget::NamedKey::Enter),
+            xkeysym::Keysym::BackSpace => cce_ui::widget::Key::Named(cce_ui::widget::NamedKey::Backspace),
+            xkeysym::Keysym::Down => cce_ui::widget::Key::Named(cce_ui::widget::NamedKey::ArrowDown),
+            xkeysym::Keysym::Up => cce_ui::widget::Key::Named(cce_ui::widget::NamedKey::ArrowUp),
+            xkeysym::Keysym::Left => cce_ui::widget::Key::Named(cce_ui::widget::NamedKey::ArrowLeft),
+            xkeysym::Keysym::Right => cce_ui::widget::Key::Named(cce_ui::widget::NamedKey::ArrowRight),
+            xkeysym::Keysym::Tab => cce_ui::widget::Key::Named(cce_ui::widget::NamedKey::Tab),
+            xkeysym::Keysym::Delete => cce_ui::widget::Key::Named(cce_ui::widget::NamedKey::Delete),
+            xkeysym::Keysym::space => cce_ui::widget::Key::Named(cce_ui::widget::NamedKey::Space),
             _ => {
                 if let Some(ref text) = event.utf8 {
-                    clear_ui::widget::Key::Character(text.clone())
+                    cce_ui::widget::Key::Character(text.clone())
                 } else if let Some(ch) = event.keysym.key_char() {
-                    clear_ui::widget::Key::Character(ch.to_string())
+                    cce_ui::widget::Key::Character(ch.to_string())
                 } else {
                     return;
                 }
             }
         };
 
-        let custom_event = clear_ui::widget::KeyEvent {
-            state: clear_ui::widget::ElementState::Pressed,
+        let custom_event = cce_ui::widget::KeyEvent {
+            state: cce_ui::widget::ElementState::Pressed,
             logical_key,
             text: event.utf8.clone(),
             repeat: false,
@@ -1712,7 +1699,7 @@ fn main() {
 
     event_queue.roundtrip(&mut app).unwrap();
 
-    let scale = clear_ui::wayland::detect_scale_factor(&app.output_state);
+    let scale = cce_ui::wayland::detect_scale_factor(&app.output_state);
 
     let surface = app.compositor_state.create_surface(&qh);
     surface.set_buffer_scale(scale as i32);
@@ -1758,7 +1745,7 @@ fn main() {
     }
     window.commit();
 
-    let wayland_handle = Box::leak(Box::new(clear_ui::wayland::WaylandSurfaceHandle {
+    let wayland_handle = Box::leak(Box::new(cce_ui::wayland::WaylandSurfaceHandle {
         display_ptr: conn.backend().display_id().as_ptr() as *mut std::ffi::c_void,
         surface_ptr: surface.id().as_ptr() as *mut std::ffi::c_void,
     }));