aboutsummaryrefslogtreecommitdiffstats
path: root/src/x11/mod.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/x11/mod.rs')
-rw-r--r--src/x11/mod.rs53
1 files changed, 38 insertions, 15 deletions
diff --git a/src/x11/mod.rs b/src/x11/mod.rs
index 0311b9a..b7393ce 100644
--- a/src/x11/mod.rs
+++ b/src/x11/mod.rs
@@ -51,23 +51,46 @@ impl Window {
display
};
- // TODO: set error handler
-
- static VISUAL_ATTRIBUTES: [libc::c_int, ..5] = [
- ffi::GLX_RGBA,
- ffi::GLX_DEPTH_SIZE,
- 24,
- ffi::GLX_DOUBLEBUFFER,
- 0
- ];
+ // TODO: set error handler?
+
+ // getting the FBConfig
+ let fb_config = unsafe {
+ static VISUAL_ATTRIBUTES: [libc::c_int, ..23] = [
+ ffi::GLX_X_RENDERABLE, 1,
+ ffi::GLX_DRAWABLE_TYPE, ffi::GLX_WINDOW_BIT,
+ ffi::GLX_RENDER_TYPE, ffi::GLX_RGBA_BIT,
+ ffi::GLX_X_VISUAL_TYPE, ffi::GLX_TRUE_COLOR,
+ ffi::GLX_RED_SIZE, 8,
+ ffi::GLX_GREEN_SIZE, 8,
+ ffi::GLX_BLUE_SIZE, 8,
+ ffi::GLX_ALPHA_SIZE, 8,
+ ffi::GLX_DEPTH_SIZE, 24,
+ ffi::GLX_STENCIL_SIZE, 8,
+ ffi::GLX_DOUBLEBUFFER, 1,
+ 0
+ ];
+
+ let mut num_fb: libc::c_int = mem::uninitialized();
+
+ let fb = ffi::glXChooseFBConfig(display, ffi::XDefaultScreen(display),
+ VISUAL_ATTRIBUTES.as_ptr(), &mut num_fb);
+ if fb.is_null() {
+ return Err(format!("glXChooseFBConfig failed"));
+ }
+ let preferred_fb = *fb; // TODO: choose more wisely
+ ffi::XFree(fb as *const libc::c_void);
+ preferred_fb
+ };
// getting the visual infos
let visual_infos = unsafe {
- let vi = ffi::glXChooseVisual(display, 0, VISUAL_ATTRIBUTES.as_ptr());
+ let vi = ffi::glXGetVisualFromFBConfig(display, fb_config);
if vi.is_null() {
return Err(format!("glXChooseVisual failed"));
}
- vi
+ let vi_copy = *vi;
+ ffi::XFree(vi as *const libc::c_void);
+ vi_copy
};
// getting the root window
@@ -76,7 +99,7 @@ impl Window {
// creating the color map
let cmap = unsafe {
let cmap = ffi::XCreateColormap(display, root,
- (*visual_infos).visual, ffi::AllocNone);
+ visual_infos.visual, ffi::AllocNone);
// TODO: error checking?
cmap
};
@@ -97,8 +120,8 @@ impl Window {
let dimensions = dimensions.unwrap_or((800, 600));
let win = ffi::XCreateWindow(display, root, 50, 50, dimensions.val0() as libc::c_uint,
- dimensions.val1() as libc::c_uint, 0, (*visual_infos).depth, ffi::InputOutput,
- (*visual_infos).visual, ffi::CWColormap | ffi::CWEventMask,
+ dimensions.val1() as libc::c_uint, 0, visual_infos.depth, ffi::InputOutput,
+ visual_infos.visual, ffi::CWColormap | ffi::CWEventMask,
&mut set_win_attr);
win
};
@@ -142,7 +165,7 @@ impl Window {
// creating GL context
let context = unsafe {
- ffi::glXCreateContext(display, visual_infos, ptr::null(), 1)
+ ffi::glXCreateContext(display, &visual_infos, ptr::null(), 1)
};
// returning