blob: 1929c4283c1cc0ae74e7022d9da1f0851ec99c79 [file] [log] [blame]
// Copyright 2017 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "ash/wm/base_state.h"
#include "ash/public/cpp/window_state_type.h"
#include "ash/wm/window_animation_types.h"
#include "ash/wm/wm_event.h"
#include "ui/aura/client/aura_constants.h"
#include "ui/aura/window.h"
namespace ash {
namespace wm {
namespace {
bool IsMinimizedWindowState(const mojom::WindowStateType state_type) {
return state_type == mojom::WindowStateType::MINIMIZED;
}
} // namespace
BaseState::BaseState(mojom::WindowStateType initial_state_type)
: state_type_(initial_state_type) {}
BaseState::~BaseState() = default;
void BaseState::OnWMEvent(WindowState* window_state, const WMEvent* event) {
if (event->IsWorkspaceEvent()) {
HandleWorkspaceEvents(window_state, event);
return;
}
if ((window_state->IsTrustedPinned() || window_state->IsPinned()) &&
(event->type() != WM_EVENT_NORMAL && event->IsTransitionEvent())) {
// PIN state can be exited only by normal event.
return;
}
if (event->IsCompoundEvent()) {
HandleCompoundEvents(window_state, event);
return;
}
if (event->IsBoundsEvent()) {
HandleBoundsEvents(window_state, event);
return;
}
DCHECK(event->IsTransitionEvent());
HandleTransitionEvents(window_state, event);
}
mojom::WindowStateType BaseState::GetType() const {
return state_type_;
}
// static
mojom::WindowStateType BaseState::GetStateForTransitionEvent(
const WMEvent* event) {
switch (event->type()) {
case WM_EVENT_NORMAL:
return mojom::WindowStateType::NORMAL;
case WM_EVENT_MAXIMIZE:
return mojom::WindowStateType::MAXIMIZED;
case WM_EVENT_MINIMIZE:
return mojom::WindowStateType::MINIMIZED;
case WM_EVENT_FULLSCREEN:
return mojom::WindowStateType::FULLSCREEN;
case WM_EVENT_SNAP_LEFT:
return mojom::WindowStateType::LEFT_SNAPPED;
case WM_EVENT_SNAP_RIGHT:
return mojom::WindowStateType::RIGHT_SNAPPED;
case WM_EVENT_SHOW_INACTIVE:
return mojom::WindowStateType::INACTIVE;
case WM_EVENT_PIN:
return mojom::WindowStateType::PINNED;
case WM_EVENT_TRUSTED_PIN:
return mojom::WindowStateType::TRUSTED_PINNED;
default:
break;
}
#if !defined(NDEBUG)
if (event->IsWorkspaceEvent())
NOTREACHED() << "Can't get the state for Workspace event" << event->type();
if (event->IsCompoundEvent())
NOTREACHED() << "Can't get the state for Compound event:" << event->type();
if (event->IsBoundsEvent())
NOTREACHED() << "Can't get the state for Bounds event:" << event->type();
#endif
return mojom::WindowStateType::NORMAL;
}
void BaseState::UpdateMinimizedState(
WindowState* window_state,
mojom::WindowStateType previous_state_type) {
aura::Window* window = window_state->window();
if (window_state->IsMinimized()) {
// Save the previous show state when it is not minimized so that we can
// correctly restore it after exiting the minimized mode.
if (previous_state_type != mojom::WindowStateType::MINIMIZED) {
window->SetProperty(aura::client::kPreMinimizedShowStateKey,
ToWindowShowState(previous_state_type));
}
::wm::SetWindowVisibilityAnimationType(
window, WINDOW_VISIBILITY_ANIMATION_TYPE_MINIMIZE);
window->Hide();
if (window_state->IsActive())
window_state->Deactivate();
} else if ((window->layer()->GetTargetVisibility() ||
IsMinimizedWindowState(previous_state_type)) &&
!window->layer()->visible()) {
// The layer may be hidden if the window was previously minimized. Make
// sure it's visible.
window->Show();
if (IsMinimizedWindowState(previous_state_type) &&
!window_state->IsMaximizedOrFullscreenOrPinned()) {
window_state->set_unminimize_to_restore_bounds(false);
}
}
}
} // namespace wm
} // namespace ash