git.lucas.co / cce-fonts
font browser

commit20b19aa4689503cabad5895dada72022e14951ac
parentf87afcbdca
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/main.rs | 37 ++++++++++++++++---------------------
 1 file changed, 16 insertions(+), 21 deletions(-)

diff --git a/src/main.rs b/src/main.rs
index bad8533..5b5268c 100644
--- a/src/main.rs
+++ b/src/main.rs
@@ -289,23 +289,20 @@ impl TypefaceApp {
     /// once; the font-list buttons every rebuild (they are recreated on search changes,
     /// same cadence the old per-rebuild link_parent_child re-registration had).
     fn register_widgets(&mut self) {
-        let self_ptr = self as *mut Self;
-        unsafe {
-            if !self.widgets_registered {
-                self.widgets_registered = true;
-                self.ui_context.register_widget(self.search_box.base().id(), (*self_ptr).search_box.as_ptr_mut());
-                self.ui_context.register_widget(self.btn_open_folder.base().id(), (*self_ptr).btn_open_folder.as_ptr_mut());
-                self.ui_context.register_widget(self.btn_remove_font.base().id(), (*self_ptr).btn_remove_font.as_ptr_mut());
-                self.ui_context.register_widget(self.style_dropdown.base().id(), (*self_ptr).style_dropdown.as_ptr_mut());
-                self.ui_context.register_widget(self.size_spinbox.base().id(), (*self_ptr).size_spinbox.as_ptr_mut());
-                self.ui_context.register_widget(self.preview_box.base().id(), (*self_ptr).preview_box.as_ptr_mut());
-                self.ui_context.register_widget(self.select_cancel_btn.base().id(), (*self_ptr).select_cancel_btn.as_ptr_mut());
-                self.ui_context.register_widget(self.select_confirm_btn.base().id(), (*self_ptr).select_confirm_btn.as_ptr_mut());
-            }
-            for btn in (*self_ptr).font_buttons.iter_mut() {
-                if btn.rect().0 > -9000.0 {
-                    self.ui_context.register_widget(btn.base().id(), btn.as_ptr_mut());
-                }
+        if !self.widgets_registered {
+            self.widgets_registered = true;
+            self.ui_context.register_host(&mut self.search_box);
+            self.ui_context.register_host(&mut self.btn_open_folder);
+            self.ui_context.register_host(&mut self.btn_remove_font);
+            self.ui_context.register_host(&mut self.style_dropdown);
+            self.ui_context.register_host(&mut self.size_spinbox);
+            self.ui_context.register_host(&mut self.preview_box);
+            self.ui_context.register_host(&mut self.select_cancel_btn);
+            self.ui_context.register_host(&mut self.select_confirm_btn);
+        }
+        for btn in self.font_buttons.iter_mut() {
+            if btn.rect().0 > -9000.0 {
+                self.ui_context.register_host(btn);
             }
         }
     }
@@ -415,8 +412,7 @@ impl TypefaceApp {
         // immediately — but `register_widgets()` only runs in the next layout pass, so the
         // ids were reported unregistered until then and the router dropped those events.
         for btn in self.font_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);
         }
 
         if let Some(sel) = self.selected_idx {
@@ -856,8 +852,7 @@ impl Application for TypefaceApp {
                 // Register the replacements now rather than waiting for the next layout pass —
                 // see refresh(). This is the path that produced the stale-root spam.
                 for btn in self.font_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);
                 }
 
                 // reset or re-evaluate selection