From 16039b760a1f8db47d9de395077aa954ce983536 Mon Sep 17 00:00:00 2001 From: Adi Oanca Date: Mon, 5 Jul 2004 20:37:13 +0000 Subject: [PATCH] This is it. Update code is ready. At leat I think so. Testing is next. Uh, didn't thought this could be this easy. :-) git-svn-id: file:///srv/svn/repos/haiku/trunk/current@8320 a95241bf-73f2-0310-859d-f6bbb57e9c96 --- src/servers/app/server/Layer.cpp | 24 +++++++++++++++++++++++- src/servers/app/server/Layer.h | 6 ++++-- src/servers/app/server/ServerWindow.cpp | 10 ++++++++++ 3 files changed, 37 insertions(+), 3 deletions(-) diff --git a/src/servers/app/server/Layer.cpp b/src/servers/app/server/Layer.cpp index af5c878580..0453e7e8ef 100644 --- a/src/servers/app/server/Layer.cpp +++ b/src/servers/app/server/Layer.cpp @@ -77,6 +77,7 @@ Layer::Layer(BRect frame, const char *name, int32 token, uint32 resize, clipToPicture = NULL; // NOW all regions (fVisible, fFullVisible, fFull) are empty + fClipReg = &fVisible; STRACE(("Layer(%s) successfuly created\n", GetName())); } @@ -509,8 +510,14 @@ void Layer::RequestDraw(const BRegion ®, Layer *startFrom) // Update one. BRegion common(lay->fFullVisible); common.IntersectWith(®); - if (common.CountRects() > 0) + if (common.CountRects() > 0){ + // lock/unlock if we are a winborder + if (lay->fClassID == AS_WINBORDER_CLASS) + lay->Window()->Lock(); lay->RequestDraw(reg, NULL); + if (lay->fClassID == AS_WINBORDER_CLASS) + lay->Window()->Unlock(); + } } } } @@ -533,6 +540,21 @@ r.PrintToStream(); // empty HOOK function. } +void Layer::UpdateStart() +{ + // durring update we are not allowed to draw outside the update region. + // why should we? we only need that region redrawn! + fInUpdate = true; + fClipReg = &fUpdateReg; +} + +void Layer::UpdateEnd() +{ + // the usual case. Drawing is permited in the whole visible area. + fInUpdate = false; + fClipReg = &fVisible; + fUpdateReg.MakeEmpty(); +} void Layer::Show(bool invalidate) { diff --git a/src/servers/app/server/Layer.h b/src/servers/app/server/Layer.h index 7bb8ba6991..2d7ca57330 100644 --- a/src/servers/app/server/Layer.h +++ b/src/servers/app/server/Layer.h @@ -114,9 +114,10 @@ public: void SetAsTopLayer(bool option) { fIsTopLayer = option; } bool IsTopLayer() const { return fIsTopLayer; } - void UpdateStart() { fInUpdate = true; } - void UpdateEnd() { fInUpdate = false; } + void UpdateStart(); + void UpdateEnd(); bool InUpdate() const { return fInUpdate; } + BRegion* ClippingRegion() const { return fClipReg; } protected: friend class RootLayer; @@ -140,6 +141,7 @@ protected: BRegion fFullVisible; BRegion fFull; BRegion fUpdateReg; + BRegion *fClipReg; BRegion *clipToPicture; bool clipToPictureInverse; diff --git a/src/servers/app/server/ServerWindow.cpp b/src/servers/app/server/ServerWindow.cpp index df0aac0b1c..1092b9604b 100644 --- a/src/servers/app/server/ServerWindow.cpp +++ b/src/servers/app/server/ServerWindow.cpp @@ -1455,6 +1455,16 @@ void ServerWindow::DispatchMessage(int32 code) break; } + case AS_BEGIN_UPDATE: + { + cl->UpdateStart(); + break; + } + case AS_END_UPDATE: + { + cl->UpdateEnd(); + break; + } // ********** END: BView Messages ***********