Change summary
crates/gpui3/src/app.rs | 36 +++++++++++++++++++-----------------
crates/gpui3/src/scene.rs | 3 ++-
crates/gpui3/src/window.rs | 3 +++
3 files changed, 24 insertions(+), 18 deletions(-)
Detailed changes
@@ -97,7 +97,7 @@ impl AppContext {
let this = self.this.upgrade().unwrap();
self.platform.read(move |platform| {
let cx = &mut *this.lock();
- f(platform, cx)
+ cx.update(|cx| f(platform, cx))
})
}
@@ -122,22 +122,24 @@ impl AppContext {
id: WindowId,
update: impl FnOnce(&mut WindowContext) -> R,
) -> Result<R> {
- let mut window = self
- .windows
- .get_mut(id)
- .ok_or_else(|| anyhow!("window not found"))?
- .take()
- .unwrap();
-
- let result = update(&mut WindowContext::mutable(self, &mut window));
- window.dirty = true;
-
- self.windows
- .get_mut(id)
- .ok_or_else(|| anyhow!("window not found"))?
- .replace(window);
-
- Ok(result)
+ self.update(|cx| {
+ let mut window = cx
+ .windows
+ .get_mut(id)
+ .ok_or_else(|| anyhow!("window not found"))?
+ .take()
+ .unwrap();
+
+ let result = update(&mut WindowContext::mutable(cx, &mut window));
+ window.dirty = true;
+
+ cx.windows
+ .get_mut(id)
+ .ok_or_else(|| anyhow!("window not found"))?
+ .replace(window);
+
+ Ok(result)
+ })
}
fn update<R>(&mut self, update: impl FnOnce(&mut Self) -> R) -> R {
@@ -8,12 +8,13 @@ use collections::BTreeMap;
// Exported to metal
pub type PointF = Point<f32>;
+#[derive(Debug)]
pub struct Scene {
layers: BTreeMap<u32, SceneLayer>,
pub(crate) scale_factor: f32,
}
-#[derive(Default)]
+#[derive(Default, Debug)]
pub struct SceneLayer {
pub quads: Vec<Quad>,
}
@@ -39,7 +39,9 @@ impl Window {
let handle = handle;
let cx = cx.to_async();
move |content_size, scale_factor| {
+ dbg!("!!!!!!!!!!!!");
cx.update_window(handle, |cx| {
+ dbg!("!!!!!!!!");
cx.window.scene = Scene::new(scale_factor);
cx.window.content_size = content_size;
cx.window.dirty = true;
@@ -101,6 +103,7 @@ impl<'a, 'w> WindowContext<'a, 'w> {
root_view.paint(layout, &mut (), &mut frame_state, cx)?;
cx.window.root_view = Some(root_view);
let scene = cx.window.scene.take();
+ dbg!(&scene);
let _ = cx.window.platform_window.read(|platform_window| {
platform_window.draw(scene);
future::ready(())