use gpui::{App, SharedString, font};
use super::mono_font::installed_font_names;
const SYSTEM_UI_FONT: &str = ".SystemUIFont";
pub(super) fn resolve_default_font(cx: &mut App) {
if cx.global::<super::Theme>().font_family != SYSTEM_UI_FONT {
return;
}
let installed = installed_font_names(cx);
if installed.is_empty() {
return;
}
let text_system = cx.text_system();
let resolved = text_system
.get_font_for_id(text_system.resolve_font(&font(SYSTEM_UI_FONT)))
.map(|font| font.family);
let Some(family) = substitute(SYSTEM_UI_FONT, resolved.as_deref(), installed) else {
return;
};
tracing::info!("UI font {SYSTEM_UI_FONT:?} resolves to {family:?}, naming it on the theme.");
cx.global_mut::<super::Theme>().font_family = family;
}
fn substitute(
requested: &str,
resolved: Option<&str>,
installed: &[String],
) -> Option<SharedString> {
let resolved = resolved.filter(|resolved| *resolved != requested)?;
installed
.iter()
.any(|name| name == resolved)
.then(|| resolved.to_string().into())
}
#[cfg(test)]
mod tests {
use super::*;
fn names(names: &[&str]) -> Vec<String> {
names.iter().map(|name| name.to_string()).collect()
}
#[test]
fn keeps_the_system_font_when_it_resolves_to_itself() {
let installed = names(&["Noto Sans", ".SystemUIFont"]);
assert_eq!(
substitute(".SystemUIFont", Some(".SystemUIFont"), &installed),
None
);
}
#[test]
fn names_the_installed_family_the_system_font_fell_back_to() {
let installed = names(&["Noto Sans", "DejaVu Sans"]);
assert_eq!(
substitute(".SystemUIFont", Some("Noto Sans"), &installed),
Some(SharedString::from("Noto Sans"))
);
}
#[test]
fn keeps_the_system_font_when_the_resolved_family_is_not_installed() {
let installed = Vec::new();
assert_eq!(
substitute(".SystemUIFont", Some("Noto Sans"), &installed),
None
);
assert_eq!(substitute(".SystemUIFont", None, &installed), None);
}
}