etWindowRegion函数的实现如下:
QRegion QWSServer::setWindowRegion( QWSWindow* changingw, QRegion r )
{
QRegion exposed;
if (changingw) {
changingw->requested_region = r;
r = r - serverRegion; //exposed不为空则有显示区域被释放
exposed = changingw->allocation() - r; //低等级窗体增加可见区域
} else {
exposed = serverRegion-r;
serverRegion = r;
}
QRegion extra_allocation;
int windex = -1;
bool deeper = changingw == 0;
for (uint i=0; i<windows.count(); i++) {
QWSWindow* w = windows.at(i);
if ( w == changingw ) {
windex = i;
extra_allocation = r - w->allocation(); //如果extra_allocation不为空
deeper = TRUE; //需要增加新的新的显示区域
} else if ( deeper ) {
w->removeAllocation(rgnMan, r);//低优先级窗体去掉被覆盖的区域
r -= w->allocation();//如果r为空 则更低优先级的窗体被完全覆盖
} else { //如果窗体是第一次调用Show 直接走这
//higher windows
r -= w->allocation();//如果r为空 则窗体被高优先级窗体完全覆盖
}
if ( r.isEmpty() ) { //窗体被完全覆盖
break; // Nothing left for deeper windows
}
}
...................
if ( changingw && !changingw->requested_region.isEmpty() )
changingw->addAllocation( rgnMan, extra_allocation & screenRegion );
//为changingw窗体增加新的可见区域 置modifed标志为TRUE
else if ( !disablePainting )
paintServerRegion();
exposeRegion( exposed, windex+1 );//增加低级窗体可见区域。
return exposed;
}
注:增加新的显示区域不一定是整个显示区域的面积增大了,而是显示区域的块变多了。 一个显示区域可能由多个不连续和连续的Region组成。
void QWSServer::exposeRegion( QRegion r, int start )
{
r &= screenRegion;
for (uint i=start; i<windows.count(); i++) {
if ( r.isEmpty() ) //可见区域为空
break; // Nothing left for deeper windows
QWSWindow* w = windows.at(i);
w->addAllocation( rgnMan, r ); //增加新的可见区域 置modifed标志为TRUE
r -= w->allocation(); //r 更低级窗体可见区域
}
dirtyBackground |= r; //得到需要刷新的背景区域 如果r为空 则新增区域为0
}
exposeRegion为低等级窗体增加可见区域。
顶
0