|
我原来直观的以为(发文之时纠正过来),gtk的widget是通过调用gdk_draw_line之类的函数来完成的。其实,为了支持theme engine以及为了减少theme跟gdk层之间的耦合。Gtk的设计上所有的widget都是通过gtk_paint_box之类的函数画出来的。而这些函数其实只是GtkStyleClass的函数指针,其真正的实现处于每个theme engine之中。
通过这样一种架构,gdk和gtk之间的耦合也减少了,对gdk层的调用就只涉及到了跟窗口系统相关的功能,如窗口的大小,位置的改变,窗口的stack顺序的改变,最大化,最小化这些。而具体绘制widget的工作就交给了theme engine。这些个engine就可以由艺术家们精心打造,也可以让技术精英们施展各种各样强大的技术手段。比如cairo,opengl等等。
这是个相当好的设计,可惜的是,gtk本身却画蛇添足的增加了一些针对不同widget的style property例如gtkbutton的inner-border等等,这些东西的加入,束缚了艺术家们的思想,他们用theme画出的东西,往往因为这些个属性的变化而得到了不好的结果。
还有一个不够革命的地方是,widget里面的text仍然是gtk自己去画的。而theme则无权去干涉,似乎也准备让艺术家们继续戴脚镣跳舞。
就没有完美的东西,缺憾只能在人们包括我们自己不断的努力中再加以完善,历史上人类靠此而进步。 |
|