use breadx::{drawable, rgb, BreadError, DisplayConnection, Event, EventMask, Image, ImageFormat};
use image::{io::Reader, GenericImageView, ImageFormat::Jpeg};
use std::{io::Cursor, iter};
const EISENHOWER: &[u8] = include_bytes!("../images/eisenhower.jpg");
#[inline]
fn create_heap_memory(width: u32, height: u32) -> Box<[u8]> {
iter::repeat(0)
.take((width * height) as usize * 4)
.collect()
}
fn main() -> Result<(), BreadError> {
let reader = Reader::new(Cursor::new(EISENHOWER))
.with_guessed_format()
.unwrap();
let eisenhower = reader.decode().expect("Failed to decode image");
let width = eisenhower.width();
let height = eisenhower.height();
let mut conn = DisplayConnection::create(None, None)?;
let window = conn.create_simple_window(
conn.default_root(),
0,
0,
width as _,
height as _,
0,
conn.default_black_pixel(),
conn.default_white_pixel(),
)?;
window.set_title(&mut conn, "Eisenhower")?;
window.map(&mut conn)?;
let mut em: EventMask = Default::default();
em.set_exposure(true);
window.set_event_mask(&mut conn, em)?;
let gc = conn.create_gc(window, Default::default())?;
let depth = window.geometry_immediate(&mut conn)?.depth;
let vis = conn.default_visual();
let mut image = Image::new(
&conn,
Some(vis),
depth,
ImageFormat::ZPixmap,
0,
create_heap_memory(width, height),
width as _,
height as _,
32,
None,
)
.unwrap();
eisenhower.pixels().for_each(|(x, y, pixel)| {
let p = rgb((pixel.0)[0], (pixel.0)[1], (pixel.0)[2]);
image.set_pixel(x as _, y as _, p);
});
let pixmap = drawable::create_pixmap(&mut conn, window, width as _, height as _, depth)?;
drawable::put_image(
&mut conn,
window,
gc,
&image,
0,
0,
0,
0,
width as _,
height as _,
)?;
let wdw = conn.intern_atom_immediate("WM_DELETE_WINDOW".to_owned(), false)?;
window.set_wm_protocols(&mut conn, &[wdw])?;
'el: loop {
let event = conn.wait_for_event()?;
match event {
Event::ClientMessage(cme) => {
if cme.data.longs()[0] == wdw.xid {
break 'el;
}
}
Event::Expose(_) => {
drawable::put_image(
&mut conn,
window,
gc,
&image,
0,
0,
0,
0,
width as _,
height as _,
)?;
}
_ => (),
}
}
Ok(())
}