aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authortomaka <pierre.krieger1708@gmail.com>2015-01-22 21:37:07 +0100
committertomaka <pierre.krieger1708@gmail.com>2015-01-22 21:37:07 +0100
commit1d6b863cd454839b8e3cf1e296cbf8f31fb70029 (patch)
tree3f4523dd782cb5d4ee554cc38ee9b7fff68705ee /src
parent13be9b2598c1fdce7af61ab05933ba687c95e64c (diff)
parentde3f354566981c8d03a4283a621ac08ae74fc90f (diff)
downloadglutin-1d6b863cd454839b8e3cf1e296cbf8f31fb70029.tar.gz
glutin-1d6b863cd454839b8e3cf1e296cbf8f31fb70029.zip
Merge pull request #217 from glennw/context-fallback
Some GPU/driver combinations have glxCreateContextAttribsARB present, bu...
Diffstat (limited to 'src')
-rw-r--r--src/x11/ffi.rs12
-rw-r--r--src/x11/window/mod.rs16
2 files changed, 26 insertions, 2 deletions
diff --git a/src/x11/ffi.rs b/src/x11/ffi.rs
index 5e7b5a1..1d9e7de 100644
--- a/src/x11/ffi.rs
+++ b/src/x11/ffi.rs
@@ -1358,6 +1358,17 @@ pub struct XF86VidModeModeInfo {
private: libc::c_long,
}
+#[repr(C)]
+pub struct XErrorEvent {
+ pub type_: libc::c_int,
+ pub display: *mut Display,
+ pub serial: libc::c_ulong,
+ pub error_code: libc::c_char,
+ pub request_code: libc::c_char,
+ pub minor_code: libc::c_char,
+ pub resourceid: XID,
+}
+
#[cfg(feature = "headless")]
#[link(name = "OSMesa")]
extern "C" {
@@ -1430,6 +1441,7 @@ extern "C" {
pub fn XScreenOfDisplay(display: *mut Display, screen_number: libc::c_int) -> *const Screen;
pub fn XWidthOfScreen(screen: *const Screen) -> libc::c_int;
pub fn XHeightOfScreen(screen: *const Screen) -> libc::c_int;
+ pub fn XSetErrorHandler(callback: fn(display: *mut Display, event: *mut XErrorEvent) -> libc::c_int) -> libc::c_int;
pub fn XCloseIM(im: XIM) -> Status;
pub fn XOpenIM(display: *mut Display, db: XrmDatabase, res_name: *mut libc::c_char,
diff --git a/src/x11/window/mod.rs b/src/x11/window/mod.rs
index 91d7e07..f4c296a 100644
--- a/src/x11/window/mod.rs
+++ b/src/x11/window/mod.rs
@@ -16,10 +16,18 @@ mod monitor;
static THREAD_INIT: Once = ONCE_INIT;
+fn x_error_callback(_: *mut ffi::Display, event: *mut ffi::XErrorEvent) -> libc::c_int {
+ unsafe {
+ println!("[glutin] x error code={} major={} minor={}!", (*event).error_code, (*event).request_code, (*event).minor_code);
+ }
+ 0
+}
+
fn ensure_thread_init() {
THREAD_INIT.call_once(|| {
unsafe {
ffi::XInitThreads();
+ ffi::XSetErrorHandler(x_error_callback);
}
});
}
@@ -322,14 +330,18 @@ impl Window {
ptr::null()
};
- let context = if extra_functions.CreateContextAttribsARB.is_loaded() {
+ let mut context = if extra_functions.CreateContextAttribsARB.is_loaded() {
extra_functions.CreateContextAttribsARB(display as *mut ffi::glx_extra::types::Display,
fb_config, share, 1, attributes.as_ptr())
} else {
- ffi::glx::CreateContext(display, &mut visual_infos, share, 1)
+ ptr::null()
};
if context.is_null() {
+ context = ffi::glx::CreateContext(display, &mut visual_infos, share, 1)
+ }
+
+ if context.is_null() {
return Err(OsError(format!("GL context creation failed")));
}