aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDavid Partouche <david@manateedev.com>2014-10-05 23:45:38 +0200
committerDavid Partouche <david@manateedev.com>2014-10-06 18:23:31 +0200
commitdb578e6e1ce88f2ceb2f0f04315aedab9e11441e (patch)
treebbb1f76e554e03d32daa76b4dffccba4119b2a47
parentc38110cac77253761afc8cc616f645dc1ec4d3b8 (diff)
downloadglutin-db578e6e1ce88f2ceb2f0f04315aedab9e11441e.tar.gz
glutin-db578e6e1ce88f2ceb2f0f04315aedab9e11441e.zip
Refactored window initialisation code for cocoa, making it more memory safe
-rw-r--r--Cargo.toml2
-rw-r--r--src/osx/mod.rs106
2 files changed, 78 insertions, 30 deletions
diff --git a/Cargo.toml b/Cargo.toml
index 1df2220..d15ba32 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -17,4 +17,4 @@ git = "https://github.com/bjz/gl-rs"
git = "https://github.com/DavidPartouche/rust-cocoa"
[dependencies.core_foundation]
-git = "https://github.com/DavidPartouche/rust-core-foundation"
+git = "https://github.com/servo/rust-core-foundation"
diff --git a/src/osx/mod.rs b/src/osx/mod.rs
index 99a8b2b..1dbe383 100644
--- a/src/osx/mod.rs
+++ b/src/osx/mod.rs
@@ -33,15 +33,54 @@ impl MonitorID {
impl Window {
pub fn new(_builder: WindowBuilder) -> Result<Window, String> {
- let context = unsafe {
- // Create the NSApplication
- let app = NSApp();
- app.setActivationPolicy_(NSApplicationActivationPolicyRegular);
- app.finishLaunching();
+ let app = match Window::create_app() {
+ Some(app) => app,
+ None => { return Err(format!("Couldn't create NSApplication")); },
+ };
+ let window = match Window::create_window(_builder.dimensions.unwrap_or((800, 600)), _builder.title.as_slice()) {
+ Some(window) => window,
+ None => { return Err(format!("Couldn't create NSWindow")); },
+ };
+ let view = match Window::create_view(window) {
+ Some(view) => view,
+ None => { return Err(format!("Couldn't create NSView")); },
+ };
+
+ let context = match Window::create_context(view) {
+ Some(context) => context,
+ None => { return Err(format!("Couldn't create OpenGL context")); },
+ };
+
+ unsafe {
+ app.activateIgnoringOtherApps_(true);
+ window.makeKeyAndOrderFront_(nil);
+ }
+
+ let window = Window {
+ context: context,
+ };
+
+ Ok(window)
+ }
+
+ fn create_app() -> Option<id> {
+ unsafe {
+ let app = NSApp();
+ if app == nil {
+ None
+ } else {
+ app.setActivationPolicy_(NSApplicationActivationPolicyRegular);
+ app.finishLaunching();
+ Some(app)
+ }
+ }
+ }
- // Create the window
- let scr_frame = NSRect::new(NSPoint::new(0., 0.), NSSize::new(800., 600.));
+ fn create_window(dimensions: (uint, uint), title: &str) -> Option<id> {
+ unsafe {
+ let (width, height) = dimensions;
+ let scr_frame = NSRect::new(NSPoint::new(0., 0.), NSSize::new(width as f64, height as f64));
let window = NSWindow::alloc(nil).initWithContentRect_styleMask_backing_defer_(
scr_frame,
@@ -49,15 +88,33 @@ impl Window {
NSBackingStoreBuffered,
false
);
- let view = NSView::alloc(nil).init();
- view.setWantsBestResolutionOpenGLSurface_(true);
- let title = NSString::alloc(nil).init_str("Hello World!\0");
- window.setTitle_(title);
- window.setContentView(view);
- window.center();
+ if window == nil {
+ None
+ } else {
+ let title = NSString::alloc(nil).init_str(title);
+ window.setTitle_(title);
+ window.center();
+ Some(window)
+ }
+ }
+ }
- // Create the context
+ fn create_view(window: id) -> Option<id> {
+ unsafe {
+ let view = NSView::alloc(nil).init();
+ if view == nil {
+ None
+ } else {
+ view.setWantsBestResolutionOpenGLSurface_(true);
+ window.setContentView(view);
+ Some(view)
+ }
+ }
+ }
+
+ fn create_context(view: id) -> Option<id> {
+ unsafe {
let attributes = [
NSOpenGLPFADoubleBuffer as uint,
NSOpenGLPFAClosestPolicy as uint,
@@ -70,26 +127,17 @@ impl Window {
let pixelformat = NSOpenGLPixelFormat::alloc(nil).initWithAttributes_(attributes);
if pixelformat == nil {
- return Err(format!("Couldn't create the pixel format"));
+ return None;
}
let context = NSOpenGLContext::alloc(nil).initWithFormat_shareContext_(pixelformat, nil);
if context == nil {
- return Err(format!("No valid OpenGL context can be created with that pixelformat"));
+ None
+ } else {
+ context.setView_(view);
+ Some(context)
}
-
- context.setView_(view);
-
- app.activateIgnoringOtherApps_(true);
- window.makeKeyAndOrderFront_(nil);
- context
- };
-
- let window = Window {
- context: context,
- };
-
- Ok(window)
+ }
}
pub fn is_closed(&self) -> bool {