1// Copyright (c) 2012 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#include "chrome/browser/ui/window_sizer/window_sizer.h"
6
7#import <Cocoa/Cocoa.h>
8
9#include "chrome/browser/ui/browser.h"
10#include "chrome/browser/ui/browser_finder.h"
11#include "chrome/browser/ui/browser_window.h"
12#include "chrome/browser/ui/host_desktop.h"
13
14// How much horizontal and vertical offset there is between newly
15// opened windows.
16const int WindowSizer::kWindowTilePixels = 22;
17
18// static
19gfx::Point WindowSizer::GetDefaultPopupOrigin(const gfx::Size& size,
20                                              chrome::HostDesktopType type) {
21  NSRect work_area = [[NSScreen mainScreen] visibleFrame];
22  NSRect main_area = [[[NSScreen screens] objectAtIndex:0] frame];
23  NSPoint corner = NSMakePoint(NSMinX(work_area), NSMaxY(work_area));
24
25  if (Browser* browser = chrome::FindLastActiveWithHostDesktopType(type)) {
26    NSWindow* window = browser->window()->GetNativeWindow();
27    NSRect window_frame = [window frame];
28
29    // Limit to not overflow the work area right and bottom edges.
30    NSPoint limit = NSMakePoint(
31        std::min(NSMinX(window_frame) + kWindowTilePixels,
32                 NSMaxX(work_area) - size.width()),
33        std::max(NSMaxY(window_frame) - kWindowTilePixels,
34                 NSMinY(work_area) + size.height()));
35
36    // Adjust corner to now overflow the work area left and top edges, so
37    // that if a popup does not fit the title-bar is remains visible.
38    corner = NSMakePoint(std::max(corner.x, limit.x),
39                         std::min(corner.y, limit.y));
40  }
41
42  return gfx::Point(corner.x, NSHeight(main_area) - corner.y);
43}
44