TouchEventQueue类的成员函数ForwardNextEventToRenderer首先从Touch事件队列中取出第一个Touch事件,然后调用另外一个成员函数SendTouchEventImmediately将该Touch事件发送给Render进程。
在发送的过程中,TouchEventQueue类的成员变量dispatching_touch_会被设置为true。而且会在发送结束后(也就是TouchEventQueue类的成员函数ForwardNextEventToRenderer调用结束)。恢复为false。
TouchEventQueue类的成员函数SendTouchEventImmediately的实现例如以下所看到的:
void TouchEventQueue::SendTouchEventImmediately(
const TouchEventWithLatencyInfo& touch) {
......
client_->SendTouchEventImmediately(touch);
} 这个函数定义在文件external/chromium_org/content/browser/renderer_host/input/touch_event_queue.cc中。
TouchEventQueue类的成员变量client_指向的是一个InputRouterImpl对象。这个InputRouterImpl对象就前面分析的RenderWidgetHostImpl类的成员变量input_router_所指向的InputRouterImpl对象。
TouchEventQueue类的成员函数SendTouchEventImmediately调用这个InputRouterImpl对象的成员函数SendTouchEventImmediately将参数touch描写叙述的Touch事件发送给Render进程。
InputRouterImpl类的成员函数SendTouchEventImmediately的实现例如以下所看到的:
void InputRouterImpl::SendTouchEventImmediately(
const TouchEventWithLatencyInfo& touch_event) {
......
FilterAndSendWebInputEvent(touch_event.event, touch_event.latency, false);
} 这个函数定义在文件external/chromium_org/content/browser/renderer_host/input/input_router_impl.cc中。
从这里能够看到,InputRouterImpl类的成员函数SendTouchEventImmediately是调用我们前面已经分析过的另外一个成员函数FilterAndSendWebInputEvent将参数touch_event描写叙述的Touch事件发送给Render进程的。从前面的分析能够知道,这个Touch事件封装在一个类型为WebInputEvent::TouchMove的WebInputEvent对象中,它的发送过程与前面分析的滑动手势操作和捏合手势操作的发送过程是一样的,只只是后两者分别封装在类型为WebInputEvent::GestureScrollUpdate和WebInputEvent::GesturePinchUpdate的WebInputEvent对象中。
至此,我们就以Touch事件为例。分析完毕了Browser进程捕捉网页输入事件,以及从中检测手势操作的过程。这些网页输入事件和手势操作都是通过类型为InputMsg_HandleInputEvent的IPC消息发送给Render进程处理的。在接下来的两篇文章中。我们就具体分析Render进程处理网页输入事件和手势操作的过程。也就是Render进程处理类型为InputMsg_HandleInputEvent的IPC消息的过程,敬请关注!
很多其他的信息也能够关注老罗的新浪微博:。
本文来自电脑杂谈,转载请注明本文网址:
https://www.pc-fly.com/a/jisuanjixue/article-81055-25.html
球员们感觉自己的压力更大了
他必须在全球政治军事经济利益中角逐
炸了
加油~~永远支持三只