diff options
author | Emilio Cobos Álvarez <ecoal95@gmail.com> | 2015-12-14 23:05:07 +0100 |
---|---|---|
committer | Emilio Cobos Álvarez <ecoal95@gmail.com> | 2015-12-15 13:56:35 +0100 |
commit | a69ded9c8a77e8177e1bb972043cdd05371c564d (patch) | |
tree | 074dc496142c4364522bdef09aea0f38eb00a4bf /src | |
parent | 4f0aeafbed98e62515f5d10108f377a9b188cb4c (diff) | |
download | glutin-a69ded9c8a77e8177e1bb972043cdd05371c564d.tar.gz glutin-a69ded9c8a77e8177e1bb972043cdd05371c564d.zip |
x11: Improve xlib error reporting
Diffstat (limited to 'src')
-rw-r--r-- | src/api/x11/xdisplay.rs | 14 | ||||
-rw-r--r-- | src/platform/linux/api_dispatch.rs | 21 |
2 files changed, 22 insertions, 13 deletions
diff --git a/src/api/x11/xdisplay.rs b/src/api/x11/xdisplay.rs index 2b77d9c..8205c66 100644 --- a/src/api/x11/xdisplay.rs +++ b/src/api/x11/xdisplay.rs @@ -23,24 +23,18 @@ pub struct XConnection { unsafe impl Send for XConnection {} unsafe impl Sync for XConnection {} +pub type XErrorHandler = Option<unsafe extern fn(*mut ffi::Display, *mut ffi::XErrorEvent) -> libc::c_int>; + impl XConnection { - pub fn new() -> Result<XConnection, XNotSupported> { + pub fn new(error_handler: XErrorHandler) -> Result<XConnection, XNotSupported> { // opening the libraries let xlib = try!(ffi::Xlib::open()); let xcursor = try!(ffi::Xcursor::open()); let xf86vmode = try!(ffi::Xf86vmode::open()); let xinput2 = try!(ffi::XInput2::open()); - unsafe extern "C" fn x_error_callback(_: *mut ffi::Display, event: *mut ffi::XErrorEvent) - -> libc::c_int - { - println!("[glutin] x error code={} major={} minor={}!", (*event).error_code, - (*event).request_code, (*event).minor_code); - 0 - } - unsafe { (xlib.XInitThreads)() }; - unsafe { (xlib.XSetErrorHandler)(Some(x_error_callback)) }; + unsafe { (xlib.XSetErrorHandler)(error_handler) }; // TODO: use something safer than raw "dlopen" let glx = { diff --git a/src/platform/linux/api_dispatch.rs b/src/platform/linux/api_dispatch.rs index a3c3bf9..f39ae43 100644 --- a/src/platform/linux/api_dispatch.rs +++ b/src/platform/linux/api_dispatch.rs @@ -33,7 +33,7 @@ lazy_static!( if false && wayland::is_available() { Backend::Wayland } else { - match XConnection::new() { + match XConnection::new(Some(x_error_callback)) { Ok(x) => Backend::X(Arc::new(x)), Err(e) => Backend::Error(e), } @@ -115,7 +115,7 @@ impl MonitorId { match self { &MonitorId::X(ref m) => m.get_native_identifier(), &MonitorId::Wayland(ref m) => m.get_native_identifier(), - &MonitorId::None => unimplemented!() // FIXME: + &MonitorId::None => unimplemented!() // FIXME: } } @@ -124,7 +124,7 @@ impl MonitorId { match self { &MonitorId::X(ref m) => m.get_dimensions(), &MonitorId::Wayland(ref m) => m.get_dimensions(), - &MonitorId::None => (800, 600), // FIXME: + &MonitorId::None => (800, 600), // FIXME: } } } @@ -390,3 +390,18 @@ impl GlContext for Window { } } } + +unsafe extern "C" fn x_error_callback(dpy: *mut x11::ffi::Display, event: *mut x11::ffi::XErrorEvent) + -> libc::c_int +{ + use std::ffi::CStr; + + if let Backend::X(ref x) = *BACKEND { + let mut buff: Vec<u8> = Vec::with_capacity(1024); + (x.xlib.XGetErrorText)(dpy, (*event).error_code as i32, buff.as_mut_ptr() as *mut i8, buff.capacity() as i32); + let error = CStr::from_ptr(buff.as_mut_ptr() as *const i8).to_string_lossy(); + println!("[glutin] x error code={} major={} minor={}: {}!", (*event).error_code, (*event).request_code, (*event).minor_code, error); + } + + 0 +} |