Upstream version 5.34.104.0
[platform/framework/web/crosswalk.git] / src / ash / wm / resize_handle_window_targeter.cc
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.
4
5 #include "ash/wm/resize_handle_window_targeter.h"
6
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"
11
12 namespace ash {
13
14 ResizeHandleWindowTargeter::ResizeHandleWindowTargeter(
15     aura::Window* window,
16     ImmersiveFullscreenController* controller)
17     : window_(window),
18       immersive_controller_(controller) {
19   wm::WindowState* window_state = wm::GetWindowState(window_);
20   OnPostWindowShowTypeChange(window_state, wm::SHOW_TYPE_DEFAULT);
21   window_state->AddObserver(this);
22   window_->AddObserver(this);
23 }
24
25 ResizeHandleWindowTargeter::~ResizeHandleWindowTargeter() {
26   if (window_) {
27     window_->RemoveObserver(this);
28     wm::GetWindowState(window_)->RemoveObserver(this);
29   }
30 }
31
32 void ResizeHandleWindowTargeter::OnPostWindowShowTypeChange(
33     wm::WindowState* window_state,
34     wm::WindowShowType old_type) {
35   if (window_state->IsMaximizedOrFullscreen()) {
36     frame_border_inset_ = gfx::Insets();
37   } else {
38     frame_border_inset_ = gfx::Insets(kResizeInsideBoundsSize,
39                                       kResizeInsideBoundsSize,
40                                       kResizeInsideBoundsSize,
41                                       kResizeInsideBoundsSize);
42   }
43 }
44
45 void ResizeHandleWindowTargeter::OnWindowDestroying(aura::Window* window) {
46   CHECK_EQ(window_, window);
47   wm::GetWindowState(window_)->RemoveObserver(this);
48   window_ = NULL;
49 }
50
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_) {
56     gfx::Insets insets;
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
65       // being generated.
66       insets = gfx::Insets(kImmersiveFullscreenTopEdgeInset, 0, 0, 0);
67     } else {
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_;
71     }
72
73     if (!insets.empty()) {
74       gfx::Rect bounds = gfx::Rect(window_->bounds().size());
75       bounds.Inset(insets);
76       if (!bounds.Contains(event->location()))
77         return window_;
78     }
79   }
80   return aura::WindowTargeter::FindTargetForLocatedEvent(root, event);
81 }
82
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
88     // receive the event.
89     ui::EventTarget* parent = target->GetParentTarget();
90     if (parent) {
91       ui::EventTargeter* targeter = parent->GetEventTargeter();
92       if (targeter)
93         return targeter->SubtreeShouldBeExploredForEvent(target, event);
94     }
95   }
96   return aura::WindowTargeter::SubtreeShouldBeExploredForEvent(target, event);
97 }
98
99 }  // namespace ash