use euclid::default::{Point2D, Size2D};
use flutterbug::{
prelude::*, x11::keysym, Atom, Color, Display, Event, EventMask, EventType, ExposeEvent,
FlutterbugError,
};
fn main() -> Result<(), FlutterbugError> {
let display = Display::new()?;
let mut window = display.create_simple_window(
None,
Point2D::new(0, 0),
Size2D::new(200, 200),
1,
display.default_black_pixel()?,
display.default_white_pixel()?,
)?;
window.select_input(EventMask::EXPOSURE_MASK | EventMask::KEY_PRESS_MASK)?;
window.map(true)?;
window.set_standard_properties(
Some("Test | Draw"),
Some("Draw Test"),
None,
false,
)?;
let wdw = display.internal_atom("WM_DELETE_WINDOW", false)?;
window.set_protocols(&mut [wdw])?;
let colormap = display.default_colormap()?;
let colors = [
colormap.color(Color::from_rgb(255, 0, 0))?,
colormap.color(Color::from_rgb(0, 255, 0))?,
colormap.color(Color::from_rgb(0, 0, 255))?,
];
let mut curr_index = 0;
window.set_line_width(6)?;
'el: loop {
let ev = Event::next(&display)?;
let ty = ev.kind();
match ev {
Event::Expose(_e) => {
window.clear_area(Point2D::new(0, 0), Size2D::new(200, 200), false)?;
const DIAMETER: i32 = 150;
const CENTER_X: i32 = 100;
const CENTER_Y: i32 = 100;
let origin = Point2D::new(CENTER_X - (DIAMETER / 2), CENTER_Y - (DIAMETER / 2));
let size = Size2D::new(DIAMETER as u32, DIAMETER as u32);
let angles = (0, 360 * 64);
window.set_foreground(display.default_black_pixel()?)?;
window.draw_arc(origin, size, angles)?;
window.set_foreground(colors[curr_index])?;
window.fill_arc(origin, size, angles)?;
}
Event::Key(ke) => {
if ty != EventType::KeyPress {
continue 'el;
}
let (ks, _) = ke.lookup()?;
if ks == keysym::XK_R.into() || ks == keysym::XK_r.into() {
curr_index = 0;
} else if ks == keysym::XK_G.into() || ks == keysym::XK_g.into() {
curr_index = 1;
} else if ks == keysym::XK_B.into() || ks == keysym::XK_b.into() {
curr_index = 2;
} else {
continue 'el;
}
let ev = ExposeEvent::new(
EventType::Expose,
0,
&display,
&window,
true,
0,
0,
200,
200,
1,
)?;
let ev = Event::Expose(ev);
ev.send(&display, &window, true, EventMask::EXPOSURE_MASK)?;
}
Event::ClientMessage(cm) => {
if AsRef::<[Atom]>::as_ref(&cm.data())[0] == wdw {
break 'el;
}
}
_ => { }
}
}
Ok(())
}