diff options
| author | David Partouche <david@manateedev.com> | 2014-10-05 23:45:38 +0200 | 
|---|---|---|
| committer | David Partouche <david@manateedev.com> | 2014-10-06 18:23:31 +0200 | 
| commit | db578e6e1ce88f2ceb2f0f04315aedab9e11441e (patch) | |
| tree | bbb1f76e554e03d32daa76b4dffccba4119b2a47 | |
| parent | c38110cac77253761afc8cc616f645dc1ec4d3b8 (diff) | |
| download | glutin-db578e6e1ce88f2ceb2f0f04315aedab9e11441e.tar.gz glutin-db578e6e1ce88f2ceb2f0f04315aedab9e11441e.zip  | |
Refactored window initialisation code for cocoa, making it more memory safe
| -rw-r--r-- | Cargo.toml | 2 | ||||
| -rw-r--r-- | src/osx/mod.rs | 106 | 
2 files changed, 78 insertions, 30 deletions
@@ -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 {  | 
