diff --git a/Cargo.lock b/Cargo.lock index bf6568c7..f66a2cab 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1623,7 +1623,7 @@ dependencies = [ [[package]] name = "collections" version = "0.1.0" -source = "git+https://github.com/l0ng-ai/zed?branch=tty7#3d46ee70fb1c574d30671d55006c6de359c8bf28" +source = "git+https://github.com/l0ng-ai/zed?branch=tty7#fb4472347db56abd807008a7a9c5557474679363" dependencies = [ "gpui_util", "indexmap", @@ -2286,7 +2286,7 @@ dependencies = [ [[package]] name = "derive_refineable" version = "0.1.0" -source = "git+https://github.com/l0ng-ai/zed?branch=tty7#3d46ee70fb1c574d30671d55006c6de359c8bf28" +source = "git+https://github.com/l0ng-ai/zed?branch=tty7#fb4472347db56abd807008a7a9c5557474679363" dependencies = [ "proc-macro2", "quote", @@ -3783,7 +3783,7 @@ dependencies = [ [[package]] name = "gpui" version = "0.2.2" -source = "git+https://github.com/l0ng-ai/zed?branch=tty7#3d46ee70fb1c574d30671d55006c6de359c8bf28" +source = "git+https://github.com/l0ng-ai/zed?branch=tty7#fb4472347db56abd807008a7a9c5557474679363" dependencies = [ "accesskit", "anyhow", @@ -3974,7 +3974,7 @@ dependencies = [ [[package]] name = "gpui_linux" version = "0.1.0" -source = "git+https://github.com/l0ng-ai/zed?branch=tty7#3d46ee70fb1c574d30671d55006c6de359c8bf28" +source = "git+https://github.com/l0ng-ai/zed?branch=tty7#fb4472347db56abd807008a7a9c5557474679363" dependencies = [ "accesskit", "accesskit_unix", @@ -4025,7 +4025,7 @@ dependencies = [ [[package]] name = "gpui_macos" version = "0.1.0" -source = "git+https://github.com/l0ng-ai/zed?branch=tty7#3d46ee70fb1c574d30671d55006c6de359c8bf28" +source = "git+https://github.com/l0ng-ai/zed?branch=tty7#fb4472347db56abd807008a7a9c5557474679363" dependencies = [ "accesskit", "accesskit_macos", @@ -4072,7 +4072,7 @@ dependencies = [ [[package]] name = "gpui_macros" version = "0.1.0" -source = "git+https://github.com/l0ng-ai/zed?branch=tty7#3d46ee70fb1c574d30671d55006c6de359c8bf28" +source = "git+https://github.com/l0ng-ai/zed?branch=tty7#fb4472347db56abd807008a7a9c5557474679363" dependencies = [ "heck 0.5.0", "proc-macro2", @@ -4083,7 +4083,7 @@ dependencies = [ [[package]] name = "gpui_platform" version = "0.1.0" -source = "git+https://github.com/l0ng-ai/zed?branch=tty7#3d46ee70fb1c574d30671d55006c6de359c8bf28" +source = "git+https://github.com/l0ng-ai/zed?branch=tty7#fb4472347db56abd807008a7a9c5557474679363" dependencies = [ "console_error_panic_hook", "gpui", @@ -4096,7 +4096,7 @@ dependencies = [ [[package]] name = "gpui_shared_string" version = "0.1.0" -source = "git+https://github.com/l0ng-ai/zed?branch=tty7#3d46ee70fb1c574d30671d55006c6de359c8bf28" +source = "git+https://github.com/l0ng-ai/zed?branch=tty7#fb4472347db56abd807008a7a9c5557474679363" dependencies = [ "schemars", "serde", @@ -4106,7 +4106,7 @@ dependencies = [ [[package]] name = "gpui_util" version = "0.1.0" -source = "git+https://github.com/l0ng-ai/zed?branch=tty7#3d46ee70fb1c574d30671d55006c6de359c8bf28" +source = "git+https://github.com/l0ng-ai/zed?branch=tty7#fb4472347db56abd807008a7a9c5557474679363" dependencies = [ "anyhow", "log", @@ -4115,7 +4115,7 @@ dependencies = [ [[package]] name = "gpui_web" version = "0.1.0" -source = "git+https://github.com/l0ng-ai/zed?branch=tty7#3d46ee70fb1c574d30671d55006c6de359c8bf28" +source = "git+https://github.com/l0ng-ai/zed?branch=tty7#fb4472347db56abd807008a7a9c5557474679363" dependencies = [ "anyhow", "console_error_panic_hook", @@ -4139,7 +4139,7 @@ dependencies = [ [[package]] name = "gpui_wgpu" version = "0.1.0" -source = "git+https://github.com/l0ng-ai/zed?branch=tty7#3d46ee70fb1c574d30671d55006c6de359c8bf28" +source = "git+https://github.com/l0ng-ai/zed?branch=tty7#fb4472347db56abd807008a7a9c5557474679363" dependencies = [ "anyhow", "bytemuck", @@ -4168,7 +4168,7 @@ dependencies = [ [[package]] name = "gpui_windows" version = "0.1.0" -source = "git+https://github.com/l0ng-ai/zed?branch=tty7#3d46ee70fb1c574d30671d55006c6de359c8bf28" +source = "git+https://github.com/l0ng-ai/zed?branch=tty7#fb4472347db56abd807008a7a9c5557474679363" dependencies = [ "accesskit", "accesskit_windows", @@ -4537,7 +4537,7 @@ dependencies = [ [[package]] name = "http_client" version = "0.1.0" -source = "git+https://github.com/l0ng-ai/zed?branch=tty7#3d46ee70fb1c574d30671d55006c6de359c8bf28" +source = "git+https://github.com/l0ng-ai/zed?branch=tty7#fb4472347db56abd807008a7a9c5557474679363" dependencies = [ "anyhow", "async-compression", @@ -4562,7 +4562,7 @@ dependencies = [ [[package]] name = "http_client_tls" version = "0.1.0" -source = "git+https://github.com/l0ng-ai/zed?branch=tty7#3d46ee70fb1c574d30671d55006c6de359c8bf28" +source = "git+https://github.com/l0ng-ai/zed?branch=tty7#fb4472347db56abd807008a7a9c5557474679363" dependencies = [ "rustls", "rustls-platform-verifier 0.5.3", @@ -6054,7 +6054,7 @@ checksum = "7ebb8d8732c6a6df3d8f032a82911cfc747e00efb95cc46e8d0acd5b5b88570c" [[package]] name = "media" version = "0.1.0" -source = "git+https://github.com/l0ng-ai/zed?branch=tty7#3d46ee70fb1c574d30671d55006c6de359c8bf28" +source = "git+https://github.com/l0ng-ai/zed?branch=tty7#fb4472347db56abd807008a7a9c5557474679363" dependencies = [ "anyhow", "bindgen", @@ -7585,7 +7585,7 @@ checksum = "9b4f627cb1b25917193a259e49bdad08f671f8d9708acfd5fe0a8c1455d87220" [[package]] name = "perf" version = "0.1.0" -source = "git+https://github.com/l0ng-ai/zed?branch=tty7#3d46ee70fb1c574d30671d55006c6de359c8bf28" +source = "git+https://github.com/l0ng-ai/zed?branch=tty7#fb4472347db56abd807008a7a9c5557474679363" dependencies = [ "collections", "serde", @@ -8690,7 +8690,7 @@ dependencies = [ [[package]] name = "refineable" version = "0.1.0" -source = "git+https://github.com/l0ng-ai/zed?branch=tty7#3d46ee70fb1c574d30671d55006c6de359c8bf28" +source = "git+https://github.com/l0ng-ai/zed?branch=tty7#fb4472347db56abd807008a7a9c5557474679363" dependencies = [ "derive_refineable", ] @@ -8770,7 +8770,7 @@ dependencies = [ [[package]] name = "reqwest_client" version = "0.1.0" -source = "git+https://github.com/l0ng-ai/zed?branch=tty7#3d46ee70fb1c574d30671d55006c6de359c8bf28" +source = "git+https://github.com/l0ng-ai/zed?branch=tty7#fb4472347db56abd807008a7a9c5557474679363" dependencies = [ "anyhow", "bytes", @@ -9356,7 +9356,7 @@ dependencies = [ [[package]] name = "scheduler" version = "0.1.0" -source = "git+https://github.com/l0ng-ai/zed?branch=tty7#3d46ee70fb1c574d30671d55006c6de359c8bf28" +source = "git+https://github.com/l0ng-ai/zed?branch=tty7#fb4472347db56abd807008a7a9c5557474679363" dependencies = [ "async-task", "backtrace", @@ -10296,7 +10296,7 @@ checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292" [[package]] name = "sum_tree" version = "0.1.0" -source = "git+https://github.com/l0ng-ai/zed?branch=tty7#3d46ee70fb1c574d30671d55006c6de359c8bf28" +source = "git+https://github.com/l0ng-ai/zed?branch=tty7#fb4472347db56abd807008a7a9c5557474679363" dependencies = [ "heapless 0.9.3", "log", @@ -11944,7 +11944,7 @@ checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821" [[package]] name = "util" version = "0.1.0" -source = "git+https://github.com/l0ng-ai/zed?branch=tty7#3d46ee70fb1c574d30671d55006c6de359c8bf28" +source = "git+https://github.com/l0ng-ai/zed?branch=tty7#fb4472347db56abd807008a7a9c5557474679363" dependencies = [ "anyhow", "async-fs", @@ -11983,7 +11983,7 @@ dependencies = [ [[package]] name = "util_macros" version = "0.1.0" -source = "git+https://github.com/l0ng-ai/zed?branch=tty7#3d46ee70fb1c574d30671d55006c6de359c8bf28" +source = "git+https://github.com/l0ng-ai/zed?branch=tty7#fb4472347db56abd807008a7a9c5557474679363" dependencies = [ "perf", "quote", @@ -13963,7 +13963,7 @@ dependencies = [ [[package]] name = "zlog" version = "0.1.0" -source = "git+https://github.com/l0ng-ai/zed?branch=tty7#3d46ee70fb1c574d30671d55006c6de359c8bf28" +source = "git+https://github.com/l0ng-ai/zed?branch=tty7#fb4472347db56abd807008a7a9c5557474679363" dependencies = [ "anyhow", "chrono", @@ -14008,7 +14008,7 @@ dependencies = [ [[package]] name = "ztracing" version = "0.1.0" -source = "git+https://github.com/l0ng-ai/zed?branch=tty7#3d46ee70fb1c574d30671d55006c6de359c8bf28" +source = "git+https://github.com/l0ng-ai/zed?branch=tty7#fb4472347db56abd807008a7a9c5557474679363" dependencies = [ "tracing", "tracing-subscriber", @@ -14019,7 +14019,7 @@ dependencies = [ [[package]] name = "ztracing_macro" version = "0.1.0" -source = "git+https://github.com/l0ng-ai/zed?branch=tty7#3d46ee70fb1c574d30671d55006c6de359c8bf28" +source = "git+https://github.com/l0ng-ai/zed?branch=tty7#fb4472347db56abd807008a7a9c5557474679363" [[package]] name = "zune-core" diff --git a/Cargo.toml b/Cargo.toml index c13fa30a..3d5b4522 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -242,10 +242,10 @@ objc2-app-kit = { version = "0.3", features = ["NSApplication", "NSResponder", " # `set_dock_icon_for_bare_binary` in main.rs. # NSUserNotification is the click-to-reveal notification path — see # `terminal::remote::macos_notify` for why it is driven directly. -# NSUserDefaults (with NSDictionary / NSValue for the domain it takes) pins -# `AppleFontSmoothing` for this process when `font_thicken` is off — see +# NSUserDefaults (with NSDictionary for the domain it returns) is how a test +# checks that `font_thicken: false` leaves `AppleFontSmoothing` alone — see # `apply_font_thicken` in main.rs. -objc2-foundation = { version = "0.3", features = ["NSData", "NSDictionary", "NSString", "NSUserDefaults", "NSUserNotification", "NSValue"] } +objc2-foundation = { version = "0.3", features = ["NSData", "NSDictionary", "NSString", "NSUserDefaults", "NSUserNotification"] } # Dictionary-based Chinese word segmentation for double-click selection # (`terminal::smart_select`), as a *fallback* where the OS has no tokenizer of @@ -451,6 +451,13 @@ codegen-units = 1 # the text showed through — the Changes panel's flush-right directory drew # through the hover action buttons. # +# 8. `gpui_platform::set_glyph_dilation` turns off the stroke thickening macOS +# font smoothing applies to light glyphs, for gpui's rasterizer alone. The +# only other lever is `AppleFontSmoothing`, which AppKit reads too, so +# `font_thicken: false` used to thin the native menus and alerts while the +# terminal's dark text — never dilated to begin with — looked the same +# (issue #1119). +# # Patching by source rather than editing the `gpui`/`gpui_platform` pins above is # deliberate: `gpui-component` declares its own `gpui` from the upstream URL, and # a plain pin swap would put two incompatible copies of gpui in the tree. `[patch]` diff --git a/crates/tty7-core/src/core/config.rs b/crates/tty7-core/src/core/config.rs index 017ff05d..b133dd62 100644 --- a/crates/tty7-core/src/core/config.rs +++ b/crates/tty7-core/src/core/config.rs @@ -139,10 +139,11 @@ pub struct Config { /// more the lighter the text, which is why light-on-dark looks bolder. /// On by default, because it is what every macOS app draws with. /// - /// Off pins `AppleFontSmoothing` to `0` for this process alone, so glyphs - /// are drawn at the face's own weight. gpui reads that preference once, the - /// first time it rasterizes text, so a change applies at the next launch. - /// Ignored elsewhere, where there is no such dilation to turn off. + /// Off tells gpui's rasterizer not to dilate, so tty7's glyphs are drawn + /// at the face's own weight. `AppleFontSmoothing` is left alone, so menus + /// and other natively drawn text keep the system's look (#1119). Applied + /// at launch, so a change takes hold at the next one. Ignored elsewhere, + /// where there is no such dilation to turn off. #[serde(default = "default_true")] pub font_thicken: bool, pub font_size: f32, diff --git a/docs/customization/fonts.mdx b/docs/customization/fonts.mdx index 1e96158b..6787beca 100644 --- a/docs/customization/fonts.mdx +++ b/docs/customization/fonts.mdx @@ -90,9 +90,10 @@ turns it off, so glyphs draw at the face's own weight whatever their colour: ``` - The change applies the next time tty7 starts: the preference is read once, - when text is first drawn. It covers tty7 alone — no other app, and not the - system-wide setting. + The change applies the next time tty7 starts. It covers the terminal and + tty7's own interface text alone: menus and other native macOS controls, other + apps, and the system-wide setting all keep their look. Dark text is barely + thickened to begin with, so on a light theme the difference is small. Leaving it on changes nothing, so an existing diff --git a/src/main.rs b/src/main.rs index dcefe025..64f71ae9 100644 --- a/src/main.rs +++ b/src/main.rs @@ -524,39 +524,21 @@ fn set_dock_icon_for_bare_binary() { } } -/// Turns CoreGraphics' stroke thickening off for this process when -/// `font_thicken` is off; with it on there is nothing to do, and whatever the -/// system (or a hand-written `defaults write`) says stands. +/// Turns gpui's stroke thickening off for tty7's text when `font_thicken` is +/// off; with it on, whatever the system (or a hand-written `defaults write`) +/// says stands. /// -/// gpui decides whether to dilate a glyph from `AppleFontSmoothing`, read with -/// `CFPreferencesCopyAppValue` the first time it rasterizes text and cached for -/// the life of the process. So this has to land before the application exists, -/// and a change waits for the next launch. +/// The switch lives in gpui's rasterizer and nowhere else. Pinning +/// `AppleFontSmoothing` to `0` for the process (which is how this used to be +/// done) reached AppKit as well: the menus, alerts and every other natively +/// drawn string lost their smoothing, while the terminal's dark-on-light text, +/// which gpui never thickens, looked no different (#1119). /// -/// The value goes into the argument domain — the volatile one that -/// `-AppleFontSmoothing 0` on the command line would fill. It outranks both this -/// app's persisted defaults and the global domain, and it lives only in this -/// process's memory: nothing reaches disk, so no other app sees it and a later -/// launch with the key back on does not inherit it. +/// Applied once at launch, before any text is drawn; a change made in Settings +/// waits for the next one. #[cfg(target_os = "macos")] fn apply_font_thicken(thicken: bool) { - use objc2_foundation::{ - NSArgumentDomain, NSMutableCopying, NSNumber, NSUserDefaults, ns_string, - }; - - if thicken { - return; - } - let defaults = NSUserDefaults::standardUserDefaults(); - // SAFETY: a Foundation constant, initialized before `main` runs. - let domain = unsafe { NSArgumentDomain }; - // Merged into, not replaced: the domain already holds any `-Key value` - // pairs the process was launched with. - let arguments = defaults.volatileDomainForName(domain).mutableCopy(); - arguments.insert(ns_string!("AppleFontSmoothing"), &*NSNumber::new_i32(0)); - // SAFETY: keys are `NSString` and values property-list objects, which is - // the shape a defaults domain requires. - unsafe { defaults.setVolatileDomain_forName(&arguments, domain) }; + gpui_platform::set_glyph_dilation(thicken); } /// Delivers Finder document opens and LaunchServices URL opens after gpui has @@ -841,6 +823,31 @@ fn main() { }); } +#[cfg(all(test, target_os = "macos"))] +mod font_thicken_tests { + use super::apply_font_thicken; + use objc2_foundation::{NSArgumentDomain, NSUserDefaults, ns_string}; + + /// #1119: turning thickening off must not reach AppKit. `AppleFontSmoothing` + /// in any domain this process reads restyles its native menus and alerts, + /// so the switch may only ever talk to gpui. + #[test] + fn turning_thickening_off_leaves_the_smoothing_preference_alone() { + let defaults = NSUserDefaults::standardUserDefaults(); + let key = ns_string!("AppleFontSmoothing"); + let before = defaults.objectForKey(key); + + apply_font_thicken(false); + + // SAFETY: a Foundation constant, initialized before `main` runs. + let arguments = defaults.volatileDomainForName(unsafe { NSArgumentDomain }); + assert!(arguments.objectForKey(key).is_none()); + assert_eq!(defaults.objectForKey(key).is_some(), before.is_some()); + + apply_font_thicken(true); + } +} + /// The watcher tick, from a reloaded file to the keys the app dispatches on. /// /// The one thing #548 is for — hand-editing config.json and having the new diff --git a/src/ui/app.rs b/src/ui/app.rs index 64b9280a..e69f1fa4 100644 --- a/src/ui/app.rs +++ b/src/ui/app.rs @@ -3908,8 +3908,8 @@ impl Tty7App { self.update_config(cx, |cfg| cfg.show_tray_icon = on); } - /// Saved only: gpui reads the preference this drives once per process, so - /// it takes hold at the next launch (see `apply_font_thicken` in main.rs). + /// Saved only: it is handed to gpui once, at launch, so it takes hold at + /// the next one (see `apply_font_thicken` in main.rs). pub(crate) fn set_font_thicken(&mut self, on: bool, cx: &mut Context) { self.update_config(cx, |cfg| cfg.font_thicken = on); }