use euclid::default::{Point2D, Size2D};
use flutterbug::{
prelude::*, Atom, Display, Event, EventMask, EventType, ExposeEvent, FlutterbugError,
FunctionKeys, KeySym,
};
fn main() -> Result<(), FlutterbugError> {
let display = Display::new()?;
let window = display.create_simple_window(
None,
Point2D::new(0, 0),
Size2D::new(400, 200),
1,
display.default_black_pixel()?,
display.default_white_pixel()?,
)?;
window.select_input(EventMask::EXPOSURE_MASK | EventMask::KEY_PRESS_MASK)?;
window.map(true)?;
window.store_name("Test | Key Pressing")?;
let wdw = display.internal_atom("WM_DELETE_WINDOW", false)?;
window.set_protocols(&mut [wdw])?;
let im = display.input_method()?;
let ic = window.input_context(&im)?;
let mut keycode = 0;
let mut state = 0;
let mut key = String::new();
let mut ks: Option<KeySym> = None;
'el: loop {
let ev = Event::next(&display)?;
match ev.kind() {
EventType::Expose => {
window.clear_area(Point2D::new(0, 0), Size2D::new(400, 200), false)?;
let xattrs = window.window_attributes()?;
window.draw_string(
Point2D::new(10, 20),
&format!("Window size is {}x{}", xattrs.width, xattrs.height),
)?;
window.draw_string(Point2D::new(10, 40), &format!("Key Code is {}", keycode))?;
window.draw_string(Point2D::new(10, 60), &format!("Key State is {}", state))?;
window.draw_string(Point2D::new(10, 80), &format!("Key is {}", key))?;
match ks {
Some(ks) => {
window.draw_string(
Point2D::new(10, 100),
&format!("Key symbol is {:X}", ks),
)?;
window.draw_string(
Point2D::new(10, 120),
&format!(
"Escape? {:?}",
ks as u32 == flutterbug::x11::keysym::XK_Escape
),
)?;
}
None => {
window.draw_string(Point2D::new(10, 100), "No key symbol")?
}
}
}
EventType::KeyPress => {
if let Event::Key(mut k) = ev {
keycode = k.keycode();
state = k.state();
k.set_function(FunctionKeys::CONTROL, false);
let (ks1, key1) = k.lookup_utf8(&ic)?;
key = key1.unwrap_or_else(|| String::new());
ks = ks1;
let ev = ExposeEvent::new(
EventType::Expose,
0,
&display,
&window,
true,
0,
0,
400,
200,
1,
)?;
let ev = Event::Expose(ev);
ev.send(&display, &window, true, EventMask::EXPOSURE_MASK)?;
}
}
EventType::ClientMessage => {
if let Event::ClientMessage(c) = ev {
if AsRef::<[Atom]>::as_ref(&c.data())[0] == wdw {
break 'el;
}
}
}
_ => { }
}
}
Ok(())
}