From b9307a99676354a77e0d93838777207f2626c74a Mon Sep 17 00:00:00 2001 From: Imberflur <2002109+Imberflur@users.noreply.github.com> Date: Fri, 5 Feb 2021 02:58:55 -0500 Subject: [PATCH] Change linking of CGDisplayCreateUUIDFromDisplayID on macos (#1626) * Link CGDisplayCreateUUIDFromDisplayID through ColorSync instead of CoreGraphics * Conditionally link through ColorSync only if WINIT_LINK_COLORSYNC is set to true * Document new macos env var in README --- README.md | 10 ++++++++++ build.rs | 10 ++++++++++ src/platform_impl/macos/ffi.rs | 13 ++++++++++++- 3 files changed, 32 insertions(+), 1 deletion(-) create mode 100644 build.rs diff --git a/README.md b/README.md index e387ec0d..8ba6518d 100644 --- a/README.md +++ b/README.md @@ -110,3 +110,13 @@ 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 new file mode 100644 index 00000000..a092e636 --- /dev/null +++ b/build.rs @@ -0,0 +1,10 @@ +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 aec0fc97..1bcdafba 100644 --- a/src/platform_impl/macos/ffi.rs +++ b/src/platform_impl/macos/ffi.rs @@ -161,6 +161,18 @@ pub const IO8BitOverlayPixels: &str = "O8"; pub type CGWindowLevel = i32; pub type CGDisplayModeRef = *mut libc::c_void; +#[cfg_attr( + not(use_colorsync_cgdisplaycreateuuidfromdisplayid), + link(name = "CoreGraphics", kind = "framework") +)] +#[cfg_attr( + use_colorsync_cgdisplaycreateuuidfromdisplayid, + link(name = "ColorSync", kind = "framework") +)] +extern "C" { + pub fn CGDisplayCreateUUIDFromDisplayID(display: CGDirectDisplayID) -> CFUUIDRef; +} + #[link(name = "CoreGraphics", kind = "framework")] extern "C" { pub fn CGRestorePermanentDisplayConfiguration(); @@ -189,7 +201,6 @@ extern "C" { synchronous: Boolean, ) -> CGError; pub fn CGReleaseDisplayFadeReservation(token: CGDisplayFadeReservationToken) -> CGError; - pub fn CGDisplayCreateUUIDFromDisplayID(display: CGDirectDisplayID) -> CFUUIDRef; pub fn CGShieldingWindowLevel() -> CGWindowLevel; pub fn CGDisplaySetDisplayMode( display: CGDirectDisplayID,