aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--Cargo.toml4
-rw-r--r--src/android/mod.rs8
-rw-r--r--src/osx/headless.rs3
-rw-r--r--src/osx/mod.rs5
-rw-r--r--src/win32/init.rs8
-rw-r--r--src/win32/mod.rs11
-rw-r--r--src/x11/headless.rs3
-rw-r--r--src/x11/window/mod.rs3
8 files changed, 41 insertions, 4 deletions
diff --git a/Cargo.toml b/Cargo.toml
index 99a727b..71595b3 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -38,9 +38,9 @@ git = "https://github.com/servo/rust-core-graphics"
git = "https://github.com/servo/rust-core-graphics"
[target.i686-pc-windows-gnu.dependencies.winapi]
-version = "^0.0.2"
+version = "^0.0.3"
features = ["gdi32", "kernel32", "user32"]
[target.x86_64-pc-windows-gnu.dependencies.winapi]
-version = "^0.0.2"
+version = "^0.0.3"
features = ["gdi32", "kernel32", "user32"]
diff --git a/src/android/mod.rs b/src/android/mod.rs
index 7279f99..111d4b4 100644
--- a/src/android/mod.rs
+++ b/src/android/mod.rs
@@ -60,6 +60,11 @@ impl HeadlessContext {
}
}
+#[cfg(feature = "headless")]
+unsafe impl Send for HeadlessContext {}
+#[cfg(feature = "headless")]
+unsafe impl Sync for HeadlessContext {}
+
impl Window {
pub fn new(builder: WindowBuilder) -> Result<Window, CreationError> {
use std::{mem, ptr};
@@ -275,6 +280,9 @@ impl Window {
}
}
+unsafe impl Send for Window {}
+unsafe impl Sync for Window {}
+
#[cfg(feature = "window")]
#[deriving(Clone)]
pub struct WindowProxy;
diff --git a/src/osx/headless.rs b/src/osx/headless.rs
index bbe3d9f..1332cf3 100644
--- a/src/osx/headless.rs
+++ b/src/osx/headless.rs
@@ -99,6 +99,9 @@ impl HeadlessContext {
}
}
+unsafe impl Send for HeadlessContext {}
+unsafe impl Sync for HeadlessContext {}
+
impl Drop for HeadlessContext {
fn drop(&mut self) {
unsafe {
diff --git a/src/osx/mod.rs b/src/osx/mod.rs
index 7df6603..92ef641 100644
--- a/src/osx/mod.rs
+++ b/src/osx/mod.rs
@@ -73,6 +73,11 @@ impl Window {
}
#[cfg(feature = "window")]
+unsafe impl Send for Window {}
+#[cfg(feature = "window")]
+unsafe impl Sync for Window {}
+
+#[cfg(feature = "window")]
#[deriving(Clone)]
pub struct WindowProxy;
diff --git a/src/win32/init.rs b/src/win32/init.rs
index 3cdf8d5..7b236b0 100644
--- a/src/win32/init.rs
+++ b/src/win32/init.rs
@@ -18,11 +18,15 @@ use winapi;
/// receive an event for another window.
thread_local!(static WINDOW: Rc<RefCell<Option<(winapi::HWND, Sender<Event>)>>> = Rc::new(RefCell::new(None)));
+/// Work-around the fact that HGLRC doesn't implement Send
+pub struct ContextHack(pub winapi::HGLRC);
+unsafe impl Send for ContextHack {}
+
pub fn new_window(builder_dimensions: Option<(uint, uint)>, builder_title: String,
builder_monitor: Option<super::MonitorID>,
builder_gl_version: Option<(uint, uint)>, builder_debug: bool,
builder_vsync: bool, builder_hidden: bool,
- builder_sharelists: Option<winapi::HGLRC>, builder_multisampling: Option<u16>)
+ builder_sharelists: Option<ContextHack>, builder_multisampling: Option<u16>)
-> Result<Window, CreationError>
{
use std::mem;
@@ -38,6 +42,8 @@ pub fn new_window(builder_dimensions: Option<(uint, uint)>, builder_title: Strin
// so we create a new thread dedicated to this window.
// This is the only safe method. Using `nosend` wouldn't work for non-native runtime.
::std::thread::Thread::spawn(move || {
+ let builder_sharelists = builder_sharelists.map(|s| s.0);
+
// registering the window class
let class_name = {
let class_name: Vec<u16> = "Window Class".utf16_units().chain(Some(0).into_iter())
diff --git a/src/win32/mod.rs b/src/win32/mod.rs
index dba08e5..a5f0547 100644
--- a/src/win32/mod.rs
+++ b/src/win32/mod.rs
@@ -51,6 +51,11 @@ impl HeadlessContext {
}
}
+#[cfg(feature = "headless")]
+unsafe impl Send for HeadlessContext {}
+#[cfg(feature = "headless")]
+unsafe impl Sync for HeadlessContext {}
+
/// The Win32 implementation of the main `Window` object.
pub struct Window {
/// Main handle for the window.
@@ -75,6 +80,9 @@ pub struct Window {
is_closed: AtomicBool,
}
+unsafe impl Send for Window {}
+unsafe impl Sync for Window {}
+
#[cfg(feature = "window")]
impl Window {
/// See the docs in the crate root file.
@@ -82,7 +90,8 @@ impl Window {
let WindowBuilder { dimensions, title, monitor, gl_version,
gl_debug, vsync, visible, sharing, multisampling } = builder;
init::new_window(dimensions, title, monitor, gl_version, gl_debug, vsync,
- !visible, sharing.map(|w| w.window.context), multisampling)
+ !visible, sharing.map(|w| init::ContextHack(w.window.context)),
+ multisampling)
}
}
diff --git a/src/x11/headless.rs b/src/x11/headless.rs
index 95f5233..d6f1023 100644
--- a/src/x11/headless.rs
+++ b/src/x11/headless.rs
@@ -62,3 +62,6 @@ impl Drop for HeadlessContext {
unsafe { ffi::OSMesaDestroyContext(self.context) }
}
}
+
+unsafe impl Send for HeadlessContext {}
+unsafe impl Sync for HeadlessContext {}
diff --git a/src/x11/window/mod.rs b/src/x11/window/mod.rs
index 422b5b6..0a8c3d5 100644
--- a/src/x11/window/mod.rs
+++ b/src/x11/window/mod.rs
@@ -34,6 +34,9 @@ struct XWindow {
im: ffi::XIM,
}
+unsafe impl Send for Window {}
+unsafe impl Sync for Window {}
+
impl Drop for XWindow {
fn drop(&mut self) {
unsafe {