diff options
-rw-r--r-- | Cargo.toml | 1 | ||||
-rw-r--r-- | examples/cursor.rs | 2 | ||||
-rw-r--r-- | examples/fullscreen.rs | 1 | ||||
-rw-r--r-- | examples/grabbing.rs | 2 | ||||
-rw-r--r-- | examples/multiwindow.rs | 6 | ||||
-rw-r--r-- | examples/transparent.rs | 4 | ||||
-rw-r--r-- | examples/vsync.rs | 4 | ||||
-rw-r--r-- | examples/window.rs | 2 | ||||
-rw-r--r-- | src/api/cocoa/mod.rs | 23 | ||||
-rw-r--r-- | src/api/glx/mod.rs | 6 | ||||
-rw-r--r-- | src/lib.rs | 2 |
11 files changed, 42 insertions, 11 deletions
@@ -32,6 +32,7 @@ version = "0" [target.x86_64-apple-darwin.dependencies] objc = "0.1" +cgl = "0" cocoa = "0" core-foundation = "0" core-graphics = "0" diff --git a/examples/cursor.rs b/examples/cursor.rs index d3beb84..8b0d818 100644 --- a/examples/cursor.rs +++ b/examples/cursor.rs @@ -17,7 +17,7 @@ fn main() { println!("This example requires glutin to be compiled with the `wind #[cfg(feature = "window")] fn main() { - let window = glutin::Window::new().unwrap(); + let window = glutin::WindowBuilder::new().with_gl_profile(glutin::GlProfile::Compatibility).build().unwrap(); window.set_title("A fantastic window!"); unsafe { window.make_current() }; diff --git a/examples/fullscreen.rs b/examples/fullscreen.rs index d64224b..246a162 100644 --- a/examples/fullscreen.rs +++ b/examples/fullscreen.rs @@ -35,6 +35,7 @@ fn main() { }; let window = glutin::WindowBuilder::new() + .with_gl_profile(glutin::GlProfile::Compatibility) .with_title("Hello world!".to_string()) .with_fullscreen(monitor) .build() diff --git a/examples/grabbing.rs b/examples/grabbing.rs index 8a46750..738a939 100644 --- a/examples/grabbing.rs +++ b/examples/grabbing.rs @@ -16,7 +16,7 @@ fn main() { println!("This example requires glutin to be compiled with the `wind #[cfg(feature = "window")] fn main() { - let window = glutin::Window::new().unwrap(); + let window = glutin::WindowBuilder::new().with_gl_profile(glutin::GlProfile::Compatibility).build().unwrap(); window.set_title("glutin - Cursor grabbing test"); unsafe { window.make_current() }; diff --git a/examples/multiwindow.rs b/examples/multiwindow.rs index a9a5bac..503e0a0 100644 --- a/examples/multiwindow.rs +++ b/examples/multiwindow.rs @@ -16,9 +16,9 @@ fn main() { println!("This example requires glutin to be compiled with the `wind #[cfg(feature = "window")] fn main() { - let window1 = glutin::Window::new().unwrap(); - let window2 = glutin::Window::new().unwrap(); - let window3 = glutin::Window::new().unwrap(); + let window1 = glutin::WindowBuilder::new().with_gl_profile(glutin::GlProfile::Compatibility).build().unwrap(); + let window2 = glutin::WindowBuilder::new().with_gl_profile(glutin::GlProfile::Compatibility).build().unwrap(); + let window3 = glutin::WindowBuilder::new().with_gl_profile(glutin::GlProfile::Compatibility).build().unwrap(); let t1 = thread::spawn(move || { run(window1, (0.0, 1.0, 0.0, 1.0)); diff --git a/examples/transparent.rs b/examples/transparent.rs index 553c16d..01c084a 100644 --- a/examples/transparent.rs +++ b/examples/transparent.rs @@ -19,7 +19,9 @@ fn resize_callback(width: u32, height: u32) { #[cfg(feature = "window")] fn main() { - let mut window = glutin::WindowBuilder::new().with_decorations(false).with_transparency(true) + let mut window = glutin::WindowBuilder::new().with_gl_profile(glutin::GlProfile::Compatibility) + .with_decorations(false) + .with_transparency(true) .build().unwrap(); window.set_title("A fantastic window!"); window.set_window_resize_callback(Some(resize_callback as fn(u32, u32))); diff --git a/examples/vsync.rs b/examples/vsync.rs index ec9ea79..4ae2598 100644 --- a/examples/vsync.rs +++ b/examples/vsync.rs @@ -23,7 +23,9 @@ fn main() { println!("Vsync example. This example may panic if your driver or your system forces \ you out of vsync. This is intended when `build_strict` is used."); - let mut window = glutin::WindowBuilder::new().with_vsync().build_strict().unwrap(); + let mut window = glutin::WindowBuilder::new().with_gl_profile(glutin::GlProfile::Compatibility) + .with_vsync() + .build_strict().unwrap(); window.set_window_resize_callback(Some(resize_callback as fn(u32, u32))); unsafe { window.make_current() }; diff --git a/examples/window.rs b/examples/window.rs index 4077399..d4e1a8d 100644 --- a/examples/window.rs +++ b/examples/window.rs @@ -19,7 +19,7 @@ fn resize_callback(width: u32, height: u32) { #[cfg(feature = "window")] fn main() { - let mut window = glutin::Window::new().unwrap(); + let mut window = glutin::WindowBuilder::new().with_gl_profile(glutin::GlProfile::Compatibility).build().unwrap(); window.set_title("A fantastic window!"); window.set_window_resize_callback(Some(resize_callback as fn(u32, u32))); unsafe { window.make_current() }; diff --git a/src/api/cocoa/mod.rs b/src/api/cocoa/mod.rs index aa408ff..5cb7edb 100644 --- a/src/api/cocoa/mod.rs +++ b/src/api/cocoa/mod.rs @@ -18,6 +18,10 @@ use native_monitor::NativeMonitorId; use objc::runtime::{Class, Object, Sel, BOOL, YES, NO}; use objc::declare::ClassDecl; +use cgl; +use cgl::{CGLEnable, kCGLCECrashOnRemovedFunctions, CGLSetParameter, kCGLCPSurfaceOpacity}; +use cgl::CGLContextObj as CGL_CGLContextObj; + use cocoa::base::{id, nil}; use cocoa::foundation::{NSAutoreleasePool, NSDate, NSDefaultRunLoopMode, NSPoint, NSRect, NSSize, NSString, NSUInteger}; @@ -354,6 +358,21 @@ impl Window { }; unsafe { + if builder.transparent { + let clear_col = { + let cls = Class::get("NSColor").unwrap(); + + msg_send![cls, clearColor] + }; + window.setOpaque_(NO); + window.setBackgroundColor_(clear_col); + + let obj = context.CGLContextObj(); + + let mut opacity = 0; + CGLSetParameter(obj, kCGLCPSurfaceOpacity, &mut opacity); + } + app.activateIgnoringOtherApps_(YES); if builder.visible { window.makeKeyAndOrderFront_(nil); @@ -434,7 +453,7 @@ impl Window { } }; - let masks = if screen.is_some() { + let masks = if screen.is_some() || !builder.decorations { NSBorderlessWindowMask as NSUInteger } else { NSTitledWindowMask as NSUInteger | @@ -573,6 +592,8 @@ impl Window { let value = if builder.vsync { 1 } else { 0 }; cxt.setValues_forParameter_(&value, NSOpenGLContextParameter::NSOpenGLCPSwapInterval); + CGLEnable(cxt.CGLContextObj(), kCGLCECrashOnRemovedFunctions); + Ok((cxt, pf)) } else { Err(CreationError::NotSupported) diff --git a/src/api/glx/mod.rs b/src/api/glx/mod.rs index 4ba99ca..455f6a5 100644 --- a/src/api/glx/mod.rs +++ b/src/api/glx/mod.rs @@ -182,8 +182,10 @@ unsafe impl Sync for Context {} impl Drop for Context { fn drop(&mut self) { unsafe { - // we don't call MakeCurrent(0, 0) because we are not sure that the context - // is still the current one + if self.is_current() { + self.glx.MakeCurrent(self.display as *mut _, 0, ptr::null_mut()); + } + self.glx.DestroyContext(self.display as *mut _, self.context); } } @@ -46,6 +46,8 @@ extern crate dwmapi; #[macro_use] extern crate objc; #[cfg(target_os = "macos")] +extern crate cgl; +#[cfg(target_os = "macos")] extern crate cocoa; #[cfg(target_os = "macos")] extern crate core_foundation; |