67 lines
1.9 KiB
Rust
67 lines
1.9 KiB
Rust
|
extern crate xcb;
|
||
|
|
||
|
fn main() {
|
||
|
let (conn, screen_num) = xcb::Connection::connect(None).unwrap();
|
||
|
let setup = conn.get_setup();
|
||
|
let screen = setup.roots().nth(screen_num as usize).unwrap();
|
||
|
|
||
|
let window = conn.generate_id();
|
||
|
|
||
|
let values = [
|
||
|
(xcb::CW_BACK_PIXEL, screen.white_pixel()),
|
||
|
(
|
||
|
xcb::CW_EVENT_MASK,
|
||
|
xcb::EVENT_MASK_EXPOSURE
|
||
|
| xcb::EVENT_MASK_KEY_PRESS // we'll need this later
|
||
|
| xcb::EVENT_MASK_BUTTON_PRESS
|
||
|
| xcb::EVENT_MASK_BUTTON_RELEASE,
|
||
|
),
|
||
|
];
|
||
|
|
||
|
xcb::create_window(
|
||
|
&conn,
|
||
|
xcb::COPY_FROM_PARENT as u8,
|
||
|
window,
|
||
|
screen.root(),
|
||
|
0,
|
||
|
0,
|
||
|
150,
|
||
|
150,
|
||
|
10,
|
||
|
xcb::WINDOW_CLASS_INPUT_OUTPUT as u16,
|
||
|
screen.root_visual(),
|
||
|
&values,
|
||
|
);
|
||
|
|
||
|
xcb::map_window(&conn, window);
|
||
|
|
||
|
conn.flush();
|
||
|
loop {
|
||
|
let ev = conn.wait_for_event();
|
||
|
match ev {
|
||
|
None => {
|
||
|
break;
|
||
|
}
|
||
|
Some(ev) => {
|
||
|
let r = ev.response_type();
|
||
|
if r == xcb::BUTTON_PRESS as u8 {
|
||
|
let button_press: &xcb::ButtonPressEvent = unsafe { xcb::cast_event(&ev) };
|
||
|
println!(
|
||
|
"Mouse press: x={}, y={}",
|
||
|
button_press.event_x(),
|
||
|
button_press.event_y()
|
||
|
);
|
||
|
} else if r == xcb::BUTTON_RELEASE as u8 {
|
||
|
let button_release: &xcb::ButtonReleaseEvent = unsafe { xcb::cast_event(&ev) };
|
||
|
println!(
|
||
|
"Mouse release: x={}, y={}",
|
||
|
button_release.event_x(),
|
||
|
button_release.event_y()
|
||
|
);
|
||
|
break; // Move on after mouse released
|
||
|
}
|
||
|
}
|
||
|
};
|
||
|
}
|
||
|
}
|