Checkpoint

Nathan Sobo created

Change summary

crates/gpui3/src/app.rs               | 1 +
crates/gpui3/src/app/async_context.rs | 6 ++++++
crates/gpui3/src/elements/img.rs      | 7 +++----
3 files changed, 10 insertions(+), 4 deletions(-)

Detailed changes

crates/gpui3/src/app.rs 🔗

@@ -146,6 +146,7 @@ impl AppContext {
     }
 
     fn flush_effects(&mut self) {
+        dbg!("flush effects");
         while let Some(effect) = self.pending_effects.pop_front() {
             match effect {
                 Effect::Notify(entity_id) => self.apply_notify_effect(entity_id),

crates/gpui3/src/app/async_context.rs 🔗

@@ -67,6 +67,12 @@ impl AsyncWindowContext {
     pub fn update<R>(&self, update: impl FnOnce(&mut WindowContext) -> R) -> Result<R> {
         self.app.update_window(self.window, update)
     }
+
+    pub fn on_next_frame(&mut self, f: impl FnOnce(&mut WindowContext) + Send + 'static) {
+        self.app
+            .update_window(self.window, |cx| cx.on_next_frame(f))
+            .ok();
+    }
 }
 
 impl Context for AsyncWindowContext {

crates/gpui3/src/elements/img.rs 🔗

@@ -75,12 +75,11 @@ impl<S: Send + Sync + 'static> Element for Img<S> {
                 let corner_radii = style.corner_radii.to_pixels(bounds, cx.rem_size());
                 cx.paint_image(bounds, corner_radii, order, data, self.grayscale)?;
             } else {
-                cx.spawn(|view, mut cx| async move {
+                cx.spawn(|_, mut cx| async move {
                     if image_future.await.log_err().is_some() {
-                        view.update(&mut cx, |_, cx| {
+                        cx.on_next_frame(|cx| {
                             cx.notify();
-                        })
-                        .ok();
+                        });
                     }
                 })
                 .detach()