From 1004018941eb0f3c85c2a535c2d6631ef9ef6385 Mon Sep 17 00:00:00 2001 From: BlackHoleFox Date: Thu, 5 Jan 2023 13:58:16 -0600 Subject: [PATCH] Directly read preferences instead of using the defaults CLI --- CHANGELOG.md | 1 + Cargo.lock | 1 + Cargo.toml | 4 ++++ src/assets.rs | 20 +++++++++++++++----- 4 files changed, 21 insertions(+), 5 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index f19ce5bf..71b323c6 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 434e81e1..6b375f3c 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 8995c6eb..7e174cbb 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 e4a4af7f..d43f4321 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, } }