| // Copyright 2014 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 "ui/wm/core/easy_resize_window_targeter.h" |
| |
| #include "ui/aura/window.h" |
| #include "ui/gfx/geometry/insets_f.h" |
| #include "ui/gfx/geometry/rect.h" |
| #include "ui/wm/public/transient_window_client.h" |
| |
| namespace wm { |
| |
| EasyResizeWindowTargeter::EasyResizeWindowTargeter( |
| aura::Window* container, |
| const gfx::Insets& mouse_extend, |
| const gfx::Insets& touch_extend) |
| : container_(container), |
| mouse_extend_(mouse_extend), |
| touch_extend_(touch_extend) { |
| } |
| |
| EasyResizeWindowTargeter::~EasyResizeWindowTargeter() { |
| } |
| |
| bool EasyResizeWindowTargeter::EventLocationInsideBounds( |
| ui::EventTarget* target, |
| const ui::LocatedEvent& event) const { |
| aura::Window* window = static_cast<aura::Window*>(target); |
| if (ShouldUseExtendedBounds(window)) { |
| // Note that |event|'s location is in |window|'s parent's coordinate system, |
| // so convert it to |window|'s coordinate system first. |
| gfx::Point point = event.location(); |
| if (window->parent()) |
| aura::Window::ConvertPointToTarget(window->parent(), window, &point); |
| |
| gfx::Rect bounds(window->bounds().size()); |
| if (event.IsTouchEvent() || event.IsGestureEvent()) |
| bounds.Inset(touch_extend_); |
| else |
| bounds.Inset(mouse_extend_); |
| |
| return bounds.Contains(point); |
| } |
| return WindowTargeter::EventLocationInsideBounds(window, event); |
| } |
| |
| bool EasyResizeWindowTargeter::ShouldUseExtendedBounds( |
| const aura::Window* window) const { |
| // Use the extended bounds only for immediate child windows of |container_|. |
| // Use the default targetter otherwise. |
| if (window->parent() != container_) |
| return false; |
| |
| aura::client::TransientWindowClient* transient_window_client = |
| aura::client::GetTransientWindowClient(); |
| return !transient_window_client || |
| !transient_window_client->GetTransientParent(window) || |
| transient_window_client->GetTransientParent(window) == container_; |
| } |
| |
| } // namespace wm |