| 120 | } |
| 121 | |
| 122 | pub fn all() -> io::Result<Vec<Display>> { |
| 123 | let displays_gdi = dxgi::Displays::get_from_gdi() |
| 124 | .drain(..) |
| 125 | .map(Display) |
| 126 | .collect::<Vec<_>>(); |
| 127 | |
| 128 | let displays_dxgi = Self::all_().unwrap_or(Default::default()); |
| 129 | |
| 130 | // Return gdi displays if dxgi is not supported |
| 131 | if displays_dxgi.is_empty() { |
| 132 | println!("Display got from gdi"); |
| 133 | return Ok(displays_gdi); |
| 134 | } |
| 135 | |
| 136 | // Return dxgi displays if length is not equal |
| 137 | if displays_dxgi.len() != displays_gdi.len() { |
| 138 | return Ok(displays_dxgi); |
| 139 | } |
| 140 | |
| 141 | // Check if names are equal |
| 142 | let names_gdi = displays_gdi.iter().map(|d| d.name()).collect::<Vec<_>>(); |
| 143 | let names_dxgi = displays_dxgi.iter().map(|d| d.name()).collect::<Vec<_>>(); |
| 144 | for name in names_gdi.iter() { |
| 145 | if !names_dxgi.contains(name) { |
| 146 | return Ok(displays_dxgi); |
| 147 | } |
| 148 | } |
| 149 | |
| 150 | // Reorder displays from dxgi |
| 151 | let mut displays_dxgi = displays_dxgi; |
| 152 | let mut displays_dxgi_ordered = Vec::new(); |
| 153 | for name in names_gdi.iter() { |
| 154 | let pos = match displays_dxgi.iter().position(|d| d.name() == *name) { |
| 155 | Some(pos) => pos, |
| 156 | None => { |
| 157 | // unreachable! |
| 158 | 0 |
| 159 | } |
| 160 | }; |
| 161 | displays_dxgi_ordered.push(displays_dxgi.remove(pos)); |
| 162 | } |
| 163 | |
| 164 | Ok(displays_dxgi_ordered) |
| 165 | } |
| 166 | |
| 167 | fn all_() -> io::Result<Vec<Display>> { |
| 168 | Ok(dxgi::Displays::new()?.map(Display).collect::<Vec<_>>()) |