diff --git a/headers/os/interface/Picture.h b/headers/os/interface/Picture.h index 677eb64ce7..c452df81e2 100644 --- a/headers/os/interface/Picture.h +++ b/headers/os/interface/Picture.h @@ -35,6 +35,7 @@ public: status_t Flatten(BDataIO* stream); status_t Unflatten(BDataIO* stream); + class Private; private: // FBC padding and forbidden methods virtual void _ReservedPicture1(); @@ -47,6 +48,7 @@ private: friend class BWindow; friend class BView; friend class BPrintJob; + friend class Private; void _InitData(); void _DisposeData(); @@ -70,7 +72,6 @@ private: void Usurp(BPicture* lameDuck); BPicture* StepDown(); - private: int32 fToken; diff --git a/src/kits/interface/Picture.cpp b/src/kits/interface/Picture.cpp index 4e89ca41eb..55b818d918 100644 --- a/src/kits/interface/Picture.cpp +++ b/src/kits/interface/Picture.cpp @@ -9,22 +9,56 @@ //! BPicture records a series of drawing instructions that can be "replayed" later. -#include -#include -#include - -//#define DEBUG 1 -#include -#include -#include -#include #include +#include #include #include #include -#include +//#define DEBUG 1 +#include +#include +#include +#include + +#include +#include +#include +#include +#include + +#include "PicturePrivate.h" + + +static BObjectList sPictureList; +static BLocker sPictureListLock; + + +void +reconnect_pictures_to_app_server() +{ + BAutolock _(sPictureListLock); + for (int32 i = 0; i < sPictureList.CountItems(); i++) { + BPicture::Private picture(sPictureList.ItemAt(i)); + picture.ReconnectToAppServer(); + } +} + + +BPicture::Private::Private(BPicture* picture) + : + fPicture(picture) +{ +} + + +void +BPicture::Private::ReconnectToAppServer() +{ + fPicture->_Upload(); +} + struct _BPictureExtent_ { _BPictureExtent_(const int32 &size = 0); @@ -179,11 +213,16 @@ BPicture::_InitData() fUsurped = NULL; fExtent = new (std::nothrow) _BPictureExtent_; + + BAutolock _(sPictureListLock); + sPictureList.AddItem(this); } BPicture::~BPicture() { + BAutolock _(sPictureListLock); + sPictureList.RemoveItem(this); _DisposeData(); } @@ -385,8 +424,8 @@ BPicture::_AssertServerCopy() status_t BPicture::_Upload() { - ASSERT(fToken == -1); - ASSERT(fExtent->Data() != NULL); + if (fExtent == NULL || fExtent->Data() == NULL) + return B_BAD_VALUE; BPrivate::AppServerLink link; diff --git a/src/kits/interface/View.cpp b/src/kits/interface/View.cpp index 2933e7aaf9..534a77eb3c 100644 --- a/src/kits/interface/View.cpp +++ b/src/kits/interface/View.cpp @@ -3637,6 +3637,9 @@ BView::EndPicture() fCurrentPicture = picture->StepDown(); picture->SetToken(token); + // TODO do this more efficient e.g. use a shared area and let the + // client write into it + picture->_Download(); return picture; } }