Home | History | Annotate | Download | only in window_sizer
      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 #include <gtk/gtk.h>
      8 
      9 #include "base/logging.h"
     10 #include "chrome/browser/ui/browser.h"
     11 #include "chrome/browser/ui/browser_finder.h"
     12 #include "chrome/browser/ui/browser_window.h"
     13 #include "chrome/browser/ui/host_desktop.h"
     14 #include "ui/gfx/screen.h"
     15 
     16 // Used to pad the default new window size.  On Windows, this is also used for
     17 // positioning new windows (each window is offset from the previous one).
     18 // Since we don't position windows, it's only used for the default new window
     19 // size.
     20 const int WindowSizer::kWindowTilePixels = 10;
     21 
     22 // static
     23 gfx::Point WindowSizer::GetDefaultPopupOrigin(const gfx::Size& size,
     24                                               chrome::HostDesktopType type) {
     25   gfx::Rect monitor_bounds = gfx::Screen::GetNativeScreen()->
     26       GetPrimaryDisplay().work_area();
     27   gfx::Point corner(monitor_bounds.x(), monitor_bounds.y());
     28 
     29   if (Browser* browser = chrome::FindLastActiveWithHostDesktopType(type)) {
     30     GtkWindow* window =
     31         reinterpret_cast<GtkWindow*>(browser->window()->GetNativeWindow());
     32     int x = 0, y = 0;
     33     gtk_window_get_position(window, &x, &y);
     34     // Limit to not overflow the work area right and bottom edges.
     35     gfx::Point limit(
     36         std::min(x + kWindowTilePixels, monitor_bounds.right() - size.width()),
     37         std::min(y + kWindowTilePixels,
     38                  monitor_bounds.bottom() - size.height()));
     39     // Adjust corner to now overflow the work area left and top edges, so
     40     // that if a popup does not fit the title-bar is remains visible.
     41     corner = gfx::Point(
     42         std::max(corner.x(), limit.x()),
     43         std::max(corner.y(), limit.y()));
     44   }
     45   return corner;
     46 }
     47