aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--Cargo.toml20
-rw-r--r--src/api/cocoa/headless.rs4
-rw-r--r--src/api/dlopen.rs14
-rw-r--r--src/api/egl/mod.rs38
-rw-r--r--src/api/wgl/make_current_guard.rs6
-rw-r--r--src/api/wgl/mod.rs78
-rw-r--r--src/api/x11/window.rs92
7 files changed, 154 insertions, 98 deletions
diff --git a/Cargo.toml b/Cargo.toml
index ca8e935..56ec2b5 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -1,6 +1,6 @@
[package]
name = "glutin"
-version = "0.4.2"
+version = "0.4.3"
authors = ["tomaka <pierre.krieger1708@gmail.com>"]
description = "Cross-plaform OpenGL context provider."
keywords = ["windowing", "opengl"]
@@ -17,8 +17,8 @@ libc = "0.2"
shared_library = "0.1.0"
[build-dependencies]
-gl_generator = "0.2.0"
-khronos_api = "0.0.8"
+gl_generator = "0.4"
+khronos_api = "1.0"
[dev-dependencies]
clock_ticks = "0.1.0"
@@ -44,7 +44,7 @@ objc = "0.1.8"
[target.x86_64-apple-darwin.dependencies]
objc = "0.1.8"
cgl = "0.1"
-cocoa = "0.1.4"
+cocoa = "0.2"
core-foundation = "0"
core-graphics = "0"
@@ -85,39 +85,39 @@ osmesa-sys = "0.0.5"
wayland-client = { version = "0.2.1", features = ["egl", "dlopen"] }
wayland-kbd = "0.2.0"
wayland-window = "0.1.0"
-x11-dl = "~2.0"
+x11-dl = "~2.2"
[target.x86_64-unknown-linux-gnu.dependencies]
osmesa-sys = "0.0.5"
wayland-client = { version = "0.2.1", features = ["egl", "dlopen"] }
wayland-kbd = "0.2.0"
wayland-window = "0.1.0"
-x11-dl = "~2.0"
+x11-dl = "~2.2"
[target.arm-unknown-linux-gnueabihf.dependencies]
osmesa-sys = "0.0.5"
wayland-client = { version = "0.2.1", features = ["egl", "dlopen"] }
wayland-kbd = "0.2.0"
wayland-window = "0.1.0"
-x11-dl = "~2.0"
+x11-dl = "~2.2"
[target.aarch64-unknown-linux-gnu.dependencies]
osmesa-sys = "0.0.5"
wayland-client = { version = "0.2.1", features = ["egl", "dlopen"] }
wayland-kbd = "0.2.0"
wayland-window = "0.1.0"
-x11-dl = "~2.0"
+x11-dl = "~2.2"
[target.x86_64-unknown-dragonfly.dependencies]
osmesa-sys = "0.0.5"
wayland-client = { version = "0.2.1", features = ["egl", "dlopen"] }
wayland-kbd = "0.2.0"
wayland-window = "0.1.0"
-x11-dl = "~2.0"
+x11-dl = "~2.2"
[target.x86_64-unknown-freebsd.dependencies]
osmesa-sys = "0.0.5"
wayland-client = { version = "0.2.1", features = ["egl", "dlopen"] }
wayland-kbd = "0.2.0"
wayland-window = "0.1.0"
-x11-dl = "~2.0"
+x11-dl = "~2.2"
diff --git a/src/api/cocoa/headless.rs b/src/api/cocoa/headless.rs
index 1318185..d0d59f3 100644
--- a/src/api/cocoa/headless.rs
+++ b/src/api/cocoa/headless.rs
@@ -4,7 +4,7 @@ use CreationError::OsError;
use GlAttributes;
use GlContext;
use PixelFormatRequirements;
-use libc;
+use std::os::raw::c_void;
use std::ptr;
use core_foundation::base::TCFType;
@@ -57,7 +57,7 @@ impl HeadlessContext {
};
// Load the function pointers as we need them to create the FBO
- gl::load_with(|s| headless.get_proc_address(s) as *const libc::c_void);
+ gl::load_with(|s| headless.get_proc_address(s) as *const c_void);
Ok(headless)
}
diff --git a/src/api/dlopen.rs b/src/api/dlopen.rs
index 1bb2a0a..bacdd2c 100644
--- a/src/api/dlopen.rs
+++ b/src/api/dlopen.rs
@@ -1,15 +1,15 @@
#![cfg(any(target_os = "linux", target_os = "dragonfly", target_os = "freebsd"))]
#![allow(dead_code)]
-use libc;
+use std::os::raw::{c_void, c_char, c_int};
-pub const RTLD_LAZY: libc::c_int = 0x001;
-pub const RTLD_NOW: libc::c_int = 0x002;
+pub const RTLD_LAZY: c_int = 0x001;
+pub const RTLD_NOW: c_int = 0x002;
#[link="dl"]
extern {
- pub fn dlopen(filename: *const libc::c_char, flag: libc::c_int) -> *mut libc::c_void;
- pub fn dlerror() -> *mut libc::c_char;
- pub fn dlsym(handle: *mut libc::c_void, symbol: *const libc::c_char) -> *mut libc::c_void;
- pub fn dlclose(handle: *mut libc::c_void) -> libc::c_int;
+ pub fn dlopen(filename: *const c_char, flag: c_int) -> *mut c_void;
+ pub fn dlerror() -> *mut c_char;
+ pub fn dlsym(handle: *mut c_void, symbol: *const c_char) -> *mut c_void;
+ pub fn dlclose(handle: *mut c_void) -> c_int;
}
diff --git a/src/api/egl/mod.rs b/src/api/egl/mod.rs
index 53f8fc9..5e80068 100644
--- a/src/api/egl/mod.rs
+++ b/src/api/egl/mod.rs
@@ -12,8 +12,8 @@ use PixelFormatRequirements;
use Robustness;
use Api;
-use libc;
use std::ffi::{CStr, CString};
+use std::os::raw::{c_void, c_int};
use std::{mem, ptr};
pub mod ffi;
@@ -46,13 +46,13 @@ pub struct Context {
#[cfg(target_os = "android")]
#[inline]
fn get_native_display(egl: &ffi::egl::Egl,
- native_display: NativeDisplay) -> *const libc::c_void {
+ native_display: NativeDisplay) -> *const c_void {
unsafe { egl.GetDisplay(ffi::egl::DEFAULT_DISPLAY as *mut _) }
}
#[cfg(not(target_os = "android"))]
fn get_native_display(egl: &ffi::egl::Egl,
- native_display: NativeDisplay) -> *const libc::c_void {
+ native_display: NativeDisplay) -> *const c_void {
// the first step is to query the list of extensions without any display, if supported
let dp_extensions = unsafe {
let p = egl.QueryString(ffi::egl::NO_DISPLAY, ffi::egl::EXTENSIONS as i32);
@@ -374,9 +374,9 @@ impl<'a> ContextPrototype<'a> {
pub fn finish_pbuffer(self, dimensions: (u32, u32)) -> Result<Context, CreationError> {
let attrs = &[
- ffi::egl::WIDTH as libc::c_int, dimensions.0 as libc::c_int,
- ffi::egl::HEIGHT as libc::c_int, dimensions.1 as libc::c_int,
- ffi::egl::NONE as libc::c_int,
+ ffi::egl::WIDTH as c_int, dimensions.0 as c_int,
+ ffi::egl::HEIGHT as c_int, dimensions.1 as c_int,
+ ffi::egl::NONE as c_int,
];
let surface = unsafe {
@@ -584,7 +584,7 @@ unsafe fn create_context(egl: &ffi::egl::Egl, display: ffi::egl::types::EGLDispl
Robustness::NoError => {
if extensions.iter().find(|s| s == &"EGL_KHR_create_context_no_error").is_some() {
- context_attributes.push(ffi::egl::CONTEXT_OPENGL_NO_ERROR_KHR as libc::c_int);
+ context_attributes.push(ffi::egl::CONTEXT_OPENGL_NO_ERROR_KHR as c_int);
context_attributes.push(1);
}
},
@@ -592,9 +592,9 @@ unsafe fn create_context(egl: &ffi::egl::Egl, display: ffi::egl::types::EGLDispl
Robustness::RobustNoResetNotification => {
if supports_robustness {
context_attributes.push(ffi::egl::CONTEXT_OPENGL_RESET_NOTIFICATION_STRATEGY
- as libc::c_int);
- context_attributes.push(ffi::egl::NO_RESET_NOTIFICATION as libc::c_int);
- flags = flags | ffi::egl::CONTEXT_OPENGL_ROBUST_ACCESS as libc::c_int;
+ as c_int);
+ context_attributes.push(ffi::egl::NO_RESET_NOTIFICATION as c_int);
+ flags = flags | ffi::egl::CONTEXT_OPENGL_ROBUST_ACCESS as c_int;
} else {
return Err(CreationError::RobustnessNotSupported);
}
@@ -603,18 +603,18 @@ unsafe fn create_context(egl: &ffi::egl::Egl, display: ffi::egl::types::EGLDispl
Robustness::TryRobustNoResetNotification => {
if supports_robustness {
context_attributes.push(ffi::egl::CONTEXT_OPENGL_RESET_NOTIFICATION_STRATEGY
- as libc::c_int);
- context_attributes.push(ffi::egl::NO_RESET_NOTIFICATION as libc::c_int);
- flags = flags | ffi::egl::CONTEXT_OPENGL_ROBUST_ACCESS as libc::c_int;
+ as c_int);
+ context_attributes.push(ffi::egl::NO_RESET_NOTIFICATION as c_int);
+ flags = flags | ffi::egl::CONTEXT_OPENGL_ROBUST_ACCESS as c_int;
}
},
Robustness::RobustLoseContextOnReset => {
if supports_robustness {
context_attributes.push(ffi::egl::CONTEXT_OPENGL_RESET_NOTIFICATION_STRATEGY
- as libc::c_int);
- context_attributes.push(ffi::egl::LOSE_CONTEXT_ON_RESET as libc::c_int);
- flags = flags | ffi::egl::CONTEXT_OPENGL_ROBUST_ACCESS as libc::c_int;
+ as c_int);
+ context_attributes.push(ffi::egl::LOSE_CONTEXT_ON_RESET as c_int);
+ flags = flags | ffi::egl::CONTEXT_OPENGL_ROBUST_ACCESS as c_int;
} else {
return Err(CreationError::RobustnessNotSupported);
}
@@ -623,9 +623,9 @@ unsafe fn create_context(egl: &ffi::egl::Egl, display: ffi::egl::types::EGLDispl
Robustness::TryRobustLoseContextOnReset => {
if supports_robustness {
context_attributes.push(ffi::egl::CONTEXT_OPENGL_RESET_NOTIFICATION_STRATEGY
- as libc::c_int);
- context_attributes.push(ffi::egl::LOSE_CONTEXT_ON_RESET as libc::c_int);
- flags = flags | ffi::egl::CONTEXT_OPENGL_ROBUST_ACCESS as libc::c_int;
+ as c_int);
+ context_attributes.push(ffi::egl::LOSE_CONTEXT_ON_RESET as c_int);
+ flags = flags | ffi::egl::CONTEXT_OPENGL_ROBUST_ACCESS as c_int;
}
},
}
diff --git a/src/api/wgl/make_current_guard.rs b/src/api/wgl/make_current_guard.rs
index b890c82..83e35b2 100644
--- a/src/api/wgl/make_current_guard.rs
+++ b/src/api/wgl/make_current_guard.rs
@@ -1,7 +1,7 @@
use std::marker::PhantomData;
+use std::os::raw::c_void;
use std::io;
-use libc;
use winapi;
use CreationError;
@@ -40,8 +40,8 @@ impl<'a, 'b> CurrentContextGuard<'a, 'b> {
impl<'a, 'b> Drop for CurrentContextGuard<'a, 'b> {
fn drop(&mut self) {
unsafe {
- gl::wgl::MakeCurrent(self.previous_hdc as *const libc::c_void,
- self.previous_hglrc as *const libc::c_void);
+ gl::wgl::MakeCurrent(self.previous_hdc as *const c_void,
+ self.previous_hglrc as *const c_void);
}
}
}
diff --git a/src/api/wgl/mod.rs b/src/api/wgl/mod.rs
index 0f6a944..77e3f83 100644
--- a/src/api/wgl/mod.rs
+++ b/src/api/wgl/mod.rs
@@ -13,8 +13,8 @@ use Api;
use self::make_current_guard::CurrentContextGuard;
-use libc;
use std::ffi::{CStr, CString, OsStr};
+use std::os::raw::{c_void, c_int};
use std::os::windows::ffi::OsStrExt;
use std::{mem, ptr};
use std::io;
@@ -168,7 +168,7 @@ impl GlContext for Context {
#[inline]
fn is_current(&self) -> bool {
- unsafe { gl::wgl::GetCurrentContext() == self.context.0 as *const libc::c_void }
+ unsafe { gl::wgl::GetCurrentContext() == self.context.0 as *const c_void }
}
fn get_proc_address(&self, addr: &str) -> *const () {
@@ -232,32 +232,32 @@ unsafe fn create_context(extra: Option<(&gl::wgl_extra::Wgl, &PixelFormatRequire
match opengl.version {
GlRequest::Latest => {},
GlRequest::Specific(Api::OpenGl, (major, minor)) => {
- attributes.push(gl::wgl_extra::CONTEXT_MAJOR_VERSION_ARB as libc::c_int);
- attributes.push(major as libc::c_int);
- attributes.push(gl::wgl_extra::CONTEXT_MINOR_VERSION_ARB as libc::c_int);
- attributes.push(minor as libc::c_int);
+ attributes.push(gl::wgl_extra::CONTEXT_MAJOR_VERSION_ARB as c_int);
+ attributes.push(major as c_int);
+ attributes.push(gl::wgl_extra::CONTEXT_MINOR_VERSION_ARB as c_int);
+ attributes.push(minor as c_int);
},
GlRequest::Specific(Api::OpenGlEs, (major, minor)) => {
if extensions.split(' ').find(|&i| i == "WGL_EXT_create_context_es2_profile")
.is_some()
{
- attributes.push(gl::wgl_extra::CONTEXT_PROFILE_MASK_ARB as libc::c_int);
- attributes.push(gl::wgl_extra::CONTEXT_ES2_PROFILE_BIT_EXT as libc::c_int);
+ attributes.push(gl::wgl_extra::CONTEXT_PROFILE_MASK_ARB as c_int);
+ attributes.push(gl::wgl_extra::CONTEXT_ES2_PROFILE_BIT_EXT as c_int);
} else {
return Err(CreationError::OpenGlVersionNotSupported);
}
- attributes.push(gl::wgl_extra::CONTEXT_MAJOR_VERSION_ARB as libc::c_int);
- attributes.push(major as libc::c_int);
- attributes.push(gl::wgl_extra::CONTEXT_MINOR_VERSION_ARB as libc::c_int);
- attributes.push(minor as libc::c_int);
+ attributes.push(gl::wgl_extra::CONTEXT_MAJOR_VERSION_ARB as c_int);
+ attributes.push(major as c_int);
+ attributes.push(gl::wgl_extra::CONTEXT_MINOR_VERSION_ARB as c_int);
+ attributes.push(minor as c_int);
},
GlRequest::Specific(_, _) => return Err(CreationError::OpenGlVersionNotSupported),
GlRequest::GlThenGles { opengl_version: (major, minor), .. } => {
- attributes.push(gl::wgl_extra::CONTEXT_MAJOR_VERSION_ARB as libc::c_int);
- attributes.push(major as libc::c_int);
- attributes.push(gl::wgl_extra::CONTEXT_MINOR_VERSION_ARB as libc::c_int);
- attributes.push(minor as libc::c_int);
+ attributes.push(gl::wgl_extra::CONTEXT_MAJOR_VERSION_ARB as c_int);
+ attributes.push(major as c_int);
+ attributes.push(gl::wgl_extra::CONTEXT_MINOR_VERSION_ARB as c_int);
+ attributes.push(minor as c_int);
},
}
@@ -270,8 +270,8 @@ unsafe fn create_context(extra: Option<(&gl::wgl_extra::Wgl, &PixelFormatRequire
GlProfile::Core =>
gl::wgl_extra::CONTEXT_CORE_PROFILE_BIT_ARB,
};
- attributes.push(gl::wgl_extra::CONTEXT_PROFILE_MASK_ARB as libc::c_int);
- attributes.push(flag as libc::c_int);
+ attributes.push(gl::wgl_extra::CONTEXT_PROFILE_MASK_ARB as c_int);
+ attributes.push(flag as c_int);
} else {
return Err(CreationError::NotSupported);
}
@@ -284,14 +284,14 @@ unsafe fn create_context(extra: Option<(&gl::wgl_extra::Wgl, &PixelFormatRequire
if extensions.split(' ').find(|&i| i == "WGL_ARB_create_context_robustness").is_some() {
match opengl.robustness {
Robustness::RobustNoResetNotification | Robustness::TryRobustNoResetNotification => {
- attributes.push(gl::wgl_extra::CONTEXT_RESET_NOTIFICATION_STRATEGY_ARB as libc::c_int);
- attributes.push(gl::wgl_extra::NO_RESET_NOTIFICATION_ARB as libc::c_int);
- flags = flags | gl::wgl_extra::CONTEXT_ROBUST_ACCESS_BIT_ARB as libc::c_int;
+ attributes.push(gl::wgl_extra::CONTEXT_RESET_NOTIFICATION_STRATEGY_ARB as c_int);
+ attributes.push(gl::wgl_extra::NO_RESET_NOTIFICATION_ARB as c_int);
+ flags = flags | gl::wgl_extra::CONTEXT_ROBUST_ACCESS_BIT_ARB as c_int;
},
Robustness::RobustLoseContextOnReset | Robustness::TryRobustLoseContextOnReset => {
- attributes.push(gl::wgl_extra::CONTEXT_RESET_NOTIFICATION_STRATEGY_ARB as libc::c_int);
- attributes.push(gl::wgl_extra::LOSE_CONTEXT_ON_RESET_ARB as libc::c_int);
- flags = flags | gl::wgl_extra::CONTEXT_ROBUST_ACCESS_BIT_ARB as libc::c_int;
+ attributes.push(gl::wgl_extra::CONTEXT_RESET_NOTIFICATION_STRATEGY_ARB as c_int);
+ attributes.push(gl::wgl_extra::LOSE_CONTEXT_ON_RESET_ARB as c_int);
+ flags = flags | gl::wgl_extra::CONTEXT_ROBUST_ACCESS_BIT_ARB as c_int;
},
Robustness::NotRobust => (),
Robustness::NoError => (),
@@ -306,19 +306,19 @@ unsafe fn create_context(extra: Option<(&gl::wgl_extra::Wgl, &PixelFormatRequire
}
if opengl.debug {
- flags = flags | gl::wgl_extra::CONTEXT_DEBUG_BIT_ARB as libc::c_int;
+ flags = flags | gl::wgl_extra::CONTEXT_DEBUG_BIT_ARB as c_int;
}
flags
};
- attributes.push(gl::wgl_extra::CONTEXT_FLAGS_ARB as libc::c_int);
+ attributes.push(gl::wgl_extra::CONTEXT_FLAGS_ARB as c_int);
attributes.push(flags);
attributes.push(0);
- let ctxt = extra_functions.CreateContextAttribsARB(hdc as *const libc::c_void,
- share as *const libc::c_void,
+ let ctxt = extra_functions.CreateContextAttribsARB(hdc as *const c_void,
+ share as *const c_void,
attributes.as_ptr());
if ctxt.is_null() {
@@ -333,14 +333,14 @@ unsafe fn create_context(extra: Option<(&gl::wgl_extra::Wgl, &PixelFormatRequire
share = ptr::null_mut();
}
- let ctxt = gl::wgl::CreateContext(hdc as *const libc::c_void);
+ let ctxt = gl::wgl::CreateContext(hdc as *const c_void);
if ctxt.is_null() {
return Err(CreationError::OsError(format!("wglCreateContext failed: {}",
format!("{}", io::Error::last_os_error()))));
}
if !share.is_null() {
- if gl::wgl::ShareLists(share as *const libc::c_void, ctxt) == 0 {
+ if gl::wgl::ShareLists(share as *const c_void, ctxt) == 0 {
return Err(CreationError::OsError(format!("wglShareLists failed: {}",
format!("{}", io::Error::last_os_error()))));
}
@@ -352,7 +352,7 @@ unsafe fn create_context(extra: Option<(&gl::wgl_extra::Wgl, &PixelFormatRequire
/// Enumerates the list of pixel formats without using WGL.
///
/// Gives less precise results than `enumerate_arb_pixel_formats`.
-unsafe fn enumerate_native_pixel_formats(hdc: winapi::HDC) -> Vec<(libc::c_int, PixelFormat)> {
+unsafe fn enumerate_native_pixel_formats(hdc: winapi::HDC) -> Vec<(c_int, PixelFormat)> {
let size_of_pxfmtdescr = mem::size_of::<winapi::PIXELFORMATDESCRIPTOR>() as u32;
let num = gdi32::DescribePixelFormat(hdc, 1, size_of_pxfmtdescr, ptr::null_mut());
@@ -397,12 +397,12 @@ unsafe fn enumerate_native_pixel_formats(hdc: winapi::HDC) -> Vec<(libc::c_int,
///
/// Gives more precise results than `enumerate_native_pixel_formats`.
unsafe fn enumerate_arb_pixel_formats(extra: &gl::wgl_extra::Wgl, extensions: &str,
- hdc: winapi::HDC) -> Vec<(libc::c_int, PixelFormat)>
+ hdc: winapi::HDC) -> Vec<(c_int, PixelFormat)>
{
let get_info = |index: u32, attrib: u32| {
let mut value = mem::uninitialized();
- extra.GetPixelFormatAttribivARB(hdc as *const _, index as libc::c_int,
- 0, 1, [attrib as libc::c_int].as_ptr(),
+ extra.GetPixelFormatAttribivARB(hdc as *const _, index as c_int,
+ 0, 1, [attrib as c_int].as_ptr(),
&mut value);
value as u32
};
@@ -429,7 +429,7 @@ unsafe fn enumerate_arb_pixel_formats(extra: &gl::wgl_extra::Wgl, extensions: &s
continue;
}
- result.push((index as libc::c_int, PixelFormat {
+ result.push((index as c_int, PixelFormat {
hardware_accelerated: true,
color_bits: get_info(index, gl::wgl_extra::RED_BITS_ARB) as u8 +
get_info(index, gl::wgl_extra::GREEN_BITS_ARB) as u8 +
@@ -463,7 +463,7 @@ unsafe fn enumerate_arb_pixel_formats(extra: &gl::wgl_extra::Wgl, extensions: &s
}
/// Calls `SetPixelFormat` on a window.
-unsafe fn set_pixel_format(hdc: winapi::HDC, id: libc::c_int) -> Result<(), CreationError> {
+unsafe fn set_pixel_format(hdc: winapi::HDC, id: c_int) -> Result<(), CreationError> {
let mut output: winapi::PIXELFORMATDESCRIPTOR = mem::zeroed();
if gdi32::DescribePixelFormat(hdc, id, mem::size_of::<winapi::PIXELFORMATDESCRIPTOR>()
@@ -564,14 +564,14 @@ unsafe fn load_extra_functions(window: winapi::HWND) -> Result<gl::wgl_extra::Wg
Ok(gl::wgl_extra::Wgl::load_with(|addr| {
let addr = CString::new(addr.as_bytes()).unwrap();
let addr = addr.as_ptr();
- gl::wgl::GetProcAddress(addr) as *const libc::c_void
+ gl::wgl::GetProcAddress(addr) as *const c_void
}))
}
/// Given a list of pixel formats, this function chooses one that is likely to be provided by
/// the main video driver of the system.
-fn choose_dummy_pixel_format<I>(iter: I) -> Result<libc::c_int, CreationError>
- where I: Iterator<Item=(libc::c_int, PixelFormat)>
+fn choose_dummy_pixel_format<I>(iter: I) -> Result<c_int, CreationError>
+ where I: Iterator<Item=(c_int, PixelFormat)>
{
let mut backup_id = None;
diff --git a/src/api/x11/window.rs b/src/api/x11/window.rs
index 09470ff..297a4f3 100644
--- a/src/api/x11/window.rs
+++ b/src/api/x11/window.rs
@@ -8,6 +8,7 @@ use std::cell::Cell;
use std::sync::atomic::AtomicBool;
use std::collections::VecDeque;
use std::sync::{Arc, Mutex};
+use std::os::raw::c_long;
use Api;
use ContextError;
@@ -54,7 +55,7 @@ pub struct XWindow {
pub context: Context,
is_fullscreen: bool,
screen_id: libc::c_int,
- xf86_desk_mode: *mut ffi::XF86VidModeModeInfo,
+ xf86_desk_mode: ffi::XF86VidModeModeInfo,
ic: ffi::XIC,
im: ffi::XIM,
colormap: ffi::Colormap,
@@ -87,7 +88,7 @@ impl Drop for XWindow {
let _lock = GLOBAL_XOPENIM_LOCK.lock().unwrap();
if self.is_fullscreen {
- (self.display.xf86vmode.XF86VidModeSwitchToMode)(self.display.display, self.screen_id, self.xf86_desk_mode);
+ (self.display.xf86vmode.XF86VidModeSwitchToMode)(self.display.display, self.screen_id, &mut self.xf86_desk_mode);
(self.display.xf86vmode.XF86VidModeSetViewPort)(self.display.display, self.screen_id, 0, 0);
}
@@ -321,15 +322,12 @@ impl Window {
return Err(OsError(format!("Could not query the video modes")));
}
- let xf86_desk_mode = *modes.offset(0);
-
- // FIXME: `XF86VidModeModeInfo` is missing its `hskew` field. Therefore we point to
- // `vsyncstart` instead of `vdisplay` as a temporary hack.
+ let xf86_desk_mode: ffi::XF86VidModeModeInfo = ptr::read(*modes.offset(0));
let mode_to_switch_to = if window_attrs.monitor.is_some() {
let matching_mode = (0 .. mode_num).map(|i| {
let m: ffi::XF86VidModeModeInfo = ptr::read(*modes.offset(i as isize) as *const _); m
- }).find(|m| m.hdisplay == dimensions.0 as u16 && m.vsyncstart == dimensions.1 as u16);
+ }).find(|m| m.hdisplay == dimensions.0 as u16 && m.vdisplay == dimensions.1 as u16);
if let Some(matching_mode) = matching_mode {
Some(matching_mode)
@@ -337,7 +335,7 @@ impl Window {
} else {
let m = (0 .. mode_num).map(|i| {
let m: ffi::XF86VidModeModeInfo = ptr::read(*modes.offset(i as isize) as *const _); m
- }).find(|m| m.hdisplay >= dimensions.0 as u16 && m.vsyncstart == dimensions.1 as u16);
+ }).find(|m| m.hdisplay >= dimensions.0 as u16 && m.vdisplay >= dimensions.1 as u16);
match m {
Some(m) => Some(m),
@@ -439,16 +437,6 @@ impl Window {
window_attributes |= ffi::CWBackPixel;
}
- // switching to fullscreen
- if let Some(mut mode_to_switch_to) = mode_to_switch_to {
- window_attributes |= ffi::CWOverrideRedirect;
- unsafe {
- (display.xf86vmode.XF86VidModeSwitchToMode)(display.display, screen_id, &mut mode_to_switch_to);
- (display.xf86vmode.XF86VidModeSetViewPort)(display.display, screen_id, 0, 0);
- set_win_attr.override_redirect = 1;
- }
- }
-
// finally creating the window
let window = unsafe {
let win = (display.xlib.XCreateWindow)(display.display, root, 0, 0, dimensions.0 as libc::c_uint,
@@ -531,6 +519,64 @@ impl Window {
let is_fullscreen = window_attrs.monitor.is_some();
+ if is_fullscreen {
+ let state_atom = unsafe {
+ with_c_str("_NET_WM_STATE", |state|
+ (display.xlib.XInternAtom)(display.display, state, 0)
+ )
+ };
+ let fullscreen_atom = unsafe {
+ with_c_str("_NET_WM_STATE_FULLSCREEN", |state_fullscreen|
+ (display.xlib.XInternAtom)(display.display, state_fullscreen, 0)
+ )
+ };
+
+ let client_message_event = ffi::XClientMessageEvent {
+ type_: ffi::ClientMessage,
+ serial: 0,
+ send_event: 1, // true because we are sending this through `XSendEvent`
+ display: display.display,
+ window: window,
+ message_type: state_atom, // the _NET_WM_STATE atom is sent to change the state of a window
+ format: 32, // view `data` as `c_long`s
+ data: {
+ let mut data = ffi::ClientMessageData::new();
+ // This first `long` is the action; `1` means add/set following property.
+ data.set_long(0, 1);
+ // This second `long` is the property to set (fullscreen)
+ data.set_long(1, fullscreen_atom as c_long);
+ data
+ }
+ };
+ let mut x_event = ffi::XEvent::from(client_message_event);
+
+ unsafe {
+ (display.xlib.XSendEvent)(
+ display.display,
+ root,
+ 0,
+ ffi::SubstructureRedirectMask | ffi::SubstructureNotifyMask,
+ &mut x_event as *mut _
+ );
+ }
+
+ if let Some(mut mode_to_switch_to) = mode_to_switch_to {
+ unsafe {
+ (display.xf86vmode.XF86VidModeSwitchToMode)(
+ display.display,
+ screen_id,
+ &mut mode_to_switch_to
+ );
+ }
+ }
+ else {
+ println!("[glutin] Unexpected state: `mode` is None creating fullscreen window");
+ }
+ unsafe {
+ (display.xf86vmode.XF86VidModeSetViewPort)(display.display, screen_id, 0, 0);
+ }
+ }
+
// finish creating the OpenGL context
let context = match context {
Prototype::Glx(ctxt) => {
@@ -569,6 +615,16 @@ impl Window {
input_handler: Mutex::new(XInputEventHandler::new(display, window, ic, window_attrs))
};
+ unsafe {
+ let ref x_window: &XWindow = window.x.borrow();
+ (display.xlib.XSetInputFocus)(
+ display.display,
+ x_window.window,
+ ffi::RevertToParent,
+ ffi::CurrentTime
+ );
+ }
+
// returning
Ok(window)
}