diff options
Diffstat (limited to 'chrome/browser/cocoa')
-rw-r--r-- | chrome/browser/cocoa/browser_window_controller.h | 4 | ||||
-rw-r--r-- | chrome/browser/cocoa/browser_window_controller.mm | 31 |
2 files changed, 34 insertions, 1 deletions
diff --git a/chrome/browser/cocoa/browser_window_controller.h b/chrome/browser/cocoa/browser_window_controller.h index 7bbbe96..c90de7a 100644 --- a/chrome/browser/cocoa/browser_window_controller.h +++ b/chrome/browser/cocoa/browser_window_controller.h @@ -378,6 +378,10 @@ class TabContents; // or the download shelf), so that future shrinking will occur from the bottom. - (void)resetWindowGrowthState; +// Computes by how far in each direction, horizontal and vertical, the +// |source| rect doesn't fit into |target|. +- (NSSize)overflowFrom:(NSRect)source + to:(NSRect)target; @end // @interface BrowserWindowController(TestingAPI) diff --git a/chrome/browser/cocoa/browser_window_controller.mm b/chrome/browser/cocoa/browser_window_controller.mm index b2ec489..b7bbe34 100644 --- a/chrome/browser/cocoa/browser_window_controller.mm +++ b/chrome/browser/cocoa/browser_window_controller.mm @@ -1155,7 +1155,15 @@ gfx::Rect browserRect(windowRect.origin.x, windowRect.origin.y, windowRect.size.width, windowRect.size.height); - NSRect tabRect = [tabView frame]; + NSRect sourceTabRect = [tabView frame]; + NSView* tabStrip = [self tabStripView]; + + // Pushes tabView's frame back inside the tabstrip. + NSSize tabOverflow = + [self overflowFrom:[tabStrip convertRectToBase:sourceTabRect] + to:[tabStrip frame]]; + NSRect tabRect = NSOffsetRect(sourceTabRect, + -tabOverflow.width, -tabOverflow.height); // Before detaching the tab, store the pinned state. bool isPinned = browser_->tabstrip_model()->IsTabPinned(index); @@ -1684,6 +1692,27 @@ willAnimateFromState:(bookmarks::VisualState)oldState isShrinkingFromZoomed_ = NO; } +- (NSSize)overflowFrom:(NSRect)source + to:(NSRect)target { + // If |source|'s boundary is outside of |target|'s, set its distance + // to |x|. Note that |source| can overflow to both side, but we + // have nothing to do for such case. + CGFloat x = 0; + if (NSMaxX(target) < NSMaxX(source)) // |source| overflows to right + x = NSMaxX(source) - NSMaxX(target); + else if (NSMinX(source) < NSMinX(target)) // |source| overflows to left + x = NSMinX(source) - NSMinX(target); + + // Same as |x| above. + CGFloat y = 0; + if (NSMaxY(target) < NSMaxY(source)) + y = NSMaxY(source) - NSMaxY(target); + else if (NSMinY(source) < NSMinY(target)) + y = NSMinY(source) - NSMinY(target); + + return NSMakeSize(x, y); +} + // Override to swap in the correct tab strip controller based on the new // tab strip mode. - (void)toggleTabStripDisplayMode { |