Ensure settings global is initialized immediately

This commit is contained in:
Max Brunsfeld 2022-07-12 18:42:48 -07:00
parent 2d23774ac0
commit 0defb0e50f
2 changed files with 39 additions and 28 deletions

View file

@ -127,11 +127,10 @@ fn main() {
let db = cx.background().block(db); let db = cx.background().block(db);
let (settings_file, keymap_file) = cx.background().block(config_files).unwrap(); let (settings_file, keymap_file) = cx.background().block(config_files).unwrap();
watch_settings_file(default_settings, settings_file, themes.clone(), cx);
watch_keymap_file(keymap_file, cx);
cx.spawn(|cx| watch_themes(fs.clone(), themes.clone(), cx)) cx.spawn(|cx| watch_themes(fs.clone(), themes.clone(), cx))
.detach(); .detach();
cx.spawn(|cx| watch_keymap_file(keymap_file, cx)).detach();
cx.spawn(|cx| watch_settings_file(default_settings, settings_file, themes.clone(), cx))
.detach();
cx.spawn({ cx.spawn({
let languages = languages.clone(); let languages = languages.clone();

View file

@ -1,5 +1,5 @@
use futures::StreamExt; use futures::StreamExt;
use gpui::{executor, AsyncAppContext}; use gpui::{executor, MutableAppContext};
use postage::sink::Sink as _; use postage::sink::Sink as _;
use postage::{prelude::Stream, watch}; use postage::{prelude::Stream, watch};
use project::Fs; use project::Fs;
@ -10,7 +10,7 @@ use theme::ThemeRegistry;
use util::ResultExt; use util::ResultExt;
#[derive(Clone)] #[derive(Clone)]
pub struct WatchedJsonFile<T>(watch::Receiver<T>); pub struct WatchedJsonFile<T>(pub watch::Receiver<T>);
impl<T> WatchedJsonFile<T> impl<T> WatchedJsonFile<T>
where where
@ -51,33 +51,46 @@ where
} }
} }
pub async fn watch_settings_file( pub fn watch_settings_file(
defaults: Settings, defaults: Settings,
mut file: WatchedJsonFile<SettingsFileContent>, mut file: WatchedJsonFile<SettingsFileContent>,
theme_registry: Arc<ThemeRegistry>, theme_registry: Arc<ThemeRegistry>,
mut cx: AsyncAppContext, cx: &mut MutableAppContext,
) { ) {
while let Some(content) = file.0.recv().await { settings_updated(&defaults, file.0.borrow().clone(), &theme_registry, cx);
cx.update(|cx| { cx.spawn(|mut cx| async move {
let mut settings = defaults.clone(); while let Some(content) = file.0.recv().await {
settings.set_user_settings(content, &theme_registry, &cx.font_cache()); cx.update(|cx| settings_updated(&defaults, content, &theme_registry, cx));
cx.set_global(settings); }
cx.refresh_windows(); })
}); .detach();
}
} }
pub async fn watch_keymap_file( pub fn keymap_updated(content: KeymapFileContent, cx: &mut MutableAppContext) {
mut file: WatchedJsonFile<KeymapFileContent>, cx.clear_bindings();
mut cx: AsyncAppContext, settings::KeymapFileContent::load_defaults(cx);
content.add(cx).log_err();
}
pub fn settings_updated(
defaults: &Settings,
content: SettingsFileContent,
theme_registry: &Arc<ThemeRegistry>,
cx: &mut MutableAppContext,
) { ) {
while let Some(content) = file.0.recv().await { let mut settings = defaults.clone();
cx.update(|cx| { settings.set_user_settings(content, theme_registry, &cx.font_cache());
cx.clear_bindings(); cx.set_global(settings);
settings::KeymapFileContent::load_defaults(cx); cx.refresh_windows();
content.add(cx).log_err(); }
});
} pub fn watch_keymap_file(mut file: WatchedJsonFile<KeymapFileContent>, cx: &mut MutableAppContext) {
cx.spawn(|mut cx| async move {
while let Some(content) = file.0.recv().await {
cx.update(|cx| keymap_updated(content, cx));
}
})
.detach();
} }
#[cfg(test)] #[cfg(test)]
@ -123,15 +136,14 @@ mod tests {
..Default::default() ..Default::default()
}, },
); );
cx.spawn(|cx| { cx.update(|cx| {
watch_settings_file( watch_settings_file(
default_settings.clone(), default_settings.clone(),
source, source,
ThemeRegistry::new((), font_cache), ThemeRegistry::new((), font_cache),
cx, cx,
) )
}) });
.detach();
cx.foreground().run_until_parked(); cx.foreground().run_until_parked();
let settings = cx.read(|cx| cx.global::<Settings>().clone()); let settings = cx.read(|cx| cx.global::<Settings>().clone());