git.lucas.co / cce-system-interface
system settings
git clone https://git.lucas.co/cce-system-interface.git

commitc4e231fdf11903d1bfe7ee3be92bfdf1050deead
parent9547339a87
authorLucas Galante <lsgalante12@gmail.com>
date2026-10-07 15:30
refactor: register widgets by reference (UiContext::register_host)

register_widget(id, ptr) took a raw pointer in a safe function; cce-ui is
making it an unsafe fn now that every app registers through
register_host(&mut w), which takes the widget's own id and a live borrow.
Registration loops that existed only to hand the registry raw pointers
(and the unsafe blocks and self_ptr casts around them) are gone.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

 src/pages/packages.rs |  3 +--
 src/pages/services.rs |  3 +--
 src/pages/timers.rs   |  3 +--
 src/renderer.rs       | 15 ++++-----------
 4 files changed, 7 insertions(+), 17 deletions(-)

diff --git a/src/pages/packages.rs b/src/pages/packages.rs
index 19add7a..a81c524 100644
--- a/src/pages/packages.rs
+++ b/src/pages/packages.rs
@@ -1325,8 +1325,7 @@ impl crate::pages::AppPage for PackagesState {
             if list.get_item_draw_y(idx, 4.0).is_none() {
                 continue;
             }
-            let (id, ptr) = (i.id(), i.as_ptr_mut());
-            ctx.register_widget(id, ptr);
+            ctx.register_host(i);
         }
     }
 
diff --git a/src/pages/services.rs b/src/pages/services.rs
index 3db63c6..1d62535 100644
--- a/src/pages/services.rs
+++ b/src/pages/services.rs
@@ -497,8 +497,7 @@ impl crate::pages::AppPage for ServicesState {
             if list.get_item_draw_y(idx, 4.0).is_none() {
                 continue;
             }
-            let (id, ptr) = (i.id(), i.as_ptr_mut());
-            ctx.register_widget(id, ptr);
+            ctx.register_host(i);
         }
     }
 
diff --git a/src/pages/timers.rs b/src/pages/timers.rs
index aaa2c11..f7a4705 100644
--- a/src/pages/timers.rs
+++ b/src/pages/timers.rs
@@ -815,8 +815,7 @@ impl crate::pages::AppPage for TimersState {
             if list.get_item_draw_y(idx, 4.0).is_none() {
                 continue;
             }
-            let (id, ptr) = (i.id(), i.as_ptr_mut());
-            ctx.register_widget(id, ptr);
+            ctx.register_host(i);
         }
     }
 
diff --git a/src/renderer.rs b/src/renderer.rs
index e09e2e3..1657dab 100644
--- a/src/renderer.rs
+++ b/src/renderer.rs
@@ -795,18 +795,11 @@ impl SystemInterface {
         // never go through it, so re-register them here. The page buttons are
         // per-rebuild clones — registration follows the fresh allocations.
         {
-            let id = self.search_box.id();
-            let ptr = self.search_box.as_ptr_mut();
-            self.ui_context.register_widget(id, ptr);
-            let id = self.page_dropdown.id();
-            let ptr = self.page_dropdown.as_ptr_mut();
-            self.ui_context.register_widget(id, ptr);
-            let id = self.page_scroll_bar.id();
-            let ptr = self.page_scroll_bar.as_ptr_mut();
-            self.ui_context.register_widget(id, ptr);
+            self.ui_context.register_host(&mut self.search_box);
+            self.ui_context.register_host(&mut self.page_dropdown);
+            self.ui_context.register_host(&mut self.page_scroll_bar);
             for (btn, _) in self.page_buttons.iter_mut() {
-                let (id, ptr) = (btn.id(), btn.as_ptr_mut());
-                self.ui_context.register_widget(id, ptr);
+                self.ui_context.register_host(btn);
             }
         }
         // A Tab step's focus, handed to the fresh clone at the same rect (the