mirror of
https://github.com/flutter/flutter.git
synced 2026-02-20 02:29:02 +08:00
Recognize gestures from mice
After this CL, we first convert from mojo::Event to blink::WebInputEvent before feeding the event to the gesture recognizer. That means we process touch and mouse events in the same way (because they are both represented as pointer events). As a result, we now recognize scroll and fling gestures from mice. R=eseidel@chromium.org Review URL: https://codereview.chromium.org/888773002
This commit is contained in:
parent
77e5182631
commit
910cd08c89
@ -73,6 +73,32 @@ mojo::Target WebNavigationPolicyToNavigationTarget(
|
||||
}
|
||||
}
|
||||
|
||||
ui::EventType ConvertEventTypeToUIEventType(blink::WebInputEvent::Type type) {
|
||||
if (type == blink::WebInputEvent::PointerDown)
|
||||
return ui::ET_TOUCH_PRESSED;
|
||||
if (type == blink::WebInputEvent::PointerUp)
|
||||
return ui::ET_TOUCH_RELEASED;
|
||||
if (type == blink::WebInputEvent::PointerMove)
|
||||
return ui::ET_TOUCH_MOVED;
|
||||
DCHECK(type == blink::WebInputEvent::PointerCancel);
|
||||
return ui::ET_TOUCH_CANCELLED;
|
||||
}
|
||||
|
||||
scoped_ptr<ui::TouchEvent> ConvertToUITouchEvent(
|
||||
const blink::WebInputEvent& event,
|
||||
float device_pixel_ratio) {
|
||||
if (!blink::WebInputEvent::isPointerEventType(event.type))
|
||||
return nullptr;
|
||||
const blink::WebPointerEvent& pointer_event =
|
||||
static_cast<const blink::WebPointerEvent&>(event);
|
||||
return make_scoped_ptr(new ui::TouchEvent(
|
||||
ConvertEventTypeToUIEventType(event.type),
|
||||
gfx::PointF(pointer_event.x * device_pixel_ratio,
|
||||
pointer_event.y * device_pixel_ratio),
|
||||
pointer_event.pointer,
|
||||
base::TimeDelta::FromMillisecondsD(pointer_event.timeStampMS)));
|
||||
}
|
||||
|
||||
} // namespace
|
||||
|
||||
static int s_next_debugger_id = 1;
|
||||
@ -304,31 +330,32 @@ void DocumentView::OnViewDestroyed(mojo::View* view) {
|
||||
root_ = nullptr;
|
||||
}
|
||||
|
||||
bool DocumentView::DispatchInputEvent(const mojo::EventPtr& event) {
|
||||
scoped_ptr<blink::WebInputEvent> web_event =
|
||||
ConvertEvent(event, GetDevicePixelRatio());
|
||||
return web_event && web_view_->handleInputEvent(*web_event);
|
||||
}
|
||||
|
||||
void DocumentView::OnViewInputEvent(
|
||||
mojo::View* view, const mojo::EventPtr& event) {
|
||||
float device_pixel_ratio = GetDevicePixelRatio();
|
||||
scoped_ptr<blink::WebInputEvent> web_event =
|
||||
ConvertEvent(event, device_pixel_ratio);
|
||||
if (!web_event)
|
||||
return;
|
||||
|
||||
scoped_ptr<ui::Event> ui_event(event.To<scoped_ptr<ui::Event>>());
|
||||
ui::TouchEvent* touch_event = nullptr;
|
||||
if (ui_event->IsTouchEvent()) {
|
||||
touch_event = static_cast<ui::TouchEvent*>(ui_event.get());
|
||||
ui::GestureRecognizer::Get()->ProcessTouchEventPreDispatch(
|
||||
*touch_event, this);
|
||||
}
|
||||
ui::GestureRecognizer* recognizer = ui::GestureRecognizer::Get();
|
||||
scoped_ptr<ui::TouchEvent> touch_event =
|
||||
ConvertToUITouchEvent(*web_event, device_pixel_ratio);
|
||||
if (touch_event)
|
||||
recognizer->ProcessTouchEventPreDispatch(*touch_event, this);
|
||||
|
||||
bool handled = DispatchInputEvent(event);
|
||||
bool handled = web_view_->handleInputEvent(*web_event);
|
||||
|
||||
if (touch_event) {
|
||||
ui::EventResult result = handled ? ui::ER_UNHANDLED : ui::ER_UNHANDLED;
|
||||
if (auto gestures = ui::GestureRecognizer::Get()->ProcessTouchEventPostDispatch(
|
||||
*touch_event, result, this)) {
|
||||
for (auto& gesture : *gestures)
|
||||
DispatchInputEvent(mojo::Event::From(*gesture));
|
||||
if (auto gestures = recognizer->ProcessTouchEventPostDispatch(
|
||||
*touch_event, result, this)) {
|
||||
for (auto& gesture : *gestures) {
|
||||
scoped_ptr<blink::WebInputEvent> gesture_event =
|
||||
ConvertEvent(mojo::Event::From(*gesture), device_pixel_ratio);
|
||||
if (gesture_event)
|
||||
web_view_->handleInputEvent(*gesture_event);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -123,8 +123,6 @@ class DocumentView : public blink::ServiceProvider,
|
||||
void OnViewDestroyed(mojo::View* view) override;
|
||||
void OnViewInputEvent(mojo::View* view, const mojo::EventPtr& event) override;
|
||||
|
||||
bool DispatchInputEvent(const mojo::EventPtr& event);
|
||||
|
||||
void Load(mojo::URLResponsePtr response);
|
||||
float GetDevicePixelRatio() const;
|
||||
scoped_ptr<Rasterizer> CreateRasterizer();
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user