// setColorTemp changes the Xrandr colors to reflect the specified color temperature. func setColorTemp(gammar, gammag, gammab float64) { dpy := C.XOpenDisplay(nil) screenCount := C.screenCount(dpy) for screen := C.int(0); screen < screenCount; screen++ { root := C.RootWindowMacro(dpy, screen) res := C.XRRGetScreenResourcesCurrent(dpy, root) for c := C.int(0); c < res.ncrtc; c++ { crtcxid := C.crtcxid(res.crtcs, c) size := C.XRRGetCrtcGammaSize(dpy, crtcxid) crtc_gamma := C.XRRAllocGamma(size) for i := C.int(0); i < size; i++ { g := 65535.0 * float64(i) / float64(size) C.ushortSet(C.ushortCast(unsafe.Pointer(crtc_gamma.red)), i, C.double(g*gammar)) C.ushortSet(C.ushortCast(unsafe.Pointer(crtc_gamma.green)), i, C.double(g*gammag)) C.ushortSet(C.ushortCast(unsafe.Pointer(crtc_gamma.blue)), i, C.double(g*gammab)) } C.XRRSetCrtcGamma(dpy, crtcxid, crtc_gamma) C.XFree(unsafe.Pointer(crtc_gamma)) } C.XFree(unsafe.Pointer(res)) } C.XCloseDisplay(dpy) }
// SetColorTemp changes the Xrandr colors to reflect the specified color temperature. func SetColorTemp(temp int) { dpy := C.XOpenDisplay(nil) screenCount := C.screenCount(dpy) for screen := C.int(0); screen < screenCount; screen++ { root := C.RootWindowMacro(dpy, screen) res := C.XRRGetScreenResourcesCurrent(dpy, root) if temp < 1000 || temp > 10000 { temp = 6500 } temp -= 1000 ratio := float64((temp-1000)%500) / 500.0 point := whitepoints[temp/500] gammar := point.r*(1-ratio) + point.r*ratio gammag := point.g*(1-ratio) + point.g*ratio gammab := point.b*(1-ratio) + point.b*ratio for c := C.int(0); c < res.ncrtc; c++ { crtcxid := C.crtcxid(res.crtcs, c) size := C.XRRGetCrtcGammaSize(dpy, crtcxid) crtc_gamma := C.XRRAllocGamma(size) for i := C.int(0); i < size; i++ { g := 65535.0 * float64(i) / float64(size) C.ushortSet(crtc_gamma.red, i, C.ushort(g*gammar)) C.ushortSet(crtc_gamma.green, i, C.ushort(g*gammag)) C.ushortSet(crtc_gamma.blue, i, C.ushort(g*gammab)) } C.XRRSetCrtcGamma(dpy, crtcxid, crtc_gamma) C.XFree(unsafe.Pointer(crtc_gamma)) } } }