blob: 7707c2d2df77643da645bd8d1f932e0ff762e0df [file] [log] [blame]
// 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 <algorithm>
#include "services/ws/public/mojom/window_tree_constants.mojom.h"
#include "ui/aura/client/aura_constants.h"
#include "ui/aura/client/transient_window_client.h"
#include "ui/aura/window.h"
#include "ui/events/event.h"
#include "ui/gfx/geometry/insets.h"
namespace wm {
EasyResizeWindowTargeter::EasyResizeWindowTargeter(
const gfx::Insets& mouse_extend,
const gfx::Insets& touch_extend) {
SetInsets(mouse_extend, touch_extend);
}
EasyResizeWindowTargeter::~EasyResizeWindowTargeter() {}
bool EasyResizeWindowTargeter::EventLocationInsideBounds(
aura::Window* target,
const ui::LocatedEvent& event) const {
return WindowTargeter::EventLocationInsideBounds(target, event);
}
bool EasyResizeWindowTargeter::ShouldUseExtendedBounds(
const aura::Window* w) const {
DCHECK(window());
// Use the extended bounds only for immediate child windows of window().
// Use the default targeter otherwise.
if (w->parent() != window())
return false;
// Only resizable windows benefit from the extended hit-test region.
if ((w->GetProperty(aura::client::kResizeBehaviorKey) &
ws::mojom::kResizeBehaviorCanResize) == 0) {
return false;
}
// For transient children use extended bounds if a transient parent or if
// transient parent's parent is a top level window in window().
aura::client::TransientWindowClient* transient_window_client =
aura::client::GetTransientWindowClient();
const aura::Window* transient_parent =
transient_window_client ? transient_window_client->GetTransientParent(w)
: nullptr;
return !transient_parent || transient_parent == window() ||
transient_parent->parent() == window();
}
} // namespace wm