Reduce frequency of workspace save (#11183)

Co-Authored-By: Mikayla <mikayla@zed.dev>

Release Notes:


- N/A

---------

Co-authored-by: Mikayla <mikayla@zed.dev>
This commit is contained in:
Conrad Irwin 2024-04-29 20:27:01 -06:00 committed by GitHub
parent 4fad96b179
commit 62c12cd549
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
4 changed files with 42 additions and 26 deletions

View file

@ -603,7 +603,7 @@ impl<T: Item> ItemHandle for View<T> {
} }
cx.defer(|workspace, cx| { cx.defer(|workspace, cx| {
workspace.serialize_workspace(cx).detach(); workspace.serialize_workspace(cx);
}); });
} }

View file

@ -749,7 +749,7 @@ mod element {
} }
workspace workspace
.update(cx, |this, cx| this.schedule_serialize(cx)) .update(cx, |this, cx| this.serialize_workspace(cx))
.log_err(); .log_err();
cx.stop_propagation(); cx.stop_propagation();
cx.refresh(); cx.refresh();
@ -935,7 +935,7 @@ mod element {
let mut borrow = flexes.lock(); let mut borrow = flexes.lock();
*borrow = vec![1.; borrow.len()]; *borrow = vec![1.; borrow.len()];
workspace workspace
.update(cx, |this, cx| this.schedule_serialize(cx)) .update(cx, |this, cx| this.serialize_workspace(cx))
.log_err(); .log_err();
cx.refresh(); cx.refresh();

View file

@ -631,7 +631,7 @@ impl Workspace {
project::Event::WorktreeRemoved(_) | project::Event::WorktreeAdded => { project::Event::WorktreeRemoved(_) | project::Event::WorktreeAdded => {
this.update_window_title(cx); this.update_window_title(cx);
this.serialize_workspace(cx).detach(); this.serialize_workspace(cx);
} }
project::Event::DisconnectedFromHost => { project::Event::DisconnectedFromHost => {
@ -823,15 +823,15 @@ impl Workspace {
ThemeSettings::reload_current_theme(cx); ThemeSettings::reload_current_theme(cx);
}), }),
cx.observe(&left_dock, |this, _, cx| { cx.observe(&left_dock, |this, _, cx| {
this.serialize_workspace(cx).detach(); this.serialize_workspace(cx);
cx.notify(); cx.notify();
}), }),
cx.observe(&bottom_dock, |this, _, cx| { cx.observe(&bottom_dock, |this, _, cx| {
this.serialize_workspace(cx).detach(); this.serialize_workspace(cx);
cx.notify(); cx.notify();
}), }),
cx.observe(&right_dock, |this, _, cx| { cx.observe(&right_dock, |this, _, cx| {
this.serialize_workspace(cx).detach(); this.serialize_workspace(cx);
cx.notify(); cx.notify();
}), }),
cx.on_release(|this, window, cx| { cx.on_release(|this, window, cx| {
@ -1897,7 +1897,7 @@ impl Workspace {
} }
cx.notify(); cx.notify();
self.serialize_workspace(cx).detach(); self.serialize_workspace(cx);
} }
pub fn close_all_docks(&mut self, cx: &mut ViewContext<Self>) { pub fn close_all_docks(&mut self, cx: &mut ViewContext<Self>) {
@ -1911,7 +1911,7 @@ impl Workspace {
cx.focus_self(); cx.focus_self();
cx.notify(); cx.notify();
self.serialize_workspace(cx).detach(); self.serialize_workspace(cx);
} }
/// Transfer focus to the panel of the given type. /// Transfer focus to the panel of the given type.
@ -1934,6 +1934,8 @@ impl Workspace {
cx: &mut ViewContext<Self>, cx: &mut ViewContext<Self>,
should_focus: impl Fn(&dyn PanelHandle, &mut ViewContext<Dock>) -> bool, should_focus: impl Fn(&dyn PanelHandle, &mut ViewContext<Dock>) -> bool,
) -> Option<Arc<dyn PanelHandle>> { ) -> Option<Arc<dyn PanelHandle>> {
let mut result_panel = None;
let mut serialize = false;
for dock in [&self.left_dock, &self.bottom_dock, &self.right_dock] { for dock in [&self.left_dock, &self.bottom_dock, &self.right_dock] {
if let Some(panel_index) = dock.read(cx).panel_index_for_type::<T>() { if let Some(panel_index) = dock.read(cx).panel_index_for_type::<T>() {
let mut focus_center = false; let mut focus_center = false;
@ -1956,12 +1958,18 @@ impl Workspace {
self.active_pane.update(cx, |pane, cx| pane.focus(cx)) self.active_pane.update(cx, |pane, cx| pane.focus(cx))
} }
self.serialize_workspace(cx).detach(); result_panel = panel;
serialize = true;
break;
}
}
if serialize {
self.serialize_workspace(cx);
}
cx.notify(); cx.notify();
return panel; result_panel
}
}
None
} }
/// Open the panel of the given type /// Open the panel of the given type
@ -2559,7 +2567,7 @@ impl Workspace {
} }
} }
self.serialize_workspace(cx).detach(); self.serialize_workspace(cx);
} }
pub fn split_pane( pub fn split_pane(
@ -3511,17 +3519,22 @@ impl Workspace {
cx.notify(); cx.notify();
} }
fn schedule_serialize(&mut self, cx: &mut ViewContext<Self>) { fn serialize_workspace(&mut self, cx: &mut ViewContext<Self>) {
if self._schedule_serialize.is_none() {
self._schedule_serialize = Some(cx.spawn(|this, mut cx| async move { self._schedule_serialize = Some(cx.spawn(|this, mut cx| async move {
cx.background_executor() cx.background_executor()
.timer(Duration::from_millis(100)) .timer(Duration::from_millis(100))
.await; .await;
this.update(&mut cx, |this, cx| this.serialize_workspace(cx).detach()) this.update(&mut cx, |this, cx| {
this.serialize_workspace_internal(cx).detach();
this._schedule_serialize.take();
})
.log_err(); .log_err();
})); }));
} }
}
fn serialize_workspace(&self, cx: &mut WindowContext) -> Task<()> { fn serialize_workspace_internal(&self, cx: &mut WindowContext) -> Task<()> {
fn serialize_pane_handle(pane_handle: &View<Pane>, cx: &WindowContext) -> SerializedPane { fn serialize_pane_handle(pane_handle: &View<Pane>, cx: &WindowContext) -> SerializedPane {
let (items, active) = { let (items, active) = {
let pane = pane_handle.read(cx); let pane = pane_handle.read(cx);
@ -3741,9 +3754,11 @@ impl Workspace {
})?; })?;
// Serialize ourself to make sure our timestamps and any pane / item changes are replicated // Serialize ourself to make sure our timestamps and any pane / item changes are replicated
workspace.update(&mut cx, |workspace, cx| { workspace
workspace.serialize_workspace(cx).detach() .update(&mut cx, |workspace, cx| {
})?; workspace.serialize_workspace_internal(cx).detach();
})
.ok();
Ok(opened_items) Ok(opened_items)
}) })

View file

@ -2842,11 +2842,12 @@ mod tests {
handle_keymap_file_changes(keymap_rx, cx); handle_keymap_file_changes(keymap_rx, cx);
}); });
workspace workspace
.update(cx, |workspace, _| { .update(cx, |workspace, cx| {
workspace.register_action(|_, _: &A, _cx| {}); workspace.register_action(|_, _: &A, _cx| {});
workspace.register_action(|_, _: &B, _cx| {}); workspace.register_action(|_, _: &B, _cx| {});
workspace.register_action(|_, _: &ActivatePreviousPane, _cx| {}); workspace.register_action(|_, _: &ActivatePreviousPane, _cx| {});
workspace.register_action(|_, _: &ActivatePrevItem, _cx| {}); workspace.register_action(|_, _: &ActivatePrevItem, _cx| {});
cx.notify();
}) })
.unwrap(); .unwrap();
executor.run_until_parked(); executor.run_until_parked();