diff options
Diffstat (limited to 'src/safe_x11/event.rs')
-rw-r--r-- | src/safe_x11/event.rs | 33 |
1 files changed, 33 insertions, 0 deletions
diff --git a/src/safe_x11/event.rs b/src/safe_x11/event.rs new file mode 100644 index 0000000..2519bad --- /dev/null +++ b/src/safe_x11/event.rs @@ -0,0 +1,33 @@ +use x11::xlib::{ + XConnectionNumber, + Display, + XEvent, +}; + +use std::mem::uninitialized; + +use libc::c_int; + +#[link(name = "safex11")] +extern { + /// Get an XEvent if there're one on the queue or wait a little before continue. + fn select_next_event(display: *mut Display, x11_fd: c_int, ev: *mut XEvent) -> c_int; +} + +/// Get the file descriptor for the XServer +pub fn x11_fd(display: *mut Display) -> c_int { + unsafe { XConnectionNumber(display) } +} + +/// Get the next event from the xserver. This call will not block forever +/// (like XNextEvent), instead it will wait for a certain time (1 second +/// for now, but it can change) so we're not blocking the socket interface +/// on the main thread. +pub fn next_xevent(display: *mut Display, fd: c_int) -> XEvent { + unsafe { + let mut last_event: XEvent = uninitialized(); + let retval = select_next_event(display, fd, &mut last_event) as i32; + last_event + } +} + |