This fixes up the last known remaining issues with the update code. It works perfectly now.
git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@12197 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
+47
-44
@@ -535,42 +535,40 @@ void Layer::RequestDraw(const BRegion ®, Layer *startFrom)
|
|||||||
if (!startFrom)
|
if (!startFrom)
|
||||||
redraw = true;
|
redraw = true;
|
||||||
|
|
||||||
|
if (HasClient() && IsTopLayer())
|
||||||
|
{
|
||||||
|
// calculate the minimum region/rectangle to be updated with
|
||||||
|
// a single message to the client.
|
||||||
|
fUpdateReg = fFullVisible;
|
||||||
|
if (fFlags & B_FULL_UPDATE_ON_RESIZE
|
||||||
|
&& fFrameAction == B_LAYER_ACTION_RESIZE)
|
||||||
|
{
|
||||||
|
// do nothing
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
fUpdateReg.IntersectWith(®);
|
||||||
|
}
|
||||||
|
if (fUpdateReg.CountRects() > 0)
|
||||||
|
{
|
||||||
|
if (!fOwner->fInUpdate)
|
||||||
|
{
|
||||||
|
fOwner->prevInvalid = fUpdateReg;
|
||||||
|
SendUpdateMsg();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
fOwner->zUpdateReg.Include(&fUpdateReg);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (fVisible.CountRects() > 0)
|
if (fVisible.CountRects() > 0)
|
||||||
{
|
{
|
||||||
// client side drawing. Send only one UPDATE message!
|
// client side drawing. Send only one UPDATE message!
|
||||||
if (HasClient())
|
if (HasClient())
|
||||||
{
|
{
|
||||||
if (IsTopLayer())
|
// calculate the update region
|
||||||
{
|
|
||||||
// calculate the minimum region/rectangle to be updated with
|
|
||||||
// a single message to the client.
|
|
||||||
fUpdateReg = fFullVisible;
|
|
||||||
if (fFlags & B_FULL_UPDATE_ON_RESIZE
|
|
||||||
&& fFrameAction == B_LAYER_ACTION_RESIZE)
|
|
||||||
{
|
|
||||||
// do nothing
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
fUpdateReg.IntersectWith(®);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (fUpdateReg.CountRects() > 0)
|
|
||||||
{
|
|
||||||
if (!fOwner->fInUpdate)
|
|
||||||
{
|
|
||||||
fOwner->prevInvalid = fUpdateReg;
|
|
||||||
SendUpdateMsg();
|
|
||||||
}
|
|
||||||
else
|
|
||||||
fOwner->zUpdateReg.Include(&fUpdateReg);
|
|
||||||
}
|
|
||||||
|
|
||||||
// we're not that different than other. We too have an
|
|
||||||
// update region to which our drawing is restrincted.
|
|
||||||
}
|
|
||||||
|
|
||||||
// calculate the update region, then...
|
|
||||||
fUpdateReg = fVisible;
|
fUpdateReg = fVisible;
|
||||||
if (fFlags & B_FULL_UPDATE_ON_RESIZE
|
if (fFlags & B_FULL_UPDATE_ON_RESIZE
|
||||||
&& fFrameAction == B_LAYER_ACTION_RESIZE)
|
&& fFrameAction == B_LAYER_ACTION_RESIZE)
|
||||||
@@ -586,9 +584,11 @@ void Layer::RequestDraw(const BRegion ®, Layer *startFrom)
|
|||||||
{
|
{
|
||||||
// clear background with viewColor.
|
// clear background with viewColor.
|
||||||
fDriver->ConstrainClippingRegion(&fUpdateReg);
|
fDriver->ConstrainClippingRegion(&fUpdateReg);
|
||||||
|
// RGBColor c(rand()%255,rand()%255,rand()%255);
|
||||||
|
// fDriver->FillRect(fUpdateReg.Frame(), c);
|
||||||
fDriver->FillRect(fUpdateReg.Frame(), fLayerData->viewcolor);
|
fDriver->FillRect(fUpdateReg.Frame(), fLayerData->viewcolor);
|
||||||
fDriver->ConstrainClippingRegion(NULL);
|
fDriver->ConstrainClippingRegion(NULL);
|
||||||
SendUpdateMsg();
|
fUpdateReg.MakeEmpty();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
@@ -681,9 +681,9 @@ void Layer::UpdateEnd()
|
|||||||
wb->zUpdateReg.Exclude(&wb->prevInvalid);
|
wb->zUpdateReg.Exclude(&wb->prevInvalid);
|
||||||
if (wb->zUpdateReg.CountRects() > 0)
|
if (wb->zUpdateReg.CountRects() > 0)
|
||||||
{
|
{
|
||||||
wb->prevInvalid = wb->zUpdateReg;
|
BRegion reg(wb->zUpdateReg);
|
||||||
fUpdateReg = wb->zUpdateReg;
|
wb->RequestDraw(reg, NULL);
|
||||||
SendUpdateMsg();
|
wb->zUpdateReg.MakeEmpty();
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
wb->prevInvalid.MakeEmpty();
|
wb->prevInvalid.MakeEmpty();
|
||||||
@@ -1154,6 +1154,11 @@ void Layer::move_layer(float x, float y)
|
|||||||
|
|
||||||
BPoint pt(x,y);
|
BPoint pt(x,y);
|
||||||
BRect rect(fFull.Frame().OffsetByCopy(pt));
|
BRect rect(fFull.Frame().OffsetByCopy(pt));
|
||||||
|
if (fClassID == AS_WINBORDER_CLASS)
|
||||||
|
{
|
||||||
|
WinBorder *wb = (WinBorder*)this;
|
||||||
|
wb->prevInvalid.OffsetBy(x, y);
|
||||||
|
}
|
||||||
|
|
||||||
fParent->StartRebuildRegions(BRegion(rect), this, B_LAYER_MOVE, pt);
|
fParent->StartRebuildRegions(BRegion(rect), this, B_LAYER_MOVE, pt);
|
||||||
fDriver->CopyRegionList(&fRootLayer->fCopyRegList,
|
fDriver->CopyRegionList(&fRootLayer->fCopyRegList,
|
||||||
@@ -1477,16 +1482,14 @@ void Layer::SendViewMovedMsg()
|
|||||||
//! Sends an _UPDATE_ message to the client BWindow
|
//! Sends an _UPDATE_ message to the client BWindow
|
||||||
void Layer::SendUpdateMsg()
|
void Layer::SendUpdateMsg()
|
||||||
{
|
{
|
||||||
if( fServerWin )
|
BMessage msg;
|
||||||
{
|
msg.what = _UPDATE_;
|
||||||
BMessage msg;
|
msg.AddRect("_rect", ConvertFromTop(fUpdateReg.Frame()) );
|
||||||
msg.what = _UPDATE_;
|
msg.AddRect("debug_rect", fUpdateReg.Frame() );
|
||||||
msg.AddRect("_rect", ConvertFromTop(fUpdateReg.Frame()) );
|
msg.AddInt32("_token",fViewToken);
|
||||||
msg.AddRect("debug_rect", fUpdateReg.Frame() );
|
|
||||||
msg.AddInt32("_token",fViewToken);
|
|
||||||
|
|
||||||
fServerWin->SendMessageToClient( &msg );
|
fOwner->Window()->SendMessageToClient(&msg);
|
||||||
}
|
//fServerWin->SendMessageToClient( &msg );
|
||||||
}
|
}
|
||||||
|
|
||||||
Layer *Layer::VirtualTopChild() const
|
Layer *Layer::VirtualTopChild() const
|
||||||
|
|||||||
@@ -1409,7 +1409,7 @@ void ServerWindow::DispatchMessage(int32 code, LinkMsgReader &link)
|
|||||||
{
|
{
|
||||||
DTRACE(("ServerWindowo %s: AS_BEGIN_UPDATE\n",fTitle.String()));
|
DTRACE(("ServerWindowo %s: AS_BEGIN_UPDATE\n",fTitle.String()));
|
||||||
fWinBorder->GetRootLayer()->Lock();
|
fWinBorder->GetRootLayer()->Lock();
|
||||||
cl->UpdateStart();
|
fWinBorder->UpdateStart();
|
||||||
fWinBorder->GetRootLayer()->Unlock();
|
fWinBorder->GetRootLayer()->Unlock();
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@@ -1417,7 +1417,7 @@ void ServerWindow::DispatchMessage(int32 code, LinkMsgReader &link)
|
|||||||
{
|
{
|
||||||
DTRACE(("ServerWindowo %s: AS_END_UPDATE\n",fTitle.String()));
|
DTRACE(("ServerWindowo %s: AS_END_UPDATE\n",fTitle.String()));
|
||||||
fWinBorder->GetRootLayer()->Lock();
|
fWinBorder->GetRootLayer()->Lock();
|
||||||
cl->UpdateEnd();
|
fWinBorder->UpdateEnd();
|
||||||
fWinBorder->GetRootLayer()->Unlock();
|
fWinBorder->GetRootLayer()->Unlock();
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@@ -1651,9 +1651,12 @@ void ServerWindow::DispatchGraphicsMessage(int32 code, LinkMsgReader &link)
|
|||||||
{
|
{
|
||||||
fWinBorder->GetRootLayer()->Lock();
|
fWinBorder->GetRootLayer()->Lock();
|
||||||
BRegion rreg(cl->fVisible);
|
BRegion rreg(cl->fVisible);
|
||||||
rreg.Include(&fWinBorder->yUpdateReg);
|
rreg.IntersectWith(&fWinBorder->yUpdateReg);
|
||||||
|
|
||||||
desktop->GetDisplayDriver()->ConstrainClippingRegion(&rreg);
|
desktop->GetDisplayDriver()->ConstrainClippingRegion(&rreg);
|
||||||
|
// rgb_color rrr = cl->fLayerData->viewcolor.GetColor32();
|
||||||
|
// RGBColor c(rand()%255,rand()%255,rand()%255);
|
||||||
|
// desktop->GetDisplayDriver()->FillRect(BRect(0,0,639,479), c);
|
||||||
|
|
||||||
switch (code)
|
switch (code)
|
||||||
{
|
{
|
||||||
|
|||||||
Reference in New Issue
Block a user