From 4a3f5b6666a7e5f1d5af2e256432325b011a4cd9 Mon Sep 17 00:00:00 2001 From: Mads Marquart Date: Tue, 30 Nov 2021 00:09:17 +0100 Subject: [PATCH] Fix CGDisplayCreateUUIDFromDisplayID linking (again) See also https://github.com/rust-windowing/winit/pull/1626. The `cocoa` crate links to AppKit, which made the symbol `CGDisplayCreateUUIDFromDisplayID` from ApplicationServices/ColorSync (which AppKit uses internally) available to us (on macOS 10.8 to 10.13). However, this does not work on macOS 10.7 (where AppKit doesn't link to ColorSync internally). Instead of relying on this, we should just link to ApplicationServices directly. --- CHANGELOG.md | 4 ++++ README.md | 10 ---------- build.rs | 10 ---------- src/platform_impl/macos/ffi.rs | 16 ++++++++-------- 4 files changed, 12 insertions(+), 28 deletions(-) delete mode 100644 build.rs diff --git a/CHANGELOG.md b/CHANGELOG.md index 8fcedd8141..b3ff845963 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,7 @@ +# Unreleased + +- Fix linking to the `ColorSync` framework on macOS 10.7. + # 0.26.0 (2021-12-01) - Update `raw-window-handle` to `v0.4`. This is _not_ a breaking change, we still implement `HasRawWindowHandle` from `v0.3`, see [rust-windowing/raw-window-handle#74](https://github.com/rust-windowing/raw-window-handle/pull/74). diff --git a/README.md b/README.md index 1e358c586a..e97e29276d 100644 --- a/README.md +++ b/README.md @@ -119,13 +119,3 @@ fn main() { ``` And run the application with `cargo apk run --example request_redraw_threaded` - -#### MacOS - -To ensure compatibility with older MacOS systems, winit links to -CGDisplayCreateUUIDFromDisplayID through the CoreGraphics framework. -However, under certain setups this function is only available to be linked -through the newer ColorSync framework. So, winit provides the -`WINIT_LINK_COLORSYNC` environment variable which can be set to `1` or `true` -while compiling to enable linking via ColorSync. - diff --git a/build.rs b/build.rs deleted file mode 100644 index a092e63631..0000000000 --- a/build.rs +++ /dev/null @@ -1,10 +0,0 @@ -fn main() { - // If building for macos and WINIT_LINK_COLORSYNC is set to true - // use CGDisplayCreateUUIDFromDisplayID from ColorSync instead of CoreGraphics - if std::env::var("CARGO_CFG_TARGET_OS").map_or(false, |os| os == "macos") - && std::env::var("WINIT_LINK_COLORSYNC") - .map_or(false, |v| v == "1" || v.eq_ignore_ascii_case("true")) - { - println!("cargo:rustc-cfg=use_colorsync_cgdisplaycreateuuidfromdisplayid"); - } -} diff --git a/src/platform_impl/macos/ffi.rs b/src/platform_impl/macos/ffi.rs index 991b3f331d..6f210ac1bd 100644 --- a/src/platform_impl/macos/ffi.rs +++ b/src/platform_impl/macos/ffi.rs @@ -165,14 +165,14 @@ pub const IO8BitOverlayPixels: &str = "O8"; pub type CGWindowLevel = i32; pub type CGDisplayModeRef = *mut c_void; -#[cfg_attr( - not(use_colorsync_cgdisplaycreateuuidfromdisplayid), - link(name = "CoreGraphics", kind = "framework") -)] -#[cfg_attr( - use_colorsync_cgdisplaycreateuuidfromdisplayid, - link(name = "ColorSync", kind = "framework") -)] +// `CGDisplayCreateUUIDFromDisplayID` comes from the `ColorSync` framework. +// However, that framework was only introduced "publicly" in macOS 10.13. +// +// Since we want to support older versions, we can't link to `ColorSync` +// directly. Fortunately, it has always been available as a subframework of +// `ApplicationServices`, see: +// https://developer.apple.com/library/archive/documentation/MacOSX/Conceptual/OSX_Technology_Overview/SystemFrameworks/SystemFrameworks.html#//apple_ref/doc/uid/TP40001067-CH210-BBCFFIEG +#[link(name = "ApplicationServices", kind = "framework")] extern "C" { pub fn CGDisplayCreateUUIDFromDisplayID(display: CGDirectDisplayID) -> CFUUIDRef; }