客户端对RegionModifyEvent的处理。
客户端接收到消息后会调用translateRegionModifiedEvent函数来进行处理
bool QETWidget::translateRegionModifiedEvent( const QWSRegionModifiedEvent *event )
{
QWSRegionManager *rgnMan = qt_fbdpy->regionManager();
if ( alloc_region_index < 0 ) {
alloc_region_index = rgnMan->find( winId() ); //从共享内存中得到region索引
if ( alloc_region_index < 0 ) {
return FALSE;
}
}
QWSDisplay::grab();
int revision = *rgnMan->revision( alloc_region_index );
if ( revision != alloc_region_revision ) {
alloc_region_revision = revision;
QRegion newRegion = rgnMan->region( alloc_region_index );//得到显示区域
QWSDisplay::ungrab();
alloc_region = newRegion;
// set children's allocated region dirty
................
} else {
QWSDisplay::ungrab();
}
if ( event->simpleData.nrectangles )
{ // alloc_region >= exposed
QRegion exposed; //需要刷新区域的大小
exposed.setRects( event->rectangles, event->simpleData.nrectangles );
QSize s( qt_screen->deviceWidth(), qt_screen->deviceHeight() );
exposed = qt_screen->mapFromDevice( exposed, s );
qwsUpdateActivePainters();
repaintDecoration( exposed, FALSE );//绘制窗体的一些修饰如边框,caption等
repaintHierarchy( exposed, FALSE ); //绘制窗体显示区域及子窗体通过发送
} //PaintEvent事件到各窗体
qws_regionRequest = FALSE;
return TRUE;
}
repaintHierarchy函数中所有需要刷新的子窗体都会收到Paint事件。在Paint事件中,开始绘图。显示中只刷新exposed这个区域而不是将分配的区域alloc_region 全部刷新一次,这样做可以提高效率。
二:QWSDdisplay::setAltitude 的处理
invokeSetAltitude(const QWSChangeAltitudeCommand *cmd,
QWSClient *client)
{
int winId = cmd->simpleData.windowid;
int alt = cmd->simpleData.altitude;
bool fixed = cmd->simpleData.fixed;
...................
QWSWindow* changingw = findWindow(winId, 0);
...................
changingw->setNeedAck( TRUE );
if ( fixed && alt >= 1) {
changingw->onTop = TRUE;
}
if ( alt < 0 )
lowerWindow( changingw, alt ); //窗体优先级下降
else
raiseWindow( changingw, alt ); // 提升窗体优先级
if ( !changingw->forClient(client) ) {
refresh();
}
}
invokeSetAltitude通过调用lowerWindow,raiseWindow来调整窗体的优先级,如果一个Widget被显示,即调用Show此时alt == 0; 如果alt == 1则此窗体应该为最上层,如果alt == 2则窗体位FULL-SCREEN即全屏显示的窗体,可以通过setWFlags(WStyle_StaysOnTop) 来设定这个属性。 优先级较高的窗体将被优先显示, 在没有显式通过SetRegionPriority命令来改变窗体优先级的话,在Windows Stack中窗体将按照后进的优先级较高为原则。 可以参考 insertPrioritizedWindow函数,在qt-embedded-free-3.3.6 可能没有这个函数,因为在这个版本中不存在窗体优先级,除了WStyle_StaysOnTop属性的窗体为第一级优先级外,其他窗体都按照后进的优先为原则。
三:QWSDisplay::requestFocus 的处理请参考invokeSetFocus函数。