It’s like a lost art; many people nowadays don’t bother and punt to the default 
full-screen size. It doesn’t help that some APIs don’t make it obvious what 
their optimized size should be.

> - (NSRect)windowWillUseStandardFrame:(NSWindow *)window 
> defaultFrame:(NSRect)newFrame {
>     NSParameterAssert(self.window == window);
> 
>     // Based on the web content, get the maximum desired width and height.
>     NSView<WebDocumentView> * const  view = 
> self.webView.mainFrame.frameView.documentView;
>     NSSize const       desiredContentSize = NSMakeSize(NSWidth(view.frame), 
> NSHeight(view.frame) + ((CGFloat)!!self.isLoadingBarVisible * 
> MyLoadingBarHeight) + ((CGFloat)!!self.isStatusBarVisible * 
> MyStatusBarHeight));
> 
>     // Adjust that desired size to what's actually available.
>     NSRect  frame = [window contentRectForFrameRect:newFrame];
> 
>     frame.size.width = MIN(desiredContentSize.width, frame.size.width);
>     frame.size.height = MIN(desiredContentSize.height, frame.size.height);
> 
>     // Adjust to the window's size bounds.
>     frame = [window frameRectForContentRect:frame];
>     frame.size.width = MAX(window.minSize.width, frame.size.width);
>     frame.size.height = MAX(window.minSize.height, frame.size.height);
>     NSAssert(frame.size.width <= newFrame.size.width, @"Standard web-browser 
> window size too wide.");
>     NSAssert(frame.size.height <= newFrame.size.height, @"Standard 
> web-browser window size too tall.");
> 
>     // Try minimizing the amount the window moves from its current spot on 
> the chosen screen.
>     NSRect const  oldOverlapFrame = NSIntersectionRect(window.frame, 
> newFrame);
> 
>     frame = NSOffsetRect(frame, NSMidX(oldOverlapFrame) - NSMidX(frame), 
> NSMidY(oldOverlapFrame) - NSMidY(frame));
>     if (NSMaxX(frame) > NSMaxX(newFrame)) {
>         frame = NSOffsetRect(frame, NSMaxX(newFrame) - NSMaxX(frame), 0.0);
>     } else if (NSMinX(frame) < NSMinX(newFrame)) {
>         frame = NSOffsetRect(frame, NSMinX(newFrame) - NSMinX(frame), 0.0);
>     }
>     if (NSMaxY(frame) > NSMaxY(newFrame)) {
>         frame = NSOffsetRect(frame, 0.0, NSMaxY(newFrame) - NSMaxY(frame));
>     } else if (NSMinY(frame) < NSMinY(newFrame)) {
>         frame = NSOffsetRect(frame, 0.0, NSMinY(newFrame) - NSMinY(frame));
>     }
> 
>     return frame;
> }


The WebView instance takes the window’s width, but optionally shares the height 
with the loading and/or status bars. I’ve read that the upper-left corner is 
usually left the same when the window needs to move around, but I forgot where 
I saw that and/or an example, so I chose to compare frame centers instead 
because it’s easier (especially trying to remember if the coordinate system is 
flipped or not).

— 
Daryle Walker
Mac, Internet, and Video Game Junkie
darylew AT mac DOT com 

_______________________________________________

Cocoa-dev mailing list (Cocoa-dev@lists.apple.com)

Please do not post admin requests or moderator comments to the list.
Contact the moderators at cocoa-dev-admins(at)lists.apple.com

Help/Unsubscribe/Update your Subscription:
https://lists.apple.com/mailman/options/cocoa-dev/archive%40mail-archive.com

This email sent to arch...@mail-archive.com

Reply via email to