git.lucas.co / cce-cloud
cloud storage client
git clone https://git.lucas.co/cce-cloud.git

commit53b073b9a09ae43a64d6158996afe894d805cda9
parentb30627a2e5
authorLucas Galante <[email protected]>
date2026-07-12 21:22
refactor: cce-cloud on routed events (6bd shrink — direct dispatch retired)

The custom WgpuAdapter event loop's four app-level dispatch sites — json
layout pointer move / press / release and keyboard, plus the fuzzel press —
route one Event each through ui_context.propagate_event. Pure funnel swaps:
cloud never sets ctx focus (the router's focused-first KeyInput arm is
inert) and JsonLayoutWidget's controls are enum fields, not tree children
(no descent). The take_click drain and json_layout's container-internal
forwarding to its JsonControl children stay by design; the two direct-
dispatch calls left are tests exercising the WidgetHost surface.

Verified live A/B (daemon socket moved aside, --json probe config):
checkbox toggle through routed dispatch — empty 8% mask (raw AE is the
recorded overlay rounded-corner/translucency class), toggle confirmed fired
within-build. NOTE: the json window is an OVERLAY — ccectl center-window
replies wrong geometry for it; read the position from `ccectl windows`.
Fuzzel typing: user spot-check.

Co-Authored-By: Claude Fable 5 <[email protected]>
Claude-Session: https://claude.ai/code/session_018u7qTwzX95dd5ysAkaSCLk

 src/main.rs | 67 ++++++++++++++++++++++++++++++++++++++++---------------------
 1 file changed, 44 insertions(+), 23 deletions(-)

diff --git a/src/main.rs b/src/main.rs
index 90e3b00..c83e37c 100644
--- a/src/main.rs
+++ b/src/main.rs
@@ -1719,7 +1719,15 @@ impl PointerHandler for AppState {
                         if st.mode == LauncherMode::Json {
                             let mut changed = false;
                             if let Some(jl) = &mut st.json_layout {
-                                if jl.on_cursor_moved(event.position.0 as f32, event.position.1 as f32, &mut st.ui_context) {
+                                // Routed dispatch (6bd shrink): one Event through the router.
+                                let mv = cce_ui::widget::Event::PointerMove {
+                                    x: event.position.0 as f32,
+                                    y: event.position.1 as f32,
+                                    local_x: event.position.0 as f32,
+                                    local_y: event.position.1 as f32,
+                                };
+                                let ptr = jl.as_ptr_mut();
+                                if st.ui_context.propagate_event(&mv, ptr) {
                                     changed = true;
                                 }
                             }
@@ -1736,13 +1744,16 @@ impl PointerHandler for AppState {
                             if st.mode == LauncherMode::Json {
                                 let mut changed = false;
                                 if let Some(jl) = &mut st.json_layout {
-                                    if jl.mouse_input(
-                                        cce_ui::widget::MouseButton::Left,
-                                        cce_ui::widget::ElementState::Pressed,
-                                        event.position.0 as f32,
-                                        event.position.1 as f32,
-                                        &mut st.ui_context,
-                                    ) {
+                                    let ev = cce_ui::widget::Event::MouseButton {
+                                        button: cce_ui::widget::MouseButton::Left,
+                                        state: cce_ui::widget::ElementState::Pressed,
+                                        x: event.position.0 as f32,
+                                        y: event.position.1 as f32,
+                                        local_x: event.position.0 as f32,
+                                        local_y: event.position.1 as f32,
+                                    };
+                                    let ptr = jl.as_ptr_mut();
+                                    if st.ui_context.propagate_event(&ev, ptr) {
                                         changed = true;
                                     }
                                 }
@@ -1752,13 +1763,18 @@ impl PointerHandler for AppState {
                                 }
                             } else {
                                 let prev_selected = st.fuzzel.selected;
-                                let changed = st.fuzzel.mouse_input(
-                                    cce_ui::widget::MouseButton::Left,
-                                    cce_ui::widget::ElementState::Pressed,
-                                    event.position.0 as f32,
-                                    event.position.1 as f32,
-                                    &mut st.ui_context,
-                                );
+                                let changed = {
+                                    let ev = cce_ui::widget::Event::MouseButton {
+                                        button: cce_ui::widget::MouseButton::Left,
+                                        state: cce_ui::widget::ElementState::Pressed,
+                                        x: event.position.0 as f32,
+                                        y: event.position.1 as f32,
+                                        local_x: event.position.0 as f32,
+                                        local_y: event.position.1 as f32,
+                                    };
+                                    let ptr = st.fuzzel.as_ptr_mut();
+                                    st.ui_context.propagate_event(&ev, ptr)
+                                };
                                 if changed {
                                     if st.fuzzel.selected == prev_selected || st.switcher_mode || st.mode == LauncherMode::Dmenu {
                                         if let Some(item) = st.fuzzel.filtered_items.get(st.fuzzel.selected) {
@@ -1792,13 +1808,16 @@ impl PointerHandler for AppState {
                                 let mut changed = false;
                                 let mut clicked_btn_id = None;
                                 if let Some(jl) = &mut st.json_layout {
-                                    if jl.mouse_input(
-                                        cce_ui::widget::MouseButton::Left,
-                                        cce_ui::widget::ElementState::Released,
-                                        event.position.0 as f32,
-                                        event.position.1 as f32,
-                                        &mut st.ui_context,
-                                    ) {
+                                    let ev = cce_ui::widget::Event::MouseButton {
+                                        button: cce_ui::widget::MouseButton::Left,
+                                        state: cce_ui::widget::ElementState::Released,
+                                        x: event.position.0 as f32,
+                                        y: event.position.1 as f32,
+                                        local_x: event.position.0 as f32,
+                                        local_y: event.position.1 as f32,
+                                    };
+                                    let ptr = jl.as_ptr_mut();
+                                    if st.ui_context.propagate_event(&ev, ptr) {
                                         changed = true;
                                     }
                                     for w in &mut jl.widgets {
@@ -2134,7 +2153,9 @@ impl AppState {
                     shift: false,
                 };
                 if let Some(jl) = &mut st.json_layout {
-                    if jl.keyboard_input(&key_event, &mut st.ui_context) {
+                    let kev = cce_ui::widget::Event::KeyInput(key_event.clone());
+                    let ptr = jl.as_ptr_mut();
+                    if st.ui_context.propagate_event(&kev, ptr) {
                         widget_handled = true;
                         st.upload_vertices();
                         self.redraw = true;