1pub mod mccs;
2
3use std::io::{Error, ErrorKind};
4
5#[cfg(feature = "node-bindings")]
6mod neon_bindings;
7
8#[cfg(feature = "node-bindings")]
9use neon_bindings::{display_get_brightness, display_set_brightness, displays_info};
10#[cfg(feature = "node-bindings")]
11use neon::prelude::*;
12
13use ddc::{Ddc, DdcHost, FeatureCode, VcpValue};
14use ddc_hi::Backend;
15pub use ddc_hi::Display;
16
17pub fn get_displays(needs_caps: bool) -> Result<Vec<Display>, Error> {
18 let mut displays = Display::enumerate().into_iter().map(|mut display|
19 if needs_caps && display.info.backend == Backend::WinApi {
20 display.update_capabilities()
21 .map(|_| display)
22 .map_err(|err| Error::new(ErrorKind::TimedOut, err.to_string()))
23 } else {
24 Ok(display)
25 }
26 );
27 if displays.find(|display| if let &Ok(ref display) = display {
28 (&display.info).backend == Backend::Nvapi
29 } else {
30 false
31 }).is_some() {
32 let displays = displays.filter(|display|
33 if let &Ok(ref display) = display {
34 (&display.info).backend != Backend::WinApi
35 } else {
36 true
37 }
38 );
39 displays.collect()
40 } else {
41 displays.collect()
42 }
43}
44
45pub fn get_display(needs_caps: bool, id: usize) -> Result<Display, Error> {
46 get_displays(needs_caps)?
47 .into_iter()
48 .nth(id)
49 .ok_or(Error::new(ErrorKind::Unsupported,
50 format!("There is no display with id: {}", id)))
51}
52
53pub fn get_brightness(id: usize) -> Result<VcpValue, Error> {
54 let mut display = get_display(true, id)?;
55 let result = display.info.mccs_database
56 .get(mccs::ImageAdjustment::Luminance as FeatureCode)
57 .map(|feature| display.handle.get_vcp_feature(feature.code)
58 .map_err(|error| Error::new(ErrorKind::TimedOut, error.to_string())))
59 .or(Some(Err(Error::new(ErrorKind::Unsupported,
60 "This display doesn't support brightness operations")))).unwrap();
61 display.handle.sleep();
62 result
63}
64
65pub fn set_brightness(id: usize, value: u16) -> Result<(), Error> {
66 let mut display = get_display(true, id)?;
67 let result = display.info.mccs_database
68 .get(mccs::ImageAdjustment::Luminance as FeatureCode)
69 .map(|feature| display.handle.set_vcp_feature(feature.code, value)
70 .map_err(|error| Error::new(ErrorKind::TimedOut, error.to_string())))
71 .or(Some(Err(Error::new(ErrorKind::Unsupported,
72 "This display doesn't support brightness operations")))).unwrap();
73 display.handle.sleep();
74 result
75}
76
77#[cfg(feature = "node-bindings")]
78#[neon::main]
79fn main(mut cx: ModuleContext) -> NeonResult<()> {
80 cx.export_function("displays_info", displays_info)?;
81 cx.export_function("display_get_brightness", display_get_brightness)?;
82 cx.export_function("display_set_brightness", display_set_brightness)?;
83 Ok(())
84}