aboutsummaryrefslogtreecommitdiffstats
path: root/src/win32
diff options
context:
space:
mode:
Diffstat (limited to 'src/win32')
-rw-r--r--src/win32/ffi.rs18
-rw-r--r--src/win32/init.rs21
-rw-r--r--src/win32/mod.rs21
-rw-r--r--src/win32/monitor.rs2
4 files changed, 49 insertions, 13 deletions
diff --git a/src/win32/ffi.rs b/src/win32/ffi.rs
index 2385954..71f8d55 100644
--- a/src/win32/ffi.rs
+++ b/src/win32/ffi.rs
@@ -7,12 +7,26 @@ use libc;
/// WGL bindings
pub mod wgl {
- generate_gl_bindings!("wgl", "core", "1.0", "static")
+ generate_gl_bindings! {
+ api: "wgl",
+ profile: "core",
+ version: "1.0",
+ generator: "static"
+ }
}
/// Functions that are not necessarly always available
pub mod wgl_extra {
- generate_gl_bindings!("wgl", "core", "1.0", "struct", [ "WGL_ARB_create_context" ])
+ generate_gl_bindings! {
+ api: "wgl",
+ profile: "core",
+ version: "1.0",
+ generator: "struct",
+ extensions: [
+ "WGL_ARB_create_context",
+ "WGL_EXT_swap_control"
+ ]
+ }
}
// http://msdn.microsoft.com/en-us/library/windows/desktop/aa383751(v=vs.85).aspx
diff --git a/src/win32/init.rs b/src/win32/init.rs
index bb3f53b..5168cc6 100644
--- a/src/win32/init.rs
+++ b/src/win32/init.rs
@@ -2,7 +2,7 @@ extern crate native;
use self::native::NativeTaskBuilder;
use std::task::TaskBuilder;
-use std::sync::atomics::AtomicBool;
+use std::sync::atomic::AtomicBool;
use std::ptr;
use super::{event, ffi};
use super::Window;
@@ -16,7 +16,7 @@ local_data_key!(WINDOW: (ffi::HWND, Sender<Event>))
pub fn new_window(builder_dimensions: Option<(uint, uint)>, builder_title: String,
builder_monitor: Option<super::MonitorID>,
- builder_gl_version: Option<(uint, uint)>,
+ builder_gl_version: Option<(uint, uint)>, builder_vsync: bool,
builder_headless: bool) -> Result<Window, String>
{
use std::mem;
@@ -346,6 +346,23 @@ pub fn new_window(builder_dimensions: Option<(uint, uint)>, builder_title: Strin
lib
};
+ // handling vsync
+ if builder_vsync {
+ if extra_functions.SwapIntervalEXT.is_loaded() {
+ unsafe { ffi::wgl::MakeCurrent(hdc, context) };
+ if extra_functions.SwapIntervalEXT(1) == 0 {
+ tx.send(Err(format!("wglSwapIntervalEXT failed")));
+ unsafe { ffi::wgl::DeleteContext(context); }
+ unsafe { ffi::DestroyWindow(real_window); }
+ return;
+ }
+
+ // it is important to remove the current context, otherwise you get very weird
+ // errors
+ unsafe { ffi::wgl::MakeCurrent(ptr::null(), ptr::null()); }
+ }
+ }
+
// building the struct
let window = Window{
window: real_window,
diff --git a/src/win32/mod.rs b/src/win32/mod.rs
index 8be3fdb..3cfdc7e 100644
--- a/src/win32/mod.rs
+++ b/src/win32/mod.rs
@@ -1,5 +1,6 @@
-use std::sync::atomics::AtomicBool;
+use std::sync::atomic::AtomicBool;
use std::ptr;
+use libc;
use Event;
#[cfg(feature = "window")]
@@ -24,7 +25,7 @@ impl HeadlessContext {
/// See the docs in the crate root file.
pub fn new(builder: HeadlessRendererBuilder) -> Result<HeadlessContext, String> {
let HeadlessRendererBuilder { dimensions, gl_version } = builder;
- init::new_window(Some(dimensions), "".to_string(), None, gl_version, true)
+ init::new_window(Some(dimensions), "".to_string(), None, gl_version, false, true)
.map(|w| HeadlessContext(w))
}
@@ -67,15 +68,15 @@ pub struct Window {
impl Window {
/// See the docs in the crate root file.
pub fn new(builder: WindowBuilder) -> Result<Window, String> {
- let WindowBuilder { dimensions, title, monitor, gl_version } = builder;
- init::new_window(dimensions, title, monitor, gl_version, false)
+ let WindowBuilder { dimensions, title, monitor, gl_version, vsync } = builder;
+ init::new_window(dimensions, title, monitor, gl_version, vsync, false)
}
}
impl Window {
/// See the docs in the crate root file.
pub fn is_closed(&self) -> bool {
- use std::sync::atomics::Relaxed;
+ use std::sync::atomic::Relaxed;
self.is_closed.load(Relaxed)
}
@@ -170,7 +171,7 @@ impl Window {
// if one of the received events is `Closed`, setting `is_closed` to true
if events.iter().find(|e| match e { &&::Closed => true, _ => false }).is_some() {
- use std::sync::atomics::Relaxed;
+ use std::sync::atomic::Relaxed;
self.is_closed.store(true, Relaxed);
}
@@ -185,7 +186,7 @@ impl Window {
// if the received event is `Closed`, setting `is_closed` to true
match ev {
::Closed => {
- use std::sync::atomics::Relaxed;
+ use std::sync::atomic::Relaxed;
self.is_closed.store(true, Relaxed);
},
_ => ()
@@ -198,7 +199,7 @@ impl Window {
},
Err(_) => {
- use std::sync::atomics::Relaxed;
+ use std::sync::atomic::Relaxed;
self.is_closed.store(true, Relaxed);
vec![]
}
@@ -233,6 +234,10 @@ impl Window {
ffi::SwapBuffers(self.hdc);
}
}
+
+ pub fn platform_display(&self) -> *mut libc::c_void {
+ unimplemented!()
+ }
}
#[unsafe_destructor]
diff --git a/src/win32/monitor.rs b/src/win32/monitor.rs
index a45c8fb..3e6b79a 100644
--- a/src/win32/monitor.rs
+++ b/src/win32/monitor.rs
@@ -101,7 +101,7 @@ pub fn get_primary_monitor() -> MonitorID {
}
}
- fail!("Failed to find the primary monitor")
+ panic!("Failed to find the primary monitor")
}
impl MonitorID {