use easydrm::{EasyDRM, MonitorContextCreationRequest, gl};
use rand::Rng;
struct MonitorContext {
frame_count: u32,
color_offset: f32,
monitor_name: String,
}
impl MonitorContext {
fn new(req: &MonitorContextCreationRequest<'_>) -> Self {
let gl = req.gl;
unsafe {
let version = std::ffi::CStr::from_ptr(gl.GetString(gl::VERSION) as *const i8);
println!("Monitor initialized with OpenGL version: {:?}", version);
}
let mut rng = rand::rng();
MonitorContext {
frame_count: 0,
color_offset: rng.random_range(0.0..1.0), monitor_name: format!("Monitor-{}", rng.random_range(0..10000)),
}
}
fn update(&mut self) -> (f32, f32, f32) {
self.frame_count += 1;
let hue = ((self.frame_count as f32 * 0.01 + self.color_offset) % 1.0).abs();
hsv_to_rgb(hue, 0.8, 1.0)
}
fn status(&self) -> String {
format!("{}: {} frames", self.monitor_name, self.frame_count)
}
}
fn main() -> Result<(), Box<dyn std::error::Error>> {
println!("Initializing EasyDRM with custom monitor context...");
let mut easydrm = EasyDRM::init(MonitorContext::new)?;
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();
let ctx = monitor.context();
println!(
"Monitor {}: {}x{} @ {}Hz - {}",
i,
mode.size().0,
mode.size().1,
mode.vrefresh(),
ctx.monitor_name
);
}
println!("\nStarting render loop. Press Ctrl+C to exit.");
println!("Each monitor will show a different animated color.\n");
let mut global_frame_count = 0u64;
loop {
for monitor in easydrm.monitors_mut() {
if monitor.can_render() {
if let Ok(_) = monitor.make_current() {
let (r, g, b) = monitor.context_mut().update();
let gl = monitor.gl();
unsafe {
gl.ClearColor(r, g, b, 1.0);
gl.Clear(gl::COLOR_BUFFER_BIT);
}
}
}
}
easydrm.swap_buffers()?;
easydrm.poll_events()?;
global_frame_count += 1;
if global_frame_count % 60 == 0 {
println!("=== Frame {} ===", global_frame_count);
for (i, monitor) in easydrm.monitors().enumerate() {
let ctx = monitor.context();
println!(" Monitor {}: {}", i, ctx.status());
}
println!();
}
}
}
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)
}