From 560da05fef957760d1b7e99a801a1725177fd708 Mon Sep 17 00:00:00 2001 From: Mads Marquart Date: Mon, 5 Sep 2022 13:33:44 +0200 Subject: [PATCH] Add CoreGraphics FFI used by `winit` --- core-graphics-types/src/base.rs | 11 +++++++ core-graphics/src/display.rs | 51 +++++++++++++++++++++++++++++++++ 2 files changed, 62 insertions(+) diff --git a/core-graphics-types/src/base.rs b/core-graphics-types/src/base.rs index d5efc3b..2a08126 100644 --- a/core-graphics-types/src/base.rs +++ b/core-graphics-types/src/base.rs @@ -30,3 +30,14 @@ pub type CGError = libc::int32_t; pub type CGGlyph = libc::c_ushort; +pub const kCGErrorSuccess: CGError = 0; +pub const kCGErrorFailure: CGError = 1000; +pub const kCGErrorIllegalArgument: CGError = 1001; +pub const kCGErrorInvalidConnection: CGError = 1002; +pub const kCGErrorInvalidContext: CGError = 1003; +pub const kCGErrorCannotComplete: CGError = 1004; +pub const kCGErrorNotImplemented: CGError = 1006; +pub const kCGErrorRangeCheck: CGError = 1007; +pub const kCGErrorTypeCheck: CGError = 1008; +pub const kCGErrorInvalidOperation: CGError = 1010; +pub const kCGErrorNoneAvailable: CGError = 1011; diff --git a/core-graphics/src/display.rs b/core-graphics/src/display.rs index 394520b..3fe5b6e 100644 --- a/core-graphics/src/display.rs +++ b/core-graphics/src/display.rs @@ -23,6 +23,7 @@ use foreign_types::ForeignType; pub type CGDirectDisplayID = u32; pub type CGWindowID = u32; +pub type CGWindowLevel = i32; pub const kCGNullWindowID: CGWindowID = 0 as CGWindowID; pub const kCGNullDirectDisplayID: CGDirectDisplayID = 0 as CGDirectDisplayID; @@ -68,6 +69,17 @@ pub const kDisplayModeNativeFlag: u32 = 0x02000000; pub const kDisplayModeSafetyFlags: u32 = 0x00000007; +pub type CGDisplayBlendFraction = f32; +pub const kCGDisplayBlendNormal: CGDisplayBlendFraction = 0.0; +pub const kCGDisplayBlendSolidColor: CGDisplayBlendFraction = 1.0; + +pub type CGDisplayFadeReservationToken = u32; +pub const kCGDisplayFadeReservationInvalidToken: CGDisplayFadeReservationToken = 0; + +pub type CGDisplayFadeInterval = f32; +pub type CGDisplayReservationInterval = f32; +pub const kCGMaxDisplayReservationInterval: CGDisplayReservationInterval = 15.0; + pub const IO1BitIndexedPixels: &str = "P"; pub const IO2BitIndexedPixels: &str = "PP"; pub const IO4BitIndexedPixels: &str = "PPPP"; @@ -621,6 +633,7 @@ extern "C" { pub static kCGDisplayShowDuplicateLowResolutionModes: CFStringRef; + pub fn CGDisplayModeRetain(mode: ::sys::CGDisplayModeRef); pub fn CGDisplayModeRelease(mode: ::sys::CGDisplayModeRef); pub fn CGMainDisplayID() -> CGDirectDisplayID; @@ -658,6 +671,12 @@ extern "C" { pub fn CGDisplayBounds(display: CGDirectDisplayID) -> CGRect; pub fn CGDisplayCreateImage(display: CGDirectDisplayID) -> ::sys::CGImageRef; + // Capturing and Releasing Displays + pub fn CGDisplayCapture(display: CGDirectDisplayID) -> CGError; + pub fn CGDisplayRelease(display: CGDirectDisplayID) -> CGError; + pub fn CGShieldingWindowLevel() -> CGWindowLevel; + + // Configuring Displays pub fn CGBeginDisplayConfiguration(config: *mut CGDisplayConfigRef) -> CGError; pub fn CGCancelDisplayConfiguration(config: CGDisplayConfigRef) -> CGError; pub fn CGCompleteDisplayConfiguration( @@ -681,6 +700,7 @@ extern "C" { x: i32, y: i32, ) -> CGError; + pub fn CGRestorePermanentDisplayConfiguration(); pub fn CGDisplayCopyDisplayMode(display: CGDirectDisplayID) -> ::sys::CGDisplayModeRef; pub fn CGDisplayModeGetHeight(mode: ::sys::CGDisplayModeRef) -> libc::size_t; @@ -696,6 +716,11 @@ extern "C" { display: CGDirectDisplayID, options: CFDictionaryRef, ) -> CFArrayRef; + pub fn CGDisplaySetDisplayMode( + display: CGDirectDisplayID, + mode: ::sys::CGDisplayModeRef, + options: CFDictionaryRef, + ) -> CGError; // mouse stuff pub fn CGDisplayHideCursor(display: CGDirectDisplayID) -> CGError; @@ -704,6 +729,32 @@ extern "C" { pub fn CGWarpMouseCursorPosition(point: CGPoint) -> CGError; pub fn CGAssociateMouseAndMouseCursorPosition(connected: boolean_t) -> CGError; + // Display Fade Effects + pub fn CGConfigureDisplayFadeEffect( + config: CGDisplayConfigRef, + fadeOutSeconds: CGDisplayFadeInterval, + fadeInSeconds: CGDisplayFadeInterval, + fadeRed: f32, + fadeGreen: f32, + fadeBlue: f32, + ) -> CGError; + pub fn CGAcquireDisplayFadeReservation( + seconds: CGDisplayReservationInterval, + token: *mut CGDisplayFadeReservationToken, + ) -> CGError; + pub fn CGDisplayFade( + token: CGDisplayFadeReservationToken, + duration: CGDisplayFadeInterval, + startBlend: CGDisplayBlendFraction, + endBlend: CGDisplayBlendFraction, + redBlend: f32, + greenBlend: f32, + blueBlend: f32, + synchronous: boolean_t, + ) -> CGError; + // CGDisplayFadeOperationInProgress + pub fn CGReleaseDisplayFadeReservation(token: CGDisplayFadeReservationToken) -> CGError; + // Window Services Reference pub fn CGWindowListCopyWindowInfo( option: CGWindowListOption,