1 // Copyright 2014 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.
5 #include "ash/wm/resize_handle_window_targeter.h"
7 #include "ash/ash_constants.h"
8 #include "ash/wm/immersive_fullscreen_controller.h"
9 #include "ash/wm/window_state.h"
10 #include "ui/aura/window.h"
14 ResizeHandleWindowTargeter::ResizeHandleWindowTargeter(
16 ImmersiveFullscreenController
* controller
)
18 immersive_controller_(controller
) {
19 wm::WindowState
* window_state
= wm::GetWindowState(window_
);
20 OnPostWindowStateTypeChange(window_state
, wm::WINDOW_STATE_TYPE_DEFAULT
);
21 window_state
->AddObserver(this);
22 window_
->AddObserver(this);
25 ResizeHandleWindowTargeter::~ResizeHandleWindowTargeter() {
27 window_
->RemoveObserver(this);
28 wm::GetWindowState(window_
)->RemoveObserver(this);
32 void ResizeHandleWindowTargeter::OnPostWindowStateTypeChange(
33 wm::WindowState
* window_state
,
34 wm::WindowStateType old_type
) {
35 if (window_state
->IsMaximizedOrFullscreen()) {
36 frame_border_inset_
= gfx::Insets();
38 frame_border_inset_
= gfx::Insets(kResizeInsideBoundsSize
,
39 kResizeInsideBoundsSize
,
40 kResizeInsideBoundsSize
,
41 kResizeInsideBoundsSize
);
45 void ResizeHandleWindowTargeter::OnWindowDestroying(aura::Window
* window
) {
46 CHECK_EQ(window_
, window
);
47 wm::GetWindowState(window_
)->RemoveObserver(this);
51 ui::EventTarget
* ResizeHandleWindowTargeter::FindTargetForLocatedEvent(
52 ui::EventTarget
* root
,
53 ui::LocatedEvent
* event
) {
54 aura::Window
* window
= static_cast<aura::Window
*>(root
);
55 if (window
== window_
) {
57 if (immersive_controller_
&& immersive_controller_
->IsEnabled() &&
58 !immersive_controller_
->IsRevealed() &&
59 event
->IsTouchEvent()) {
60 // If the window is in immersive fullscreen, and top-of-window views are
61 // not revealed, then touch events towards the top of the window
62 // should not reach the child window so that touch gestures can be used to
63 // reveal the top-of-windows views. This is needed because the child
64 // window may consume touch events and prevent touch-scroll gesture from
66 insets
= gfx::Insets(kImmersiveFullscreenTopEdgeInset
, 0, 0, 0);
68 // If the event falls very close to the inside of the frame border, then
69 // target the window itself, so that the window can be resized easily.
70 insets
= frame_border_inset_
;
73 if (!insets
.empty()) {
74 gfx::Rect bounds
= gfx::Rect(window_
->bounds().size());
76 if (!bounds
.Contains(event
->location()))
80 return aura::WindowTargeter::FindTargetForLocatedEvent(root
, event
);
83 bool ResizeHandleWindowTargeter::SubtreeShouldBeExploredForEvent(
84 ui::EventTarget
* target
,
85 const ui::LocatedEvent
& event
) {
86 if (target
== window_
) {
87 // Defer to the parent's targeter on whether |window_| should be able to
89 ui::EventTarget
* parent
= target
->GetParentTarget();
91 ui::EventTargeter
* targeter
= parent
->GetEventTargeter();
93 return targeter
->SubtreeShouldBeExploredForEvent(target
, event
);
96 return aura::WindowTargeter::SubtreeShouldBeExploredForEvent(target
, event
);