DisplaySettings/
lib.rs

1use std::ptr;
2use winapi::um::winuser::{CDS_GLOBAL, CDS_UPDATEREGISTRY, DISP_CHANGE_SUCCESSFUL, EnumDisplaySettingsW};
3use winapi::um::wingdi::{DEVMODEW};
4use winapi::um::winnt::{LONG};
5use std::mem::zeroed;
6use std::cmp::{PartialEq, Eq};
7
8mod types {
9    pub mod DisplaySettingsType;
10}
11
12pub use types::DisplaySettingsType::*;
13
14struct MyDevMode(DEVMODEW);
15impl PartialEq for MyDevMode {
16    fn eq(&self, other: &Self) -> bool {
17        self.0.dmPelsWidth == other.0.dmPelsWidth &&
18            self.0.dmPelsHeight == other.0.dmPelsHeight
19    }
20}
21impl Eq for MyDevMode {}
22
23pub fn get_display_settings() -> Vec<DisplaySettingsType>
24{
25    let mut display_settings_vec: Vec<DisplaySettingsType> = Vec::new();
26
27    get_display_settings_core().iter().for_each(|setting| {
28        display_settings_vec.push(DisplaySettingsType {
29            width: setting.dmPelsWidth,
30            height: setting.dmPelsHeight,
31            refresh_rate: setting.dmDisplayFrequency
32        });
33    });
34
35    return display_settings_vec;
36}
37
38fn get_display_settings_core() -> Vec<DEVMODEW>
39{
40    let mut display_settings_vec: Vec<DEVMODEW> = Vec::new();
41
42
43    unsafe {
44        let mut dev_mode = DEVMODEW {
45            dmSize: std::mem::size_of::<DEVMODEW>() as u16,
46            ..zeroed()
47        };
48
49        let mut index = 0;
50        let mut prev_setting: DEVMODEW = zeroed();
51
52        loop {
53            if EnumDisplaySettingsW(ptr::null(), index, &mut dev_mode) == 0 {
54                break;
55            }
56
57            if MyDevMode(prev_setting) != MyDevMode(dev_mode) {
58                prev_setting = dev_mode.clone();
59                display_settings_vec.push(dev_mode);
60            }
61
62            index += 1;
63        }
64    }
65
66    for (index, settings) in display_settings_vec.iter().enumerate() {
67        println!("Display Settings #{}", index);
68        println!("Width: {}", settings.dmPelsWidth);
69        println!("Height: {}", settings.dmPelsHeight);
70        println!("Bits Per Pixel: {}", settings.dmBitsPerPel);
71        println!("Refresh Rate: {}", settings.dmDisplayFrequency);
72        println!();
73    }
74
75    return display_settings_vec;
76}
77
78fn get_dev_mode_w() -> DEVMODEW
79{
80    unsafe{
81        let mut dev_mode = DEVMODEW {
82            dmSize: std::mem::size_of::<DEVMODEW>() as u16,
83            ..zeroed()
84        };
85
86        EnumDisplaySettingsW(ptr::null(), 0, &mut dev_mode);
87
88        return dev_mode;
89    }
90
91
92}
93
94pub fn set_display_settings(settings: DisplaySettingsType) -> LONG
95{
96    let mut dev_mode = get_dev_mode_w();
97
98    dev_mode.dmPelsWidth = settings.width;
99    dev_mode.dmPelsHeight = settings.height;
100    dev_mode.dmDisplayFrequency = settings.refresh_rate;
101
102    let result = set_display_settings_core(&dev_mode);
103
104    return result;
105}
106
107fn set_display_settings_core(settings: &DEVMODEW) -> LONG
108{
109    use winapi::um::winuser::{ChangeDisplaySettingsW};
110
111    unsafe {
112        let mut dev_mode: DEVMODEW = *settings;
113
114        let result = ChangeDisplaySettingsW(&mut dev_mode, CDS_GLOBAL | CDS_UPDATEREGISTRY);
115        if result == DISP_CHANGE_SUCCESSFUL
116        {
117            println!("Success");
118            println!("{}", result)
119        } else {
120            println!("Success");
121        }
122
123        return result;
124    }
125}
126
127#[cfg(test)]
128mod tests {
129    use super::*;
130
131    #[test]
132    fn get_display_settings_test(){
133        let settings = get_display_settings();
134        assert_ne!(settings.len(), 0);
135    }
136
137    #[test]
138    fn set_display_settings_test(){
139        // let settings = DisplaySettings {
140        //     width: 1920,
141        //     height: 1080,
142        //     refresh_rate: 60
143        // };
144        let settings = get_display_settings();
145        let setting = settings[0].clone();
146        let result = set_display_settings(setting);
147
148        assert_eq!(result, 0);
149    }
150}