use easydrm::{EasyDRM, gl};
fn main() -> Result<(), Box<dyn std::error::Error>> {
println!("Initializing EasyDRM...");
let mut easydrm = EasyDRM::init_empty()?;
println!("EasyDRM initialized successfully!");
println!("Found {} monitor(s)", easydrm.monitor_count());
if !easydrm.has_monitors() {
println!("No monitors connected. Waiting for hotplug events...");
}
for (i, monitor) in easydrm.monitors().enumerate() {
let mode = monitor.active_mode();
println!(
"Monitor {}: {}x{} @ {}Hz",
i,
mode.size().0,
mode.size().1,
mode.vrefresh()
);
}
println!("\nStarting render loop. Press Ctrl+C to exit.");
let mut frame_count = 0u64;
loop {
for monitor in easydrm.monitors_mut() {
if monitor.can_render() {
if let Ok(_) = monitor.make_current() {
let gl = monitor.gl();
let hue = (frame_count % 360) as f32 / 360.0;
let (r, g, b) = hsv_to_rgb(hue, 1.0, 1.0);
unsafe {
gl.ClearColor(r, g, b, 1.0);
gl.Clear(gl::COLOR_BUFFER_BIT);
}
}
}
}
easydrm.swap_buffers()?;
easydrm.poll_events()?;
frame_count += 1;
if frame_count % 60 == 0 {
println!(
"Frame {}: {} monitor(s) active",
frame_count,
easydrm.monitor_count()
);
}
}
}
fn hsv_to_rgb(h: f32, s: f32, v: f32) -> (f32, f32, f32) {
let c = v * s;
let h_prime = h * 6.0;
let x = c * (1.0 - ((h_prime % 2.0) - 1.0).abs());
let m = v - c;
let (r, g, b) = match h_prime as i32 {
0 => (c, x, 0.0),
1 => (x, c, 0.0),
2 => (0.0, c, x),
3 => (0.0, x, c),
4 => (x, 0.0, c),
5 => (c, 0.0, x),
_ => (c, x, 0.0),
};
(r + m, g + m, b + m)
}