From e3fce3d5ec14aca84d694d576814f98c6cc21192 Mon Sep 17 00:00:00 2001
From: Corey Farwell <coreyf@rwell.org>
Date: Wed, 23 Nov 2016 09:07:12 -0500
Subject: [PATCH] Implement min/max window dimension constraints for MacOS.

Fixes https://github.com/tomaka/winit/issues/80.
---
 Cargo.toml                |  2 +-
 src/platform/macos/mod.rs | 26 ++++++++++++++++++++------
 2 files changed, 21 insertions(+), 7 deletions(-)

diff --git a/Cargo.toml b/Cargo.toml
index 02eb93ec..16221eb6 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -26,7 +26,7 @@ objc = "0.2"
 [target.'cfg(target_os = "macos")'.dependencies]
 objc = "0.2"
 cgl = "0.1"
-cocoa = "0.5.0"
+cocoa = "0.5.1"
 core-foundation = "0"
 core-graphics = "0.4"
 
diff --git a/src/platform/macos/mod.rs b/src/platform/macos/mod.rs
index 2ed0e895..68d2a35a 100644
--- a/src/platform/macos/mod.rs
+++ b/src/platform/macos/mod.rs
@@ -13,8 +13,8 @@ use objc::declare::ClassDecl;
 
 use cocoa::base::{id, nil};
 use cocoa::foundation::{NSAutoreleasePool, NSDate, NSDefaultRunLoopMode, NSPoint, NSRect, NSSize,
-                        NSString, NSUInteger};
-use cocoa::appkit::{self, NSApplication, NSEvent, NSView, NSWindow};
+                        NSString, NSUInteger, NSArray};
+use cocoa::appkit::{self, NSApplication, NSEvent, NSView, NSWindow, NSLayoutConstraint, NSLayoutDimension};
 
 use core_graphics::display::{CGAssociateMouseAndMouseCursorPosition, CGMainDisplayID, CGDisplayPixelsHigh, CGWarpMouseCursorPosition};
 
@@ -269,10 +269,6 @@ impl Window {
                pl_attribs: &PlatformSpecificWindowBuilderAttributes)
                -> Result<Window, CreationError>
     {
-        // not implemented
-        assert!(win_attribs.min_dimensions.is_none());
-        assert!(win_attribs.max_dimensions.is_none());
-
         // let app = match Window::create_app() {
         let app = match Window::create_app(pl_attribs.activation_policy) {
             Some(app) => app,
@@ -300,6 +296,24 @@ impl Window {
             } else {
                 window.makeKeyWindow();
             }
+
+            let mut constraints = vec![];
+            if let Some((width, height)) = win_attribs.min_dimensions {
+                constraints.extend_from_slice(&[
+                    view.widthAnchor().constraintGreaterThanOrEqualToConstant(width.into()),
+                    view.heightAnchor().constraintGreaterThanOrEqualToConstant(height.into()),
+                ]);
+            }
+            if let Some((width, height)) = win_attribs.max_dimensions {
+                constraints.extend_from_slice(&[
+                    view.widthAnchor().constraintLessThanOrEqualToConstant(width.into()),
+                    view.heightAnchor().constraintLessThanOrEqualToConstant(height.into()),
+                ]);
+            }
+            if !constraints.is_empty() {
+                let constraints_nsarray = NSArray::arrayWithObjects(nil, &constraints);
+                NSLayoutConstraint::activateConstraints(nil, constraints_nsarray);
+            }
         }
 
         let ds = DelegateState {