#include "ui/views/widget/root_view_targeter.h"
#include "ui/views/view.h"
#include "ui/views/view_targeter_delegate.h"
#include "ui/views/views_switches.h"
#include "ui/views/widget/root_view.h"
#include "ui/views/widget/widget.h"
namespace views {
RootViewTargeter::RootViewTargeter(ViewTargeterDelegate* delegate,
internal::RootView* root_view)
: ViewTargeter(delegate), root_view_(root_view) {}
RootViewTargeter::~RootViewTargeter() = default;
View* RootViewTargeter::FindTargetForGestureEvent(
View* root,
const ui::GestureEvent& gesture) {
CHECK_EQ(root, root_view_);
if (root_view_->gesture_handler_) {
CHECK(root_view_->gesture_handler_set_before_processing_);
return root_view_->gesture_handler_;
}
gfx::Rect rect(gesture.location(), gfx::Size(1, 1));
if (!gesture.details().bounding_box().IsEmpty()) {
rect.set_size(gesture.details().bounding_box().size());
rect.Offset(-rect.width() / 2, -rect.height() / 2);
}
return root->GetEffectiveViewTargeter()->TargetForRect(root, rect);
}
ui::EventTarget* RootViewTargeter::FindNextBestTargetForGestureEvent(
ui::EventTarget* previous_target,
const ui::GestureEvent& gesture) {
if (gesture.type() == ui::EventType::kGestureEnd) {
return nullptr;
}
if (root_view_->gesture_handler_set_before_processing_ &&
gesture.type() != ui::EventType::kGestureScrollBegin) {
return nullptr;
}
if (!root_view_->gesture_handler_) {
return nullptr;
}
return previous_target->GetParentTarget();
}
}