diff options
Diffstat (limited to 'src/platform')
| -rw-r--r-- | src/platform/linux.rs | 34 | ||||
| -rw-r--r-- | src/platform/macos.rs | 44 |
2 files changed, 78 insertions, 0 deletions
diff --git a/src/platform/linux.rs b/src/platform/linux.rs new file mode 100644 index 0000000..ec0fc6a --- /dev/null +++ b/src/platform/linux.rs @@ -0,0 +1,34 @@ +use std::os::raw::{c_ushort, c_void}; +use std::ptr; +use x11::xlib::{XCloseDisplay, XDefaultScreen, XFree, XOpenDisplay, XRootWindow}; +use x11::xrandr::{ + XRRAllocGamma, XRRCrtcGamma, XRRGetCrtcGammaSize, XRRGetScreenResourcesCurrent, XRRSetCrtcGamma, +}; + +pub fn set_temp(temp: u32) { + let ratio: f64 = (temp % 500) as f64 / 500f64; + unsafe { + let display = XOpenDisplay(ptr::null_mut()); + let screen = XDefaultScreen(display); + let root = XRootWindow(display, screen); + let resource = XRRGetScreenResourcesCurrent(display, root); + + for x in 0..(*resource).ncrtc { + let crtcxid = (*resource).crtcs.offset(x as isize); + let size = XRRGetCrtcGammaSize(display, *crtcxid); + let crtc_gamma: *mut XRRCrtcGamma = XRRAllocGamma(size); + let gamma = crate::avg(temp, ratio); + + for i in 0..size { + let g = (65535f64 * i as f64) / size as f64; + *((*crtc_gamma).red as *mut c_ushort).offset(i as isize) = (g * gamma.red) as u16; + *((*crtc_gamma).green as *mut c_ushort).offset(i as isize) = + (g * gamma.green) as u16; + *((*crtc_gamma).blue as *mut c_ushort).offset(i as isize) = (g * gamma.blue) as u16; + } + XRRSetCrtcGamma(display, *crtcxid, crtc_gamma); + XFree(crtc_gamma as *mut c_void); + } + XCloseDisplay(display); + } +} diff --git a/src/platform/macos.rs b/src/platform/macos.rs new file mode 100644 index 0000000..0292250 --- /dev/null +++ b/src/platform/macos.rs @@ -0,0 +1,44 @@ +use core_graphics::display::CGDisplay; + +pub fn set_temp(temp: u32) { + use std::os::raw::c_int; + + let ratio: f64 = (temp % 500) as f64 / 500f64; + let gamma = crate::avg(temp, ratio); + + let main_display = CGDisplay::main(); + + extern "C" { + fn CGSetDisplayTransferByTable( + display: u32, + table_size: u32, + red_table: *const f32, + green_table: *const f32, + blue_table: *const f32, + ) -> c_int; + fn CGDisplayGammaTableCapacity(display: u32) -> u32; + } + + let table_size = unsafe { CGDisplayGammaTableCapacity(main_display.id) } as usize; + + let mut red_table = vec![0.0; table_size]; + let mut green_table = vec![0.0; table_size]; + let mut blue_table = vec![0.0; table_size]; + + for i in 0..table_size { + let value = (i as f32) / (table_size as f32 - 1.0); + red_table[i] = (value * gamma.red as f32).min(1.0); + green_table[i] = (value * gamma.green as f32).min(1.0); + blue_table[i] = (value * gamma.blue as f32).min(1.0); + } + + unsafe { + CGSetDisplayTransferByTable( + main_display.id, + table_size as u32, + red_table.as_ptr(), + green_table.as_ptr(), + blue_table.as_ptr(), + ); + } +} |
