lock_window_state.cc revision 6d86b77056ed63eb6871182f42a9fd5f07550f90
146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)// Copyright 2014 The Chromium Authors. All rights reserved.
246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)// found in the LICENSE file.
446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include "ash/wm/lock_window_state.h"
646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include "ash/screen_util.h"
846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include "ash/shell.h"
946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include "ash/wm/lock_layout_manager.h"
1046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include "ash/wm/window_animations.h"
1146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include "ash/wm/window_state.h"
1246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include "ash/wm/window_state_delegate.h"
1346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include "ash/wm/window_state_util.h"
1446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include "ash/wm/window_util.h"
1546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include "ash/wm/wm_event.h"
1646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include "ui/aura/window.h"
1746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include "ui/aura/window_delegate.h"
1846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include "ui/gfx/rect.h"
1946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include "ui/keyboard/keyboard_controller.h"
2046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include "ui/keyboard/keyboard_util.h"
2146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include "ui/wm/core/window_animations.h"
2246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
2346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)namespace ash {
2446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
2546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)LockWindowState::LockWindowState(aura::Window* window)
2646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    : current_state_type_(wm::GetWindowState(window)->GetStateType()) {
2746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)}
2846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
2946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)LockWindowState::~LockWindowState() {
3046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)}
3146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
3246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)void LockWindowState::OnWMEvent(wm::WindowState* window_state,
3346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)                                const wm::WMEvent* event) {
3446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  aura::Window* window = window_state->window();
3546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  gfx::Rect bounds = window->bounds();
3646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
3746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  switch (event->type()) {
3846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    case wm::WM_EVENT_TOGGLE_FULLSCREEN:
3946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      ToggleFullScreen(window_state, window_state->delegate());
4046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      break;
4146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    case wm::WM_EVENT_FULLSCREEN:
4246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      UpdateWindow(window_state, wm::WINDOW_STATE_TYPE_FULLSCREEN);
4346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      break;
4446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    case wm::WM_EVENT_TOGGLE_MAXIMIZE_CAPTION:
4546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    case wm::WM_EVENT_TOGGLE_VERTICAL_MAXIMIZE:
4646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    case wm::WM_EVENT_TOGGLE_HORIZONTAL_MAXIMIZE:
4746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    case wm::WM_EVENT_TOGGLE_MAXIMIZE:
4846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    case wm::WM_EVENT_CENTER:
4946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    case wm::WM_EVENT_SNAP_LEFT:
5046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    case wm::WM_EVENT_SNAP_RIGHT:
5146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    case wm::WM_EVENT_NORMAL:
5246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    case wm::WM_EVENT_MAXIMIZE:
5346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      UpdateWindow(window_state,
5446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)                   GetMaximizedOrCenteredWindowType(window_state));
5546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      return;
5646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    case wm::WM_EVENT_MINIMIZE:
5746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      UpdateWindow(window_state, wm::WINDOW_STATE_TYPE_MINIMIZED);
5846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      return;
5946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    case wm::WM_EVENT_SHOW_INACTIVE:
6046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      return;
6146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    case wm::WM_EVENT_SET_BOUNDS:
626d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)      if (window_state->IsMaximized() || window_state->IsFullscreen()) {
636d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)        UpdateBounds(window_state);
646d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)      } else {
656d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)        const ash::wm::SetBoundsEvent* bounds_event =
666d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)            static_cast<const ash::wm::SetBoundsEvent*>(event);
676d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)        window_state->SetBoundsConstrained(bounds_event->requested_bounds());
686d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)      }
6946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      break;
7046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    case wm::WM_EVENT_ADDED_TO_WORKSPACE:
7146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      if (current_state_type_ != wm::WINDOW_STATE_TYPE_MAXIMIZED &&
7246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)          current_state_type_ != wm::WINDOW_STATE_TYPE_MINIMIZED &&
7346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)          current_state_type_ != wm::WINDOW_STATE_TYPE_FULLSCREEN) {
7446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)        UpdateWindow(window_state,
7546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)                     GetMaximizedOrCenteredWindowType(window_state));
7646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      }
7746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      break;
7846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    case wm::WM_EVENT_WORKAREA_BOUNDS_CHANGED:
7946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    case wm::WM_EVENT_DISPLAY_BOUNDS_CHANGED:
8046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      UpdateBounds(window_state);
8146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      break;
8246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  }
8346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)}
8446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
8546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)wm::WindowStateType LockWindowState::GetType() const {
8646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  return current_state_type_;
8746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)}
8846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
8946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)void LockWindowState::AttachState(wm::WindowState* window_state,
9046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)                                  wm::WindowState::State* previous_state) {
9146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  current_state_type_ = previous_state->GetType();
9246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
9346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  // Initialize the state to a good preset.
9446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  if (current_state_type_ != wm::WINDOW_STATE_TYPE_MAXIMIZED &&
9546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      current_state_type_ != wm::WINDOW_STATE_TYPE_MINIMIZED &&
9646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      current_state_type_ != wm::WINDOW_STATE_TYPE_FULLSCREEN) {
9746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    UpdateWindow(window_state,
9846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)                 GetMaximizedOrCenteredWindowType(window_state));
9946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  }
10046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)}
10146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
10246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)void LockWindowState::DetachState(wm::WindowState* window_state) {
10346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)}
10446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
10546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)// static
10646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)wm::WindowState* LockWindowState::SetLockWindowState(aura::Window* window) {
10746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  scoped_ptr<wm::WindowState::State> lock_state(new LockWindowState(window));
10846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  scoped_ptr<wm::WindowState::State> old_state(
10946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      wm::GetWindowState(window)->SetStateObject(lock_state.Pass()));
11046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  return wm::GetWindowState(window);
11146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)}
11246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
11346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)void LockWindowState::UpdateWindow(wm::WindowState* window_state,
11446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)                                   wm::WindowStateType target_state) {
11546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  DCHECK(target_state == wm::WINDOW_STATE_TYPE_MINIMIZED ||
11646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)         target_state == wm::WINDOW_STATE_TYPE_MAXIMIZED ||
11746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)         (target_state == wm::WINDOW_STATE_TYPE_NORMAL &&
11846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)              !window_state->CanMaximize()) ||
11946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)         target_state == wm::WINDOW_STATE_TYPE_FULLSCREEN);
12046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
12146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  if (target_state == wm::WINDOW_STATE_TYPE_MINIMIZED) {
12246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    if (current_state_type_ == wm::WINDOW_STATE_TYPE_MINIMIZED)
12346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      return;
12446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
12546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    current_state_type_ = target_state;
12646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    ::wm::SetWindowVisibilityAnimationType(
12746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)        window_state->window(), WINDOW_VISIBILITY_ANIMATION_TYPE_MINIMIZE);
12846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    window_state->window()->Hide();
12946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    if (window_state->IsActive())
13046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      window_state->Deactivate();
13146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    return;
13246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  }
13346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
13446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  if (current_state_type_ == target_state) {
13546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    // If the state type did not change, update it accordingly.
13646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    UpdateBounds(window_state);
13746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    return;
13846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  }
13946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
14046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  const wm::WindowStateType old_state_type = current_state_type_;
14146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  current_state_type_ = target_state;
14246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  window_state->UpdateWindowShowStateFromStateType();
14346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  window_state->NotifyPreStateTypeChange(old_state_type);
14446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  UpdateBounds(window_state);
14546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  window_state->NotifyPostStateTypeChange(old_state_type);
14646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
14746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  if ((window_state->window()->TargetVisibility() ||
14846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      old_state_type == wm::WINDOW_STATE_TYPE_MINIMIZED) &&
14946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      !window_state->window()->layer()->visible()) {
15046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    // The layer may be hidden if the window was previously minimized. Make
15146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    // sure it's visible.
15246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    window_state->window()->Show();
15346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  }
15446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)}
15546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
15646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)wm::WindowStateType LockWindowState::GetMaximizedOrCenteredWindowType(
15746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      wm::WindowState* window_state) {
15846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  return window_state->CanMaximize() ? wm::WINDOW_STATE_TYPE_MAXIMIZED :
15946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)                                       wm::WINDOW_STATE_TYPE_NORMAL;
16046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)}
16146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
16246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)void LockWindowState::UpdateBounds(wm::WindowState* window_state) {
1636d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  if (!window_state->IsMaximized() && !window_state->IsFullscreen())
1646d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)    return;
1656d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)
16646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  keyboard::KeyboardController* keyboard_controller =
16746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      keyboard::KeyboardController::GetInstance();
16846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  gfx::Rect keyboard_bounds;
16946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
17046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  if (keyboard_controller && !keyboard::IsKeyboardOverscrollEnabled())
17146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    keyboard_bounds = keyboard_controller->current_keyboard_bounds();
17246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
17346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  gfx::Rect bounds =
17446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      ScreenUtil::GetDisplayBoundsInParent(window_state->window());
17546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  bounds.set_height(bounds.height() - keyboard_bounds.height());
17646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  window_state->SetBoundsDirect(bounds);
17746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)}
17846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
17946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)}  // namespace ash
180