Webkit Painting and Event Flow 绘屏和事件 探讨

 

    WebKit来自khtml, 以前khtml中, 整个页面是一个大qscrollview, 网页上的控制元素就是Qt里的控件, 可能是为了移植方面原因, 现在webkit中没有用传统的控件概念来实现网页上的button等元素, 而是把控件的两个主要功能分离出来, (painting 和 事件响应 ) 各走一套接口和platform对接.  Webkit自己来完成整个 事件-响应-绘图 的逻辑. 对于移植来说, 这自然是一个很好的构架, 不用深入内部, 只要把两头接口做好就OK了: 丢进去事件, 等待WebKit来调用paint函数.


事件

 

    为了理清楚事件的流程, 我用gdb来帮忙. 在浩如烟海的的代码中找到一两个流程的必经之地, 设置断点, 再用backtrace倒过来看WebKit是怎么跑到这个函数的.

 

以浏览网页最常见的一个操作为例, 点击链接打开新页面. 事件的传播流程如下:

 

 

这个过程得到点击处的RenderObject, 如果该对象isLinke() 那么再触发打开连接的事件. 至于打开链接的流程这里先不涉及了.

 

 

 

Painting

 

相关的文件最主要的两个:

RenderTheme.h/cpp
RenderThemeQt.h/cpp

 

RenderTheme 是关键的一个类.
RenderThemeQt继承了它, 重载了很多虚函数, 这些虚函数用来进行具体的绘制工作比如:


以paintButton()为例, 传进去的的参数包含了:
PaintInfo: 屏幕的buffer(QPainterDevice), 相当于画布,
IntRect: 绘制的区域
在指定的区域内, 就可以用QPainter来画button了. 至于是windows风格的还是mac水晶风格的, 还是简单的画个长方体, 那就任由发挥了.

 

 

 



上面是一些控件的流程, 常见的Text对象走的是另外一条路, 大概的backtrace如下:

 

 

备注:

WebKit版本是r39370.

Platform: Qt

 

 

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值