ddc_enhanced_rs/
lib.rs

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}