summaryrefslogtreecommitdiff
path: root/src/safe_x11/mod.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/safe_x11/mod.rs')
-rw-r--r--src/safe_x11/mod.rs24
1 files changed, 23 insertions, 1 deletions
diff --git a/src/safe_x11/mod.rs b/src/safe_x11/mod.rs
index 06c7b3c..0283966 100644
--- a/src/safe_x11/mod.rs
+++ b/src/safe_x11/mod.rs
@@ -6,11 +6,15 @@
use x11::xlib;
use x11::xlib::{
Display,
+ XConnectionNumber,
Screen,
Cursor,
XDefaultRootWindow,
XQueryTree,
+ XEvent,
+ XNextEvent,
+
// Windows
Window,
};
@@ -23,9 +27,9 @@ use std::error;
use std::mem::uninitialized;
use std::slice;
use std::fmt;
+use libc::c_int;
pub mod window;
-pub mod event;
#[derive(Debug)]
pub struct XSafeError<'a> {
@@ -89,6 +93,24 @@ pub fn close_display(display: *mut Display) {
unsafe { xlib::XCloseDisplay(display); }
}
+/// 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) -> XEvent {
+ unsafe {
+ let mut last_event: XEvent = uninitialized();
+ XNextEvent(display, &mut last_event);
+ last_event
+ }
+}
+
+
/// Grab pointer buttons.
///
/// # Example