use xcb::{randr, x};
fn mode_refresh(mode_info: &randr::ModeInfo) -> f64 {
let vtotal = {
let mut val = mode_info.vtotal;
if mode_info.mode_flags.contains(randr::ModeFlag::DOUBLE_SCAN) {
val *= 2;
}
if mode_info.mode_flags.contains(randr::ModeFlag::INTERLACE) {
val /= 2;
}
val
};
if vtotal != 0 && mode_info.htotal != 0 {
(mode_info.dot_clock as f64) / (vtotal as f64 * mode_info.htotal as f64)
} else {
0.0
}
}
fn main() -> xcb::Result<()> {
let (conn, screen_num) = xcb::Connection::connect(None)?;
let setup = conn.get_setup();
let screen = setup.roots().nth(screen_num as usize).unwrap();
let window_dummy: x::Window = conn.generate_id();
conn.send_request(&x::CreateWindow {
depth: 0,
wid: window_dummy,
parent: screen.root(),
x: 0,
y: 0,
width: 1,
height: 1,
border_width: 0,
class: x::WindowClass::InputOutput,
visual: screen.root_visual(),
value_list: &[],
});
conn.flush()?;
let reply = conn.wait_for_reply(conn.send_request(&randr::GetScreenResources {
window: window_dummy,
}))?;
for (i, mode) in reply.modes().iter().enumerate() {
println!("mode {}", i + 1);
println!("\tresolution = {}x{}", mode.width, mode.height);
println!("\trefresh rate = {:.1}Hz", mode_refresh(mode));
}
Ok(())
}