mirror of
https://github.com/rustdesk/rustdesk.git
synced 2024-12-28 23:57:57 +08:00
241 lines
6.5 KiB
Rust
241 lines
6.5 KiB
Rust
#![allow(dead_code)]
|
|
|
|
use block::RcBlock;
|
|
use libc::c_void;
|
|
|
|
pub type CGDisplayStreamRef = *mut c_void;
|
|
pub type CFDictionaryRef = *mut c_void;
|
|
pub type CFBooleanRef = *mut c_void;
|
|
pub type CFNumberRef = *mut c_void;
|
|
pub type CFStringRef = *mut c_void;
|
|
pub type CGDisplayStreamUpdateRef = *mut c_void;
|
|
pub type IOSurfaceRef = *mut c_void;
|
|
pub type DispatchQueue = *mut c_void;
|
|
pub type DispatchQueueAttr = *mut c_void;
|
|
pub type CFAllocatorRef = *mut c_void;
|
|
|
|
#[repr(C)]
|
|
pub struct CFDictionaryKeyCallBacks {
|
|
callbacks: [usize; 5],
|
|
version: i32,
|
|
}
|
|
|
|
#[repr(C)]
|
|
pub struct CFDictionaryValueCallBacks {
|
|
callbacks: [usize; 4],
|
|
version: i32,
|
|
}
|
|
|
|
macro_rules! pixel_format {
|
|
($a:expr, $b:expr, $c:expr, $d:expr) => {
|
|
($a as i32) << 24 | ($b as i32) << 16 | ($c as i32) << 8 | ($d as i32)
|
|
};
|
|
}
|
|
|
|
pub const SURFACE_LOCK_READ_ONLY: u32 = 0x0000_0001;
|
|
pub const SURFACE_LOCK_AVOID_SYNC: u32 = 0x0000_0002;
|
|
|
|
pub fn cfbool(x: bool) -> CFBooleanRef {
|
|
unsafe {
|
|
if x {
|
|
kCFBooleanTrue
|
|
} else {
|
|
kCFBooleanFalse
|
|
}
|
|
}
|
|
}
|
|
|
|
#[repr(i32)]
|
|
#[derive(PartialEq, Eq, Debug, Clone, Copy)]
|
|
pub enum CGDisplayStreamFrameStatus {
|
|
/// A new frame was generated.
|
|
FrameComplete = 0,
|
|
/// A new frame was not generated because the display did not change.
|
|
FrameIdle = 1,
|
|
/// A new frame was not generated because the display has gone blank.
|
|
FrameBlank = 2,
|
|
/// The display stream was stopped.
|
|
Stopped = 3,
|
|
#[doc(hidden)]
|
|
__Nonexhaustive,
|
|
}
|
|
|
|
#[repr(i32)]
|
|
#[derive(PartialEq, Eq, Debug, Clone, Copy)]
|
|
pub enum CFNumberType {
|
|
/* Fixed-width types */
|
|
SInt8 = 1,
|
|
SInt16 = 2,
|
|
SInt32 = 3,
|
|
SInt64 = 4,
|
|
Float32 = 5,
|
|
Float64 = 6,
|
|
/* 64-bit IEEE 754 */
|
|
/* Basic C types */
|
|
Char = 7,
|
|
Short = 8,
|
|
Int = 9,
|
|
Long = 10,
|
|
LongLong = 11,
|
|
Float = 12,
|
|
Double = 13,
|
|
/* Other */
|
|
CFIndex = 14,
|
|
NSInteger = 15,
|
|
CGFloat = 16,
|
|
}
|
|
|
|
#[repr(i32)]
|
|
#[derive(PartialEq, Eq, Debug, Clone, Copy)]
|
|
#[must_use]
|
|
pub enum CGError {
|
|
Success = 0,
|
|
Failure = 1000,
|
|
IllegalArgument = 1001,
|
|
InvalidConnection = 1002,
|
|
InvalidContext = 1003,
|
|
CannotComplete = 1004,
|
|
NotImplemented = 1006,
|
|
RangeCheck = 1007,
|
|
TypeCheck = 1008,
|
|
InvalidOperation = 1010,
|
|
NoneAvailable = 1011,
|
|
#[doc(hidden)]
|
|
__Nonexhaustive,
|
|
}
|
|
|
|
#[repr(i32)]
|
|
#[derive(PartialEq, Eq, Debug, Clone, Copy)]
|
|
pub enum PixelFormat {
|
|
/// Packed Little Endian ARGB8888
|
|
Argb8888 = pixel_format!('B', 'G', 'R', 'A'),
|
|
/// Packed Little Endian ARGB2101010
|
|
Argb2101010 = pixel_format!('l', '1', '0', 'r'),
|
|
/// 2-plane "video" range YCbCr 4:2:0
|
|
YCbCr420Video = pixel_format!('4', '2', '0', 'v'),
|
|
/// 2-plane "full" range YCbCr 4:2:0
|
|
YCbCr420Full = pixel_format!('4', '2', '0', 'f'),
|
|
#[doc(hidden)]
|
|
__Nonexhaustive,
|
|
}
|
|
|
|
pub type CGDisplayStreamFrameAvailableHandler = *const c_void;
|
|
|
|
pub type FrameAvailableHandler = RcBlock<
|
|
(
|
|
CGDisplayStreamFrameStatus, // status
|
|
u64, // displayTime
|
|
IOSurfaceRef, // frameSurface
|
|
CGDisplayStreamUpdateRef, // updateRef
|
|
),
|
|
(),
|
|
>;
|
|
|
|
#[cfg(target_pointer_width = "64")]
|
|
pub type CGFloat = f64;
|
|
#[cfg(not(target_pointer_width = "64"))]
|
|
pub type CGFloat = f32;
|
|
#[repr(C)]
|
|
pub struct CGPoint {
|
|
pub x: CGFloat,
|
|
pub y: CGFloat,
|
|
}
|
|
#[repr(C)]
|
|
pub struct CGSize {
|
|
pub width: CGFloat,
|
|
pub height: CGFloat,
|
|
}
|
|
#[repr(C)]
|
|
pub struct CGRect {
|
|
pub origin: CGPoint,
|
|
pub size: CGSize,
|
|
}
|
|
|
|
#[link(name = "System", kind = "dylib")]
|
|
#[link(name = "CoreGraphics", kind = "framework")]
|
|
#[link(name = "CoreFoundation", kind = "framework")]
|
|
#[link(name = "IOSurface", kind = "framework")]
|
|
extern "C" {
|
|
// CoreGraphics
|
|
|
|
pub static kCGDisplayStreamShowCursor: CFStringRef;
|
|
pub static kCGDisplayStreamPreserveAspectRatio: CFStringRef;
|
|
pub static kCGDisplayStreamMinimumFrameTime: CFStringRef;
|
|
pub static kCGDisplayStreamQueueDepth: CFStringRef;
|
|
|
|
pub fn CGDisplayStreamCreateWithDispatchQueue(
|
|
display: u32,
|
|
output_width: usize,
|
|
output_height: usize,
|
|
pixel_format: PixelFormat,
|
|
properties: CFDictionaryRef,
|
|
queue: DispatchQueue,
|
|
handler: CGDisplayStreamFrameAvailableHandler,
|
|
) -> CGDisplayStreamRef;
|
|
|
|
pub fn CGDisplayStreamStart(displayStream: CGDisplayStreamRef) -> CGError;
|
|
|
|
pub fn CGDisplayStreamStop(displayStream: CGDisplayStreamRef) -> CGError;
|
|
|
|
pub fn CGMainDisplayID() -> u32;
|
|
pub fn CGDisplayPixelsWide(display: u32) -> usize;
|
|
pub fn CGDisplayPixelsHigh(display: u32) -> usize;
|
|
|
|
pub fn CGGetOnlineDisplayList(
|
|
max_displays: u32,
|
|
online_displays: *mut u32,
|
|
display_count: *mut u32,
|
|
) -> CGError;
|
|
|
|
pub fn CGDisplayIsBuiltin(display: u32) -> i32;
|
|
pub fn CGDisplayIsMain(display: u32) -> i32;
|
|
pub fn CGDisplayIsActive(display: u32) -> i32;
|
|
pub fn CGDisplayIsOnline(display: u32) -> i32;
|
|
|
|
pub fn CGDisplayBounds(display: u32) -> CGRect;
|
|
|
|
// IOSurface
|
|
|
|
pub fn IOSurfaceGetAllocSize(buffer: IOSurfaceRef) -> usize;
|
|
pub fn IOSurfaceGetBaseAddress(buffer: IOSurfaceRef) -> *mut c_void;
|
|
pub fn IOSurfaceIncrementUseCount(buffer: IOSurfaceRef);
|
|
pub fn IOSurfaceDecrementUseCount(buffer: IOSurfaceRef);
|
|
pub fn IOSurfaceLock(buffer: IOSurfaceRef, options: u32, seed: *mut u32) -> i32;
|
|
pub fn IOSurfaceUnlock(buffer: IOSurfaceRef, options: u32, seed: *mut u32) -> i32;
|
|
pub fn IOSurfaceGetBaseAddressOfPlane(buffer: IOSurfaceRef, index: usize) -> *mut c_void;
|
|
pub fn IOSurfaceGetBytesPerRowOfPlane(buffer: IOSurfaceRef, index: usize) -> usize;
|
|
|
|
// Dispatch
|
|
|
|
pub fn dispatch_queue_create(label: *const i8, attr: DispatchQueueAttr) -> DispatchQueue;
|
|
|
|
pub fn dispatch_release(object: DispatchQueue);
|
|
|
|
// Core Foundation
|
|
|
|
pub static kCFTypeDictionaryKeyCallBacks: CFDictionaryKeyCallBacks;
|
|
pub static kCFTypeDictionaryValueCallBacks: CFDictionaryValueCallBacks;
|
|
|
|
// EVEN THE BOOLEANS ARE REFERENCES.
|
|
pub static kCFBooleanTrue: CFBooleanRef;
|
|
pub static kCFBooleanFalse: CFBooleanRef;
|
|
|
|
pub fn CFNumberCreate(
|
|
allocator: CFAllocatorRef,
|
|
theType: CFNumberType,
|
|
valuePtr: *const c_void,
|
|
) -> CFNumberRef;
|
|
|
|
pub fn CFDictionaryCreate(
|
|
allocator: CFAllocatorRef,
|
|
keys: *const *mut c_void,
|
|
values: *const *mut c_void,
|
|
numValues: i64,
|
|
keyCallBacks: *const CFDictionaryKeyCallBacks,
|
|
valueCallBacks: *const CFDictionaryValueCallBacks,
|
|
) -> CFDictionaryRef;
|
|
|
|
pub fn CFRetain(cf: *const c_void);
|
|
pub fn CFRelease(cf: *const c_void);
|
|
}
|