diff --git a/CHANGELOG.md b/CHANGELOG.md index f19ce5bf31..71b323c676 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -13,6 +13,7 @@ - Various bash completion improvements, see #2310 (@scop) - Disable completion of `cache` subcommand, see #2399 (@cyqsimon) +- Signifigantly improve startup performance on macOS, see #2442 (@BlackHoleFox) ## Syntaxes diff --git a/Cargo.lock b/Cargo.lock index 434e81e17b..6b375f3cb6 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -97,6 +97,7 @@ dependencies = [ "nix", "once_cell", "path_abs", + "plist", "predicates", "regex", "semver", diff --git a/Cargo.toml b/Cargo.toml index 8995c6ebb7..7e174cbbab 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -81,6 +81,10 @@ version = "4.0.2" optional = true features = ["wrap_help", "cargo"] +[target.'cfg(target_os = "macos")'.dependencies] +dirs-next = "2.0.0" +plist = "1.3" + [dev-dependencies] assert_cmd = "2.0.8" expect-test = "1.4.0" diff --git a/src/assets.rs b/src/assets.rs index e4a4af7f1f..d43f4321ab 100644 --- a/src/assets.rs +++ b/src/assets.rs @@ -401,11 +401,21 @@ fn asset_from_cache( #[cfg(target_os = "macos")] fn macos_dark_mode_active() -> bool { - let mut defaults_cmd = std::process::Command::new("defaults"); - defaults_cmd.args(&["read", "-globalDomain", "AppleInterfaceStyle"]); - match defaults_cmd.output() { - Ok(output) => output.stdout == b"Dark\n", - Err(_) => true, + const PREFERENCES_FILE: &str = "Library/Preferences/.GlobalPreferences.plist"; + const STYLE_KEY: &str = "AppleInterfaceStyle"; + + let preferences_file = dirs_next::home_dir() + .map(|home| home.join(PREFERENCES_FILE)) + .expect("Could not get home directory"); + + match plist::Value::from_file(preferences_file).map(|file| file.into_dictionary()) { + Ok(Some(preferences)) => match preferences.get(STYLE_KEY).and_then(|val| val.as_string()) { + Some(value) => value == "Dark", + // If the key does not exist, then light theme is currently in use. + None => false, + }, + // Unreachable, in theory. All macOS users have a home directory and preferences file setup. + Ok(None) | Err(_) => true, } }