use x11rb::connection::Connection; use x11rb::protocol::{xproto::*, Event}; use xim::{x11rb::X11rbClient, Client}; use xim_parser::ForwardEventFlag; use self::handler::ExampleHandler; #[path = "util/handler.rs"] mod handler; fn main() -> Result<(), Box> { pretty_env_logger::init_custom_env("XIM_RS_LOG"); let (conn, screen_num) = x11rb::rust_connection::RustConnection::connect(None).expect("Connect X"); let screen = &conn.setup().roots[screen_num]; let window = conn.generate_id()?; conn.create_window( screen.root_depth, window, screen.root, 0, 0, 800, 600, 0, WindowClass::INPUT_OUTPUT, screen.root_visual, &CreateWindowAux::default() .background_pixel(screen.black_pixel) .event_mask(EventMask::KEY_PRESS | EventMask::KEY_RELEASE), )?; conn.map_window(window)?; conn.flush()?; let mut client = X11rbClient::init(&conn, screen_num, None)?; log::info!("Start event loop"); let mut handler = ExampleHandler { window, ..ExampleHandler::default() }; loop { let e = conn.wait_for_event()?; if client.filter_event(&e, &mut handler)? { continue; } else if let Event::Error(err) = e { log::error!("X11Error: {:?}", err); continue; } else { match e { Event::KeyPress(e) | Event::KeyRelease(e) => { if handler.connected { log::trace!("Send: {:?}", e); client.forward_event( handler.im_id, handler.ic_id, ForwardEventFlag::empty(), &e, )?; } } _ => {} } } } }