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 = get_display_settings();
145 let setting = settings[0].clone();
146 let result = set_display_settings(setting);
147
148 assert_eq!(result, 0);
149 }
150}