WIP

Antonio Scandurra created

Change summary

crates/gpui3/src/app.rs    | 23 ++++++++++++++++++++---
crates/gpui3/src/window.rs |  4 ++--
2 files changed, 22 insertions(+), 5 deletions(-)

Detailed changes

crates/gpui3/src/app.rs 🔗

@@ -115,12 +115,12 @@ impl AppContext {
 
     pub(crate) fn update_window<R>(
         &mut self,
-        handle: AnyWindowHandle,
+        id: WindowId,
         update: impl FnOnce(&mut WindowContext) -> R,
     ) -> Result<R> {
         let mut window = self
             .windows
-            .get_mut(handle.id)
+            .get_mut(id)
             .ok_or_else(|| anyhow!("window not found"))?
             .take()
             .unwrap();
@@ -129,7 +129,7 @@ impl AppContext {
         window.dirty = true;
 
         self.windows
-            .get_mut(handle.id)
+            .get_mut(id)
             .ok_or_else(|| anyhow!("window not found"))?
             .replace(window);
 
@@ -152,6 +152,23 @@ impl AppContext {
                 Effect::Notify(entity_id) => self.apply_notify_effect(entity_id),
             }
         }
+
+        let dirty_window_ids = self
+            .windows
+            .iter()
+            .filter_map(|(window_id, window)| {
+                let window = window.as_ref().unwrap();
+                if window.dirty {
+                    Some(window_id)
+                } else {
+                    None
+                }
+            })
+            .collect::<Vec<_>>();
+
+        for dirty_window_id in dirty_window_ids {
+            self.update_window(dirty_window_id, |cx| cx.draw());
+        }
     }
 
     fn apply_notify_effect(&mut self, updated_entity: EntityId) {

crates/gpui3/src/window.rs 🔗

@@ -133,7 +133,7 @@ impl<'a, 'w> WindowContext<'a, 'w> {
         if window_handle == self.window.handle {
             Ok(update(self))
         } else {
-            self.app.update_window(window_handle, update)
+            self.app.update_window(window_handle.id, update)
         }
     }
 }
@@ -258,7 +258,7 @@ impl<'a, 'w, T: Send + Sync + 'static> ViewContext<'a, 'w, T> {
             .entry(handle.id)
             .or_default()
             .push(Arc::new(move |cx| {
-                cx.update_window(window_handle, |cx| {
+                cx.update_window(window_handle.id, |cx| {
                     if let Some(handle) = handle.upgrade(cx) {
                         this.update(cx, |this, cx| on_notify(this, handle, cx))
                             .is_ok()