window_sizer_ash.cc revision a1401311d1ab56c4ed0a474bd38c108f75cb0cd9
15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/window_sizer/window_sizer.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "ash/shell.h"
84e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "ash/wm/window_positioner.h"
968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#include "ash/wm/window_state.h"
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/browser.h"
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/browser_window.h"
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/aura/window.h"
13a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "ui/aura/window_event_dispatcher.h"
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gfx/screen.h"
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)void WindowSizer::GetTabbedBrowserBoundsAsh(
1758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    gfx::Rect* bounds_in_screen,
1858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    ui::WindowShowState* show_state) const {
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(show_state);
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(bounds_in_screen);
214e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  DCHECK(browser_->is_type_tabbed());
224e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  DCHECK(bounds_in_screen->IsEmpty());
23c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ui::WindowShowState passed_show_state = *show_state;
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
264e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  bool is_saved_bounds = GetSavedWindowBounds(bounds_in_screen, show_state);
27a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  gfx::Display display;
28a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  if (is_saved_bounds) {
29a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    display = screen_->GetDisplayMatching(*bounds_in_screen);
30a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  } else {
31a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    // If there is no saved bounds (hence bounds_in_screen is empty), use the
32a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    // target display.
33a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    display = target_display_provider_->GetTargetDisplay(screen_,
34a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                                                         *bounds_in_screen);
354e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    *bounds_in_screen = ash::WindowPositioner::GetDefaultWindowBounds(display);
36a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  }
374e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
384e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  if (browser_->is_session_restore()) {
394e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    // This is a fall-through case when there is no bounds recorded
404e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    // for restored window, and should not be used except for the case
414e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    // above.  The regular path is handled in
424e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    // |WindowSizer::DetermineWindowBoundsAndShowState|.
434e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
444e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    // Note: How restore bounds/show state data are passed.
454e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    // The restore bounds is passed via |Browser::override_bounds()| in
464e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    // |chrome::GetBrowserWindowBoundsAndShowState()|.
474e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    // The restore state is passed via |Browser::initial_state()| in
484e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    // |WindowSizer::GetWindowDefaultShowState|.
494e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    bounds_in_screen->AdjustToFit(display.work_area());
5058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    return;
5158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  }
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
534e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // The |browser_window| is non NULL when this is called after
544e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // browser's aura window is created.
554e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  aura::Window* browser_window =
564e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      browser_->window() ? browser_->window()->GetNativeWindow() : NULL;
574e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
584e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  ash::WindowPositioner::GetBoundsAndShowStateForNewWindow(
594e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      screen_,
604e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      browser_window,
614e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      is_saved_bounds,
624e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      passed_show_state,
634e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      bounds_in_screen,
644e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      show_state);
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
66