diff --git a/src/servers/app/server/AccelerantDriver.cpp b/src/servers/app/server/AccelerantDriver.cpp index b7e96038ef..8defe6c8cd 100644 --- a/src/servers/app/server/AccelerantDriver.cpp +++ b/src/servers/app/server/AccelerantDriver.cpp @@ -214,9 +214,9 @@ void AccelerantDriver::Shutdown(void) \param pensize The thickness of the lines \param colors Array of colors for each respective line */ -void AccelerantDriver::StrokeLineArray(BPoint *pts, const int32 &numlines, const DrawData *d, RGBColor *colors) +void AccelerantDriver::StrokeLineArray(const int32 &numlines, const LineArrayData *linedata,const DrawData *d) { - if(!d) + if(!d || !linedata) return; int x1, y1, x2, y2, dx, dy; @@ -224,18 +224,22 @@ void AccelerantDriver::StrokeLineArray(BPoint *pts, const int32 &numlines, const double xInc, yInc; double x,y; int i; - + const LineArrayData *data; + Lock(); fLineThickness = (int)d->pensize; fDrawPattern.SetTarget((int8*)&B_SOLID_HIGH); for (i=0; icolor,data->color); + + x1 = ROUND(data->pt1.x); + y1 = ROUND(data->pt1.y); + x2 = ROUND(data->pt2.x); + y2 = ROUND(data->pt2.y); dx = x2-x1; dy = y2-y1; x = x1; @@ -246,7 +250,7 @@ void AccelerantDriver::StrokeLineArray(BPoint *pts, const int32 &numlines, const steps = abs(dy); xInc = dx / (double) steps; yInc = dy / (double) steps; - + SetThickPatternPixel(ROUND(x),ROUND(y)); for (k=0; kwindow_tab; // tab_lowcol=_colors->window_tab; -STRACE(("DefaultDecorator:\n")); -STRACE(("\tFrame (%.1f,%.1f,%.1f,%.1f)\n",rect.left,rect.top,rect.right,rect.bottom)); + STRACE(("DefaultDecorator:\n")); + STRACE(("\tFrame (%.1f,%.1f,%.1f,%.1f)\n",rect.left,rect.top,rect.right,rect.bottom)); } DefaultDecorator::~DefaultDecorator(void) { -STRACE(("DefaultDecorator: ~DefaultDecorator()\n")); + STRACE(("DefaultDecorator: ~DefaultDecorator()\n")); delete [] framecolors; } @@ -176,7 +176,7 @@ click_type DefaultDecorator::Clicked(BPoint pt, int32 buttons, int32 modifiers) void DefaultDecorator::_DoLayout(void) { -STRACE(("DefaultDecorator: Do Layout\n")); + STRACE(("DefaultDecorator: Do Layout\n")); // Here we determine the size of every rectangle that we use // internally when we are given the size of the client rectangle. @@ -302,8 +302,8 @@ void DefaultDecorator::ResizeBy(BPoint pt) _frame.right += pt.x; _frame.bottom += pt.y; -// TODO: make bigger/smaller -// _tabrect. + // TODO: make bigger/smaller + // _tabrect. _resizerect.OffsetBy(pt); // _zoomrect.OffsetBy(pt); diff --git a/src/servers/app/server/DirectDriver.cpp b/src/servers/app/server/DirectDriver.cpp index ea1ca60fee..6e6b33c166 100644 --- a/src/servers/app/server/DirectDriver.cpp +++ b/src/servers/app/server/DirectDriver.cpp @@ -235,27 +235,23 @@ void DirectDriver::InvertRect(const BRect &r) Unlock(); } -void DirectDriver::StrokeLineArray(BPoint *pts, const int32 &numlines, const DrawData *d, RGBColor *colors) +void DirectDriver::StrokeLineArray(const int32 &numlines, const LineArrayData *linedata, const DrawData *d) { - if( !numlines || !pts || !colors || !d) + if( !numlines || !linedata || !d) return; + const LineArrayData *data; + Lock(); framebuffer->Lock(); drawview->SetPenSize(d->pensize); drawview->SetDrawingMode(d->draw_mode); - int32 ptindex=0; - drawview->BeginLineArray(numlines); for(int32 i=0; iAddLine(pt1,pt2,col); - + data=(const LineArrayData *)&linedata[i]; + drawview->AddLine(data->pt1,data->pt2,data->color); } drawview->EndLineArray(); diff --git a/src/servers/app/server/DirectDriver.h b/src/servers/app/server/DirectDriver.h index 85bd87f093..b2f8025ac0 100644 --- a/src/servers/app/server/DirectDriver.h +++ b/src/servers/app/server/DirectDriver.h @@ -125,7 +125,7 @@ public: virtual void InvertRect(const BRect &r); - virtual void StrokeLineArray(BPoint *pts, const int32 &numlines, const DrawData *d, RGBColor *colors); + virtual void StrokeLineArray(const int32 &numlines, const LineArrayData *linedata, const DrawData *d); virtual void SetMode(const display_mode &mode); diff --git a/src/servers/app/server/DisplayDriver.cpp b/src/servers/app/server/DisplayDriver.cpp index c74ecb06f8..a8410398bd 100644 --- a/src/servers/app/server/DisplayDriver.cpp +++ b/src/servers/app/server/DisplayDriver.cpp @@ -3599,32 +3599,58 @@ void DisplayDriver::StrokeTriangle(BPoint *pts, const BRect &bounds, const DrawD /*! \brief Draws a series of lines - optimized for speed - \param pts Array of BPoints pairs \param numlines Number of lines to be drawn - \param pensize The thickness of the lines - \param colors Array of colors for each respective line + \param linedata Array of LineArrayData objects + \param d current DrawData settings */ -void DisplayDriver::StrokeLineArray(BPoint *pts, const int32 &numlines, const DrawData *d, RGBColor *colors) +void DisplayDriver::StrokeLineArray(const int32 &numlines, const LineArrayData *linedata,const DrawData *d) { - int i; - DrawData data; + if(!d || !linedata) + return; + + const LineArrayData *dataindex=linedata; + BRect r(0,0,0,0); + DrawData drawdata; Lock(); - BRect invalid=CalculatePolygonBounds(pts,numlines*2); + fCursorHandler->DriverHide(); - if(fCursorHandler->IntersectsCursor(invalid)) - fCursorHandler->DriverHide(); + drawdata = *d; - data = *d; - for (i=0; ipt1.x,linedata->pt1.y,linedata->pt1.x,linedata->pt1.y); + + for (int32 i=0; icolor; + + // Keep track of the invalid region + if (dataindex->pt1.x < r.left) + r.left = dataindex->pt1.x; + if (dataindex->pt1.y < r.top) + r.top = dataindex->pt1.y; + if (dataindex->pt1.x > r.right) + r.right = dataindex->pt1.x; + if (dataindex->pt1.y > r.bottom) + r.bottom = dataindex->pt1.y; + + if (dataindex->pt2.x < r.left) + r.left = dataindex->pt2.x; + if (dataindex->pt2.y < r.top) + r.top = dataindex->pt2.y; + if (dataindex->pt2.x > r.right) + r.right = dataindex->pt2.x; + if (dataindex->pt2.y > r.bottom) + r.bottom = dataindex->pt2.y; + + StrokeLine(dataindex->pt1,dataindex->pt2,&drawdata); } + Invalidate(r); + fCursorHandler->DriverShow(); - + Unlock(); } diff --git a/src/servers/app/server/ServerApp.h b/src/servers/app/server/ServerApp.h index 7d49b8f143..2148176715 100644 --- a/src/servers/app/server/ServerApp.h +++ b/src/servers/app/server/ServerApp.h @@ -83,7 +83,6 @@ protected: friend class AppServer; friend class ServerWindow; -// void DispatchMessage(int32 code, BPortLink& msg); void DispatchMessage(int32 code, LinkMsgReader &link); port_id fClientAppPort, diff --git a/src/servers/app/server/ServerWindow.cpp b/src/servers/app/server/ServerWindow.cpp index 20e25dd85b..df41be8d87 100644 --- a/src/servers/app/server/ServerWindow.cpp +++ b/src/servers/app/server/ServerWindow.cpp @@ -34,9 +34,12 @@ #include #include #include -#include "Desktop.h" +#include #include "AppServer.h" +#include "BGet++.h" +#include "Desktop.h" #include "Layer.h" +#include "RAMLinkMsgReader.h" #include "RootLayer.h" #include "ServerWindow.h" #include "ServerApp.h" @@ -149,12 +152,13 @@ ServerWindow::ServerWindow(BRect rect, const char *string, uint32 wlook, // fMessagePort is the port to which the app sends messages for the server fMessagePort = create_port(30,fTitle.String()); - fSession = new BPortLink(fClientWinPort, fMessagePort); + fMsgSender=new LinkMsgSender(fClientWinPort); + fMsgReader=new LinkMsgReader(fMessagePort); // Send a reply to our window - it is expecting fMessagePort port. - fSession->StartMessage(SERVER_TRUE); - fSession->Attach(fMessagePort); - fSession->Flush(); + fMsgSender->StartMessage(SERVER_TRUE); + fMsgSender->Attach(fMessagePort); + fMsgSender->Flush(); STRACE(("ServerWindow %s:\n",fTitle.String())); STRACE(("\tFrame (%.1f,%.1f,%.1f,%.1f)\n",rect.left,rect.top,rect.right,rect.bottom)); @@ -183,12 +187,18 @@ ServerWindow::~ServerWindow(void) desktop->RemoveWinBorder(fWinBorder); STRACE(("SW(%s) Successfully removed from the desktop\n", fTitle.String())); - if(fSession) + if(fMsgSender) { - delete fSession; - fSession = NULL; + delete fMsgSender; + fMsgSender=NULL; } - + + if(fMsgReader) + { + delete fMsgReader; + fMsgReader=NULL; + } + if (fWinBorder) { delete fWinBorder; @@ -512,17 +522,17 @@ bool ServerWindow::IsLocked(void) const \brief Sets the font state for a layer \param layer The layer to set the font */ -void ServerWindow::SetLayerFontState(Layer *layer) +void ServerWindow::SetLayerFontState(Layer *layer, LinkMsgReader &link) { // NOTE: no need to check for a lock. This is a private method. uint16 mask; - fSession->Read(&mask); + link.Read(&mask); if (mask & B_FONT_FAMILY_AND_STYLE) { uint32 fontID; - fSession->Read((int32*)&fontID); + link.Read((int32*)&fontID); // TODO: Implement. ServerFont::SetFamilyAndStyle(uint32) is needed //layer->fLayerData->font-> @@ -531,78 +541,78 @@ void ServerWindow::SetLayerFontState(Layer *layer) if (mask & B_FONT_SIZE) { float size; - fSession->Read(&size); + link.Read(&size); layer->fLayerData->font.SetSize(size); } if (mask & B_FONT_SHEAR) { float shear; - fSession->Read(&shear); + link.Read(&shear); layer->fLayerData->font.SetShear(shear); } if (mask & B_FONT_ROTATION) { float rotation; - fSession->Read(&rotation); + link.Read(&rotation); layer->fLayerData->font.SetRotation(rotation); } if (mask & B_FONT_SPACING) { uint8 spacing; - fSession->Read(&spacing); + link.Read(&spacing); layer->fLayerData->font.SetSpacing(spacing); } if (mask & B_FONT_ENCODING) { uint8 encoding; - fSession->Read((uint8*)&encoding); + link.Read((uint8*)&encoding); layer->fLayerData->font.SetEncoding(encoding); } if (mask & B_FONT_FACE) { uint16 face; - fSession->Read(&face); + link.Read(&face); layer->fLayerData->font.SetFace(face); } if (mask & B_FONT_FLAGS) { uint32 flags; - fSession->Read(&flags); + link.Read(&flags); layer->fLayerData->font.SetFlags(flags); } STRACE(("DONE: ServerWindow %s: Message AS_LAYER_SET_FONT_STATE: Layer: %s\n", fTitle.String(), layer->fName->String())); } //------------------------------------------------------------------------------ -void ServerWindow::SetLayerState(Layer *layer) +void ServerWindow::SetLayerState(Layer *layer, LinkMsgReader &link) { // NOTE: no need to check for a lock. This is a private method. rgb_color highColor, lowColor, viewColor; pattern patt; int32 clipRegRects; - fSession->Read( &(layer->fLayerData->penlocation)); - fSession->Read( &(layer->fLayerData->pensize)); - fSession->Read( &highColor, sizeof(rgb_color)); - fSession->Read( &lowColor, sizeof(rgb_color)); - fSession->Read( &viewColor, sizeof(rgb_color)); - fSession->Read( &patt, sizeof(pattern)); - fSession->Read((int8*) &(layer->fLayerData->draw_mode)); - fSession->Read( &(layer->fLayerData->coordOrigin)); - fSession->Read((int8*) &(layer->fLayerData->lineJoin)); - fSession->Read((int8*) &(layer->fLayerData->lineCap)); - fSession->Read( &(layer->fLayerData->miterLimit)); - fSession->Read((int8*) &(layer->fLayerData->alphaSrcMode)); - fSession->Read((int8*) &(layer->fLayerData->alphaFncMode)); - fSession->Read( &(layer->fLayerData->scale)); - fSession->Read( &(layer->fLayerData->fontAliasing)); - fSession->Read( &clipRegRects); + link.Read( &(layer->fLayerData->penlocation)); + link.Read( &(layer->fLayerData->pensize)); + link.Read( &highColor, sizeof(rgb_color)); + link.Read( &lowColor, sizeof(rgb_color)); + link.Read( &viewColor, sizeof(rgb_color)); + link.Read( &patt, sizeof(pattern)); + link.Read((int8*) &(layer->fLayerData->draw_mode)); + link.Read( &(layer->fLayerData->coordOrigin)); + link.Read((int8*) &(layer->fLayerData->lineJoin)); + link.Read((int8*) &(layer->fLayerData->lineCap)); + link.Read( &(layer->fLayerData->miterLimit)); + link.Read((int8*) &(layer->fLayerData->alphaSrcMode)); + link.Read((int8*) &(layer->fLayerData->alphaFncMode)); + link.Read( &(layer->fLayerData->scale)); + link.Read( &(layer->fLayerData->fontAliasing)); + link.Read( &clipRegRects); layer->fLayerData->patt.Set(*((uint64*)&patt)); layer->fLayerData->highcolor.SetColor(highColor); @@ -620,7 +630,7 @@ void ServerWindow::SetLayerState(Layer *layer) for(int32 i = 0; i < clipRegRects; i++) { - fSession->Read(&rect); + link.Read(&rect); layer->fLayerData->clipReg->Include(rect); } } @@ -636,7 +646,7 @@ void ServerWindow::SetLayerState(Layer *layer) layer->fName->String())); } //------------------------------------------------------------------------------ -Layer * ServerWindow::CreateLayerTree(Layer *localRoot) +Layer * ServerWindow::CreateLayerTree(Layer *localRoot, LinkMsgReader &link) { // NOTE: no need to check for a lock. This is a private method. STRACE(("ServerWindow(%s)::CreateLayerTree()\n", fTitle.String())); @@ -649,13 +659,13 @@ Layer * ServerWindow::CreateLayerTree(Layer *localRoot) int32 childCount; char *name = NULL; - fSession->Read(&token); - fSession->ReadString(&name); - fSession->Read(&frame); - fSession->Read(&resizeMask); - fSession->Read(&flags); - fSession->Read(&hidden); - fSession->Read(&childCount); + link.Read(&token); + link.ReadString(&name); + link.Read(&frame); + link.Read(&resizeMask); + link.Read(&flags); + link.Read(&hidden); + link.Read(&childCount); Layer *newLayer; newLayer = new Layer(frame, name, token, resizeMask, @@ -676,7 +686,7 @@ Layer * ServerWindow::CreateLayerTree(Layer *localRoot) return newLayer; } //------------------------------------------------------------------------------ -void ServerWindow::DispatchMessage(int32 code) +void ServerWindow::DispatchMessage(int32 code, LinkMsgReader &link) { if (cl == NULL && code != AS_LAYER_CREATE_ROOT) { @@ -691,8 +701,8 @@ void ServerWindow::DispatchMessage(int32 code) int32 bitmapToken; BPoint point; - fSession->Read(&bitmapToken); - fSession->Read(&point); + link.Read(&bitmapToken); + link.Read(&point); ServerBitmap *sbmp = fServerApp->FindBitmap(bitmapToken); if(sbmp) @@ -716,8 +726,8 @@ void ServerWindow::DispatchMessage(int32 code) int32 bitmapToken; BPoint point; - fSession->Read(&bitmapToken); - fSession->Read(&point); + link.Read(&bitmapToken); + link.Read(&point); ServerBitmap *sbmp = fServerApp->FindBitmap(bitmapToken); if(sbmp) @@ -739,9 +749,9 @@ void ServerWindow::DispatchMessage(int32 code) int32 bitmapToken; BRect srcRect, dstRect; - fSession->Read(&bitmapToken); - fSession->Read(&dstRect); - fSession->Read(&srcRect); + link.Read(&bitmapToken); + link.Read(&dstRect); + link.Read(&srcRect); ServerBitmap *sbmp = fServerApp->FindBitmap(bitmapToken); if(sbmp) @@ -763,9 +773,9 @@ void ServerWindow::DispatchMessage(int32 code) int32 bitmapToken; BRect srcRect, dstRect; - fSession->Read(&bitmapToken); - fSession->Read(&dstRect); - fSession->Read(&srcRect); + link.Read(&bitmapToken); + link.Read(&dstRect); + link.Read(&srcRect); ServerBitmap *sbmp = fServerApp->FindBitmap(bitmapToken); if(sbmp) @@ -785,7 +795,7 @@ void ServerWindow::DispatchMessage(int32 code) STRACE(("ServerWindow %s: Message AS_SET_CURRENT_LAYER: Layer name: %s\n", fTitle.String(), cl->fName->String())); int32 token; - fSession->Read(&token); + link.Read(&token); Layer *current = FindLayer(fWinBorder->fTopLayer, token); @@ -803,7 +813,8 @@ void ServerWindow::DispatchMessage(int32 code) if (cl != NULL) break; - fWinBorder->fTopLayer = CreateLayerTree(NULL); +// fWinBorder->fTopLayer = CreateLayerTree(NULL); + fWinBorder->fTopLayer = CreateLayerTree(NULL, link); fWinBorder->fTopLayer->SetAsTopLayer(true); cl = fWinBorder->fTopLayer; @@ -822,7 +833,8 @@ void ServerWindow::DispatchMessage(int32 code) if (cl == NULL) break; - newLayer = CreateLayerTree(NULL); +// newLayer = CreateLayerTree(NULL); + newLayer = CreateLayerTree(NULL, link); cl->AddChild(newLayer, this); if (!(newLayer->IsHidden())){ @@ -862,14 +874,16 @@ void ServerWindow::DispatchMessage(int32 code) case AS_LAYER_SET_STATE: { STRACE(("ServerWindow %s: Message AS_LAYER_SET_STATE: Layer name: %s\n", fTitle.String(), cl->fName->String())); - SetLayerState(cl); +// SetLayerState(cl); + SetLayerState(cl,link); cl->RebuildFullRegion(); break; } case AS_LAYER_SET_FONT_STATE: { STRACE(("ServerWindow %s: Message AS_LAYER_SET_FONT_STATE: Layer name: %s\n", fTitle.String(), cl->fName->String())); - SetLayerFontState(cl); +// SetLayerFontState(cl); + SetLayerFontState(cl,link); cl->RebuildFullRegion(); break; } @@ -889,48 +903,51 @@ void ServerWindow::DispatchMessage(int32 code) patt = ld->patt.GetInt64(); // TODO: Implement when ServerFont::SetfamilyAndStyle(int32) exists - fSession->StartMessage(SERVER_TRUE); + fMsgSender->StartMessage(SERVER_TRUE); // Attach font state - fSession->Attach(0UL /*uint32 ld->font.GetFamAndStyle()*/); - fSession->Attach(ld->font.Size()); - fSession->Attach(ld->font.Shear()); - fSession->Attach(ld->font.Rotation()); - fSession->Attach(ld->font.Spacing()); - fSession->Attach(ld->font.Encoding()); - fSession->Attach(ld->font.Face()); - fSession->Attach(ld->font.Flags()); + + // TODO: need a ServerFont::GetFamAndStyle +// fMsgSender->Attach(0UL uint32 ld->font.GetFamAndStyle()); + fMsgSender->Attach(0UL); + fMsgSender->Attach(ld->font.Size()); + fMsgSender->Attach(ld->font.Shear()); + fMsgSender->Attach(ld->font.Rotation()); + fMsgSender->Attach(ld->font.Spacing()); + fMsgSender->Attach(ld->font.Encoding()); + fMsgSender->Attach(ld->font.Face()); + fMsgSender->Attach(ld->font.Flags()); // Attach view state - fSession->Attach(ld->penlocation); - fSession->Attach(ld->pensize); - fSession->Attach(&hc, sizeof(rgb_color)); - fSession->Attach(&lc, sizeof(rgb_color)); - fSession->Attach(&vc, sizeof(rgb_color)); - fSession->Attach(patt); - fSession->Attach(ld->coordOrigin); - fSession->Attach((uint8)(ld->draw_mode)); - fSession->Attach((uint8)(ld->lineCap)); - fSession->Attach((uint8)(ld->lineJoin)); - fSession->Attach(ld->miterLimit); - fSession->Attach((uint8)(ld->alphaSrcMode)); - fSession->Attach((uint8)(ld->alphaFncMode)); - fSession->Attach(ld->scale); - fSession->Attach(ld->fontAliasing); + fMsgSender->Attach(ld->penlocation); + fMsgSender->Attach(ld->pensize); + fMsgSender->Attach(&hc, sizeof(rgb_color)); + fMsgSender->Attach(&lc, sizeof(rgb_color)); + fMsgSender->Attach(&vc, sizeof(rgb_color)); + fMsgSender->Attach(patt); + fMsgSender->Attach(ld->coordOrigin); + fMsgSender->Attach((uint8)(ld->draw_mode)); + fMsgSender->Attach((uint8)(ld->lineCap)); + fMsgSender->Attach((uint8)(ld->lineJoin)); + fMsgSender->Attach(ld->miterLimit); + fMsgSender->Attach((uint8)(ld->alphaSrcMode)); + fMsgSender->Attach((uint8)(ld->alphaFncMode)); + fMsgSender->Attach(ld->scale); + fMsgSender->Attach(ld->fontAliasing); int32 noOfRects = 0; if (ld->clipReg) noOfRects = ld->clipReg->CountRects(); - fSession->Attach(noOfRects); + fMsgSender->Attach(noOfRects); for(int i = 0; i < noOfRects; i++) - fSession->Attach(ld->clipReg->RectAt(i)); + fMsgSender->Attach(ld->clipReg->RectAt(i)); - fSession->Attach(cl->fFrame.left); - fSession->Attach(cl->fFrame.top); - fSession->Attach(cl->fFrame.OffsetToCopy(cl->fBoundsLeftTop)); - fSession->Flush(); + fMsgSender->Attach(cl->fFrame.left); + fMsgSender->Attach(cl->fFrame.top); + fMsgSender->Attach(cl->fFrame.OffsetToCopy(cl->fBoundsLeftTop)); + fMsgSender->Flush(); break; } @@ -939,8 +956,8 @@ void ServerWindow::DispatchMessage(int32 code) STRACE(("ServerWindow %s: Message AS_LAYER_MOVETO: Layer name: %s\n", fTitle.String(), cl->fName->String())); float x, y; - fSession->Read(&x); - fSession->Read(&y); + link.Read(&x); + link.Read(&y); cl->MoveBy(x, y); @@ -951,8 +968,8 @@ void ServerWindow::DispatchMessage(int32 code) STRACE(("ServerWindow %s: Message AS_LAYER_RESIZETO: Layer name: %s\n", fTitle.String(), cl->fName->String())); float newWidth, newHeight; - fSession->Read(&newWidth); - fSession->Read(&newHeight); + link.Read(&newWidth); + link.Read(&newHeight); // TODO: Check for minimum size allowed. Need WinBorder::GetSizeLimits @@ -963,11 +980,11 @@ void ServerWindow::DispatchMessage(int32 code) case AS_LAYER_GET_COORD: { STRACE(("ServerWindow %s: Message AS_LAYER_GET_COORD: Layer: %s\n",fTitle.String(), cl->fName->String())); - fSession->StartMessage(SERVER_TRUE); - fSession->Attach(cl->fFrame.left); - fSession->Attach(cl->fFrame.top); - fSession->Attach(cl->fFrame.OffsetToCopy(cl->fBoundsLeftTop)); - fSession->Flush(); + fMsgSender->StartMessage(SERVER_TRUE); + fMsgSender->Attach(cl->fFrame.left); + fMsgSender->Attach(cl->fFrame.top); + fMsgSender->Attach(cl->fFrame.OffsetToCopy(cl->fBoundsLeftTop)); + fMsgSender->Flush(); break; } @@ -976,8 +993,8 @@ void ServerWindow::DispatchMessage(int32 code) STRACE(("ServerWindow %s: Message AS_LAYER_SET_ORIGIN: Layer: %s\n",fTitle.String(), cl->fName->String())); float x, y; - fSession->Read(&x); - fSession->Read(&y); + link.Read(&x); + link.Read(&y); cl->fLayerData->coordOrigin.Set(x, y); @@ -986,16 +1003,16 @@ void ServerWindow::DispatchMessage(int32 code) case AS_LAYER_GET_ORIGIN: { STRACE(("ServerWindow %s: Message AS_LAYER_GET_ORIGIN: Layer: %s\n",fTitle.String(), cl->fName->String())); - fSession->StartMessage(SERVER_TRUE); - fSession->Attach(cl->fLayerData->coordOrigin); - fSession->Flush(); + fMsgSender->StartMessage(SERVER_TRUE); + fMsgSender->Attach(cl->fLayerData->coordOrigin); + fMsgSender->Flush(); break; } case AS_LAYER_RESIZE_MODE: { STRACE(("ServerWindow %s: Message AS_LAYER_RESIZE_MODE: Layer: %s\n",fTitle.String(), cl->fName->String())); - fSession->Read(&(cl->fResizeMode)); + link.Read(&(cl->fResizeMode)); break; } @@ -1004,7 +1021,7 @@ void ServerWindow::DispatchMessage(int32 code) STRACE(("ServerWindow %s: Message AS_LAYER_CURSOR: Layer: %s\n",fTitle.String(), cl->fName->String())); int32 token; - fSession->Read(&token); + link.Read(&token); cursormanager->SetCursor(token); @@ -1012,7 +1029,7 @@ void ServerWindow::DispatchMessage(int32 code) } case AS_LAYER_SET_FLAGS: { - fSession->Read(&(cl->fFlags)); + link.Read(&(cl->fFlags)); STRACE(("ServerWindow %s: Message AS_LAYER_SET_FLAGS: Layer: %s\n",fTitle.String(), cl->fName->String())); break; @@ -1036,9 +1053,9 @@ void ServerWindow::DispatchMessage(int32 code) // TODO: Look into locking scheme relating to Layers and modifying redraw-related members - fSession->Read(&lineCap); - fSession->Read(&lineJoin); - fSession->Read(&(cl->fLayerData->miterLimit)); + link.Read(&lineCap); + link.Read(&lineJoin); + link.Read(&(cl->fLayerData->miterLimit)); cl->fLayerData->lineCap = (cap_mode)lineCap; cl->fLayerData->lineJoin = (join_mode)lineJoin; @@ -1048,11 +1065,11 @@ void ServerWindow::DispatchMessage(int32 code) case AS_LAYER_GET_LINE_MODE: { STRACE(("ServerWindow %s: Message AS_LAYER_GET_LINE_MODE: Layer: %s\n",fTitle.String(), cl->fName->String())); - fSession->StartMessage(SERVER_TRUE); - fSession->Attach((int8)(cl->fLayerData->lineCap)); - fSession->Attach((int8)(cl->fLayerData->lineJoin)); - fSession->Attach(cl->fLayerData->miterLimit); - fSession->Flush(); + fMsgSender->StartMessage(SERVER_TRUE); + fMsgSender->Attach((int8)(cl->fLayerData->lineCap)); + fMsgSender->Attach((int8)(cl->fLayerData->lineJoin)); + fMsgSender->Attach(cl->fLayerData->miterLimit); + fMsgSender->Flush(); break; } @@ -1087,7 +1104,7 @@ void ServerWindow::DispatchMessage(int32 code) case AS_LAYER_SET_SCALE: { STRACE(("ServerWindow %s: Message AS_LAYER_SET_SCALE: Layer: %s\n",fTitle.String(), cl->fName->String())); - fSession->Read(&(cl->fLayerData->scale)); + link.Read(&(cl->fLayerData->scale)); break; } case AS_LAYER_GET_SCALE: @@ -1100,9 +1117,9 @@ void ServerWindow::DispatchMessage(int32 code) while((ld = ld->prevState)) scale *= ld->scale; - fSession->StartMessage(SERVER_TRUE); - fSession->Attach(scale); - fSession->Flush(); + fMsgSender->StartMessage(SERVER_TRUE); + fMsgSender->Attach(scale); + fMsgSender->Flush(); break; } @@ -1111,8 +1128,8 @@ void ServerWindow::DispatchMessage(int32 code) STRACE(("ServerWindow %s: Message AS_LAYER_SET_PEN_LOC: Layer: %s\n",fTitle.String(), cl->fName->String())); float x, y; - fSession->Read(&x); - fSession->Read(&y); + link.Read(&x); + link.Read(&y); cl->fLayerData->penlocation.Set(x, y); @@ -1121,25 +1138,25 @@ void ServerWindow::DispatchMessage(int32 code) case AS_LAYER_GET_PEN_LOC: { STRACE(("ServerWindow %s: Message AS_LAYER_GET_PEN_LOC: Layer: %s\n",fTitle.String(), cl->fName->String())); - fSession->StartMessage(SERVER_TRUE); - fSession->Attach(cl->fLayerData->penlocation); - fSession->Flush(); + fMsgSender->StartMessage(SERVER_TRUE); + fMsgSender->Attach(cl->fLayerData->penlocation); + fMsgSender->Flush(); break; } case AS_LAYER_SET_PEN_SIZE: { STRACE(("ServerWindow %s: Message AS_LAYER_SET_PEN_SIZE: Layer: %s\n",fTitle.String(), cl->fName->String())); - fSession->Read(&(cl->fLayerData->pensize)); + link.Read(&(cl->fLayerData->pensize)); break; } case AS_LAYER_GET_PEN_SIZE: { STRACE(("ServerWindow %s: Message AS_LAYER_GET_PEN_SIZE: Layer: %s\n",fTitle.String(), cl->fName->String())); - fSession->StartMessage(SERVER_TRUE); - fSession->Attach(cl->fLayerData->pensize); - fSession->Flush(); + fMsgSender->StartMessage(SERVER_TRUE); + fMsgSender->Attach(cl->fLayerData->pensize); + fMsgSender->Flush(); break; } @@ -1148,7 +1165,7 @@ void ServerWindow::DispatchMessage(int32 code) STRACE(("ServerWindow %s: Message AS_LAYER_SET_VIEW_COLOR: Layer: %s\n",fTitle.String(), cl->fName->String())); rgb_color c; - fSession->Read(&c, sizeof(rgb_color)); + link.Read(&c, sizeof(rgb_color)); cl->fLayerData->viewcolor.SetColor(c); @@ -1165,11 +1182,11 @@ void ServerWindow::DispatchMessage(int32 code) lowColor = cl->fLayerData->lowcolor.GetColor32(); viewColor = cl->fLayerData->viewcolor.GetColor32(); - fSession->StartMessage(SERVER_TRUE); - fSession->Attach(&highColor, sizeof(rgb_color)); - fSession->Attach(&lowColor, sizeof(rgb_color)); - fSession->Attach(&viewColor, sizeof(rgb_color)); - fSession->Flush(); + fMsgSender->StartMessage(SERVER_TRUE); + fMsgSender->Attach(&highColor, sizeof(rgb_color)); + fMsgSender->Attach(&lowColor, sizeof(rgb_color)); + fMsgSender->Attach(&viewColor, sizeof(rgb_color)); + fMsgSender->Flush(); break; } @@ -1178,8 +1195,8 @@ void ServerWindow::DispatchMessage(int32 code) STRACE(("ServerWindow %s: Message AS_LAYER_SET_BLEND_MODE: Layer: %s\n",fTitle.String(), cl->fName->String())); int8 srcAlpha, alphaFunc; - fSession->Read(&srcAlpha); - fSession->Read(&alphaFunc); + link.Read(&srcAlpha); + link.Read(&alphaFunc); cl->fLayerData->alphaSrcMode = (source_alpha)srcAlpha; cl->fLayerData->alphaFncMode = (alpha_function)alphaFunc; @@ -1189,10 +1206,10 @@ void ServerWindow::DispatchMessage(int32 code) case AS_LAYER_GET_BLEND_MODE: { STRACE(("ServerWindow %s: Message AS_LAYER_GET_BLEND_MODE: Layer: %s\n",fTitle.String(), cl->fName->String())); - fSession->StartMessage(SERVER_TRUE); - fSession->Attach((int8)(cl->fLayerData->alphaSrcMode)); - fSession->Attach((int8)(cl->fLayerData->alphaFncMode)); - fSession->Flush(); + fMsgSender->StartMessage(SERVER_TRUE); + fMsgSender->Attach((int8)(cl->fLayerData->alphaSrcMode)); + fMsgSender->Attach((int8)(cl->fLayerData->alphaFncMode)); + fMsgSender->Flush(); break; } @@ -1201,7 +1218,7 @@ void ServerWindow::DispatchMessage(int32 code) STRACE(("ServerWindow %s: Message AS_LAYER_SET_DRAW_MODE: Layer: %s\n",fTitle.String(), cl->fName->String())); int8 drawingMode; - fSession->Read(&drawingMode); + link.Read(&drawingMode); cl->fLayerData->draw_mode = (drawing_mode)drawingMode; @@ -1210,16 +1227,16 @@ void ServerWindow::DispatchMessage(int32 code) case AS_LAYER_GET_DRAW_MODE: { STRACE(("ServerWindow %s: Message AS_LAYER_GET_DRAW_MODE: Layer: %s\n",fTitle.String(), cl->fName->String())); - fSession->StartMessage(SERVER_TRUE); - fSession->Attach((int8)(cl->fLayerData->draw_mode)); - fSession->Flush(); + fMsgSender->StartMessage(SERVER_TRUE); + fMsgSender->Attach((int8)(cl->fLayerData->draw_mode)); + fMsgSender->Flush(); break; } case AS_LAYER_PRINT_ALIASING: { STRACE(("ServerWindow %s: Message AS_LAYER_PRINT_ALIASING: Layer: %s\n",fTitle.String(), cl->fName->String())); - fSession->Read(&(cl->fLayerData->fontAliasing)); + link.Read(&(cl->fLayerData->fontAliasing)); break; } @@ -1231,8 +1248,8 @@ void ServerWindow::DispatchMessage(int32 code) int32 pictureToken; BPoint where; - fSession->Read(&pictureToken); - fSession->Read(&where); + link.Read(&pictureToken); + link.Read(&where); BRegion reg; @@ -1306,8 +1323,8 @@ void ServerWindow::DispatchMessage(int32 code) int32 pictureToken; BPoint where; - fSession->Read(&pictureToken); - fSession->Read(&where); + link.Read(&pictureToken); + link.Read(&where); ServerPicture *sp = NULL; int32 i = 0; @@ -1345,9 +1362,9 @@ void ServerWindow::DispatchMessage(int32 code) // if this Layer is hidden, it is clear that its visible region is void. if (cl->IsHidden()) { - fSession->StartMessage(SERVER_TRUE); - fSession->Attach(0L); - fSession->Flush(); + fMsgSender->StartMessage(SERVER_TRUE); + fMsgSender->Attach(0L); + fMsgSender->Flush(); } else { @@ -1369,11 +1386,11 @@ void ServerWindow::DispatchMessage(int32 code) } noOfRects = reg.CountRects(); - fSession->StartMessage(SERVER_TRUE); - fSession->Attach(noOfRects); + fMsgSender->StartMessage(SERVER_TRUE); + fMsgSender->Attach(noOfRects); for(int i = 0; i < noOfRects; i++) - fSession->Attach(reg.RectAt(i)); + fMsgSender->Attach(reg.RectAt(i)); } break; } @@ -1390,11 +1407,11 @@ void ServerWindow::DispatchMessage(int32 code) else cl->fLayerData->clipReg = new BRegion(); - fSession->Read(&noOfRects); + link.Read(&noOfRects); for(int i = 0; i < noOfRects; i++) { - fSession->Read(&r); + link.Read(&r); cl->fLayerData->clipReg->Include(r); } @@ -1416,7 +1433,7 @@ void ServerWindow::DispatchMessage(int32 code) // TODO: Watch out for the coordinate system in AS_LAYER_INVAL_RECT BRect invalRect; - fSession->Read(&invalRect); + link.Read(&invalRect); cl->Invalidate(invalRect); @@ -1431,11 +1448,11 @@ void ServerWindow::DispatchMessage(int32 code) int32 noOfRects; BRect rect; - fSession->Read(&noOfRects); + link.Read(&noOfRects); for(int i = 0; i < noOfRects; i++) { - fSession->Read(&rect); + link.Read(&rect); invalReg.Include(rect); } @@ -1515,21 +1532,21 @@ void ServerWindow::DispatchMessage(int32 code) int32 mainToken; team_id teamID; - fSession->Read(&mainToken); - fSession->Read(&teamID, sizeof(team_id)); + link.Read(&mainToken); + link.Read(&teamID, sizeof(team_id)); wb = desktop->FindWinBorderByServerWindowTokenAndTeamID(mainToken, teamID); if(wb) { - fSession->StartMessage(SERVER_TRUE); - fSession->Flush(); + fMsgSender->StartMessage(SERVER_TRUE); + fMsgSender->Flush(); fWinBorder->AddToSubsetOf(wb); } else { - fSession->StartMessage(SERVER_FALSE); - fSession->Flush(); + fMsgSender->StartMessage(SERVER_FALSE); + fMsgSender->Flush(); } break; } @@ -1539,21 +1556,21 @@ void ServerWindow::DispatchMessage(int32 code) int32 mainToken; team_id teamID; - fSession->Read(&mainToken); - fSession->Read(&teamID, sizeof(team_id)); + link.Read(&mainToken); + link.Read(&teamID, sizeof(team_id)); wb = desktop->FindWinBorderByServerWindowTokenAndTeamID(mainToken, teamID); if(wb) { - fSession->StartMessage(SERVER_TRUE); - fSession->Flush(); + fMsgSender->StartMessage(SERVER_TRUE); + fMsgSender->Flush(); fWinBorder->RemoveFromSubsetOf(wb); } else { - fSession->StartMessage(SERVER_FALSE); - fSession->Flush(); + fMsgSender->StartMessage(SERVER_FALSE); + fMsgSender->Flush(); } break; } @@ -1604,8 +1621,8 @@ void ServerWindow::DispatchMessage(int32 code) float xResizeBy; float yResizeBy; - fSession->Read(&xResizeBy); - fSession->Read(&yResizeBy); + link.Read(&xResizeBy); + link.Read(&yResizeBy); fWinBorder->ResizeBy(xResizeBy, yResizeBy); @@ -1616,8 +1633,8 @@ void ServerWindow::DispatchMessage(int32 code) float xMoveBy; float yMoveBy; - fSession->Read(&xMoveBy); - fSession->Read(&yMoveBy); + link.Read(&xMoveBy); + link.Read(&yMoveBy); fWinBorder->MoveBy(xMoveBy, yMoveBy); @@ -1633,15 +1650,15 @@ void ServerWindow::DispatchMessage(int32 code) float wmin,wmax,hmin,hmax; - fSession->Read(&wmin); - fSession->Read(&wmax); - fSession->Read(&hmin); - fSession->Read(&hmax); + link.Read(&wmin); + link.Read(&wmax); + link.Read(&hmin); + link.Read(&hmax); fWinBorder->SetSizeLimits(wmin,wmax,hmin,hmax); - fSession->StartMessage(SERVER_TRUE); - fSession->Flush(); + fMsgSender->StartMessage(SERVER_TRUE); + fMsgSender->Flush(); break; } case B_MINIMIZE: @@ -1671,7 +1688,7 @@ void ServerWindow::DispatchMessage(int32 code) STRACE(("ServerWindow %s: Message AS_LAYER_SET_HIGH_COLOR: Layer: %s\n",fTitle.String(), cl->fName->String())); rgb_color c; - fSession->Read(&c, sizeof(rgb_color)); + link.Read(&c, sizeof(rgb_color)); cl->fLayerData->highcolor.SetColor(c); @@ -1682,7 +1699,7 @@ void ServerWindow::DispatchMessage(int32 code) STRACE(("ServerWindow %s: Message AS_LAYER_SET_LOW_COLOR: Layer: %s\n",fTitle.String(), cl->fName->String())); rgb_color c; - fSession->Read(&c, sizeof(rgb_color)); + link.Read(&c, sizeof(rgb_color)); cl->fLayerData->lowcolor.SetColor(c); @@ -1693,10 +1710,10 @@ void ServerWindow::DispatchMessage(int32 code) // TODO: Add clipping TO AS_STROKE_LINE float x1, y1, x2, y2; - fSession->Read(&x1); - fSession->Read(&y1); - fSession->Read(&x2); - fSession->Read(&y2); + link.Read(&x1); + link.Read(&y1); + link.Read(&x2); + link.Read(&y2); if (cl && cl->fLayerData) { @@ -1711,10 +1728,10 @@ void ServerWindow::DispatchMessage(int32 code) { // TODO: Add clipping TO AS_STROKE_RECT float left, top, right, bottom; - fSession->Read(&left); - fSession->Read(&top); - fSession->Read(&right); - fSession->Read(&bottom); + link.Read(&left); + link.Read(&top); + link.Read(&right); + link.Read(&bottom); BRect rect(left,top,right,bottom); if (cl && cl->fLayerData) @@ -1724,7 +1741,7 @@ void ServerWindow::DispatchMessage(int32 code) { // TODO: Add clipping TO AS_STROKE_RECT BRect rect; - fSession->Read(&rect); + link.Read(&rect); if (cl && cl->fLayerData) desktop->GetDisplayDriver()->FillRect(cl->ConvertToTop(rect),cl->fLayerData); } @@ -1734,9 +1751,9 @@ void ServerWindow::DispatchMessage(int32 code) float angle, span; BRect r; - fSession->Read(&r); - fSession->Read(&angle); - fSession->Read(&span); + link.Read(&r); + link.Read(&angle); + link.Read(&span); if (cl && cl->fLayerData) desktop->GetDisplayDriver()->StrokeArc(cl->ConvertToTop(r),angle,span,cl->fLayerData); break; @@ -1747,9 +1764,9 @@ void ServerWindow::DispatchMessage(int32 code) float angle, span; BRect r; - fSession->Read(&r); - fSession->Read(&angle); - fSession->Read(&span); + link.Read(&r); + link.Read(&angle); + link.Read(&span); if (cl && cl->fLayerData) desktop->GetDisplayDriver()->FillArc(cl->ConvertToTop(r),angle,span,cl->fLayerData); break; @@ -1762,7 +1779,7 @@ void ServerWindow::DispatchMessage(int32 code) pts = new BPoint[4]; for (i=0; i<4; i++) - fSession->Read(&(pts[i])); + link.Read(&(pts[i])); if (cl && cl->fLayerData) { @@ -1782,7 +1799,7 @@ void ServerWindow::DispatchMessage(int32 code) pts = new BPoint[4]; for (i=0; i<4; i++) - fSession->Read(&(pts[i])); + link.Read(&(pts[i])); if (cl && cl->fLayerData) { @@ -1798,7 +1815,7 @@ void ServerWindow::DispatchMessage(int32 code) { // TODO: Add clipping AS_STROKE_ELLIPSE BRect rect; - fSession->Read(&rect); + link.Read(&rect); if (cl && cl->fLayerData) desktop->GetDisplayDriver()->StrokeEllipse(cl->ConvertToTop(rect),cl->fLayerData); break; @@ -1807,7 +1824,7 @@ void ServerWindow::DispatchMessage(int32 code) { // TODO: Add clipping AS_STROKE_ELLIPSE BRect rect; - fSession->Read(&rect); + link.Read(&rect); if (cl && cl->fLayerData) desktop->GetDisplayDriver()->FillEllipse(cl->ConvertToTop(rect),cl->fLayerData); break; @@ -1817,9 +1834,9 @@ void ServerWindow::DispatchMessage(int32 code) // TODO: Add clipping AS_STROKE_ROUNDRECT BRect rect; float xrad,yrad; - fSession->Read(&rect); - fSession->Read(&xrad); - fSession->Read(&yrad); + link.Read(&rect); + link.Read(&xrad); + link.Read(&yrad); if (cl && cl->fLayerData) desktop->GetDisplayDriver()->StrokeRoundRect(cl->ConvertToTop(rect),xrad,yrad,cl->fLayerData); @@ -1830,9 +1847,9 @@ void ServerWindow::DispatchMessage(int32 code) // TODO: Add clipping AS_STROKE_ROUNDRECT BRect rect; float xrad,yrad; - fSession->Read(&rect); - fSession->Read(&xrad); - fSession->Read(&yrad); + link.Read(&rect); + link.Read(&xrad); + link.Read(&yrad); if (cl && cl->fLayerData) desktop->GetDisplayDriver()->FillRoundRect(cl->ConvertToTop(rect),xrad,yrad,cl->fLayerData); @@ -1845,9 +1862,9 @@ void ServerWindow::DispatchMessage(int32 code) BRect rect; for (int i=0; i<3; i++) - fSession->Read(&(pts[i])); + link.Read(&(pts[i])); - fSession->Read(&rect); + link.Read(&rect); if (cl && cl->fLayerData) { @@ -1865,9 +1882,9 @@ void ServerWindow::DispatchMessage(int32 code) BRect rect; for (int i=0; i<3; i++) - fSession->Read(&(pts[i])); + link.Read(&(pts[i])); - fSession->Read(&rect); + link.Read(&rect); if (cl && cl->fLayerData) { @@ -1885,13 +1902,13 @@ void ServerWindow::DispatchMessage(int32 code) int32 pointcount; BPoint *pointlist; - fSession->Read(&polyframe); - fSession->Read(&isclosed); - fSession->Read(&pointcount); + link.Read(&polyframe); + link.Read(&isclosed); + link.Read(&pointcount); pointlist=new BPoint[pointcount]; - fSession->Read(pointlist, sizeof(BPoint)*pointcount); + link.Read(pointlist, sizeof(BPoint)*pointcount); for(int32 i=0; iConvertToTop(pointlist[i]); @@ -1909,12 +1926,12 @@ void ServerWindow::DispatchMessage(int32 code) int32 pointcount; BPoint *pointlist; - fSession->Read(&polyframe); - fSession->Read(&pointcount); + link.Read(&polyframe); + link.Read(&pointcount); pointlist=new BPoint[pointcount]; - fSession->Read(pointlist, sizeof(BPoint)*pointcount); + link.Read(pointlist, sizeof(BPoint)*pointcount); for(int32 i=0; iConvertToTop(pointlist[i]); @@ -1933,15 +1950,15 @@ void ServerWindow::DispatchMessage(int32 code) int32 *oplist; BPoint *ptlist; - fSession->Read(&shaperect); - fSession->Read(&opcount); - fSession->Read(&ptcount); + link.Read(&shaperect); + link.Read(&opcount); + link.Read(&ptcount); oplist=new int32[opcount]; ptlist=new BPoint[ptcount]; - fSession->Read(oplist,sizeof(int32)*opcount); - fSession->Read(ptlist,sizeof(BPoint)*ptcount); + link.Read(oplist,sizeof(int32)*opcount); + link.Read(ptlist,sizeof(BPoint)*ptcount); for(int32 i=0; iConvertToTop(ptlist[i]); @@ -1960,15 +1977,15 @@ void ServerWindow::DispatchMessage(int32 code) int32 *oplist; BPoint *ptlist; - fSession->Read(&shaperect); - fSession->Read(&opcount); - fSession->Read(&ptcount); + link.Read(&shaperect); + link.Read(&opcount); + link.Read(&ptcount); oplist=new int32[opcount]; ptlist=new BPoint[ptcount]; - fSession->Read(oplist,sizeof(int32)*opcount); - fSession->Read(ptlist,sizeof(BPoint)*ptcount); + link.Read(oplist,sizeof(int32)*opcount); + link.Read(ptlist,sizeof(BPoint)*ptcount); for(int32 i=0; iConvertToTop(ptlist[i]); @@ -1985,11 +2002,11 @@ void ServerWindow::DispatchMessage(int32 code) int32 rectcount; BRect *rectlist; - fSession->Read(&rectcount); + link.Read(&rectcount); rectlist=new BRect[rectcount]; - fSession->Read(rectlist, sizeof(BRect)*rectcount); + link.Read(rectlist, sizeof(BRect)*rectcount); // Between the client-side conversion to BRects from clipping_rects to the overhead // in repeatedly calling FillRect(), this is definitely in need of optimization. At @@ -2006,7 +2023,33 @@ void ServerWindow::DispatchMessage(int32 code) } case AS_STROKE_LINEARRAY: { - // TODO: Implement AS_STROKE_LINEARRAY + // Attached Data: + // 1) int32 Number of lines in the array + // 2) array of struct _array_data_ objects, as defined in ViewAux.h + + int32 linecount; + + link.Read(&linecount); + if(linecount>0) + { + LineArrayData linedata[linecount], *index; + + for(int32 i=0; i(&(index->pt1.x)); + link.Read(&(index->pt1.y)); + link.Read(&(index->pt2.x)); + link.Read(&(index->pt2.y)); + link.Read(&(index->color)); + + index->pt1=cl->ConvertToTop(index->pt1); + index->pt2=cl->ConvertToTop(index->pt2); + } + + desktop->GetDisplayDriver()->StrokeLineArray(linecount,linedata,cl->fLayerData); + } break; } case AS_DRAW_STRING: @@ -2016,9 +2059,9 @@ void ServerWindow::DispatchMessage(int32 code) BPoint location; escapement_delta delta; - fSession->Read(&location); - fSession->Read(&delta); - fSession->ReadString(&string); + link.Read(&location); + link.Read(&delta); + link.ReadString(&string); if(cl && cl->fLayerData) desktop->GetDisplayDriver()->DrawString(string,length,cl->ConvertToTop(location), @@ -2031,8 +2074,8 @@ void ServerWindow::DispatchMessage(int32 code) { float x,y; - fSession->Read(&x); - fSession->Read(&y); + link.Read(&x); + link.Read(&y); if(cl && cl->fLayerData) cl->fLayerData->penlocation.Set(x,y); @@ -2042,7 +2085,7 @@ void ServerWindow::DispatchMessage(int32 code) { float size; - fSession->Read(&size); + link.Read(&size); if(cl && cl->fLayerData) cl->fLayerData->pensize=size; @@ -2058,6 +2101,42 @@ void ServerWindow::DispatchMessage(int32 code) // TODO: Implement AS_SET_FONT_SIZE? break; } + case AS_AREA_MESSAGE: + { + // This occurs in only one kind of case: a message is too big to send over a port. This + // is really an edge case, so this shouldn't happen *too* often + + // Attached Data: + // 1) area_id id of an area already owned by the server containing the message + // 2) size_t offset of the pointer in the area + // 3) size_t size of the message + + area_id area; + size_t offset; + size_t msgsize; + area_info ai; + int8 *msgpointer; + + link.Read(&area); + link.Read(&offset); + link.Read(&msgsize); + + // Part sanity check, part get base pointer :) + if(get_area_info(area,&ai)!=B_OK) + break; + + msgpointer=(int8*)ai.address + offset; + + RAMLinkMsgReader mlink(msgpointer); + DispatchMessage(mlink.Code(),mlink); + + // This is a very special case in the sense that when ServerMemIO is used for this + // purpose, it will be set to NOT automatically free the memory which it had + // requested. This is the server's job once the message has been dispatched. + fServerApp->fSharedMem->ReleaseBuffer(msgpointer); + + break; + } default: { printf("ServerWindow %s received unexpected code - message offset %lx\n",fTitle.String(), code - SERVER_TRUE); @@ -2076,7 +2155,8 @@ void ServerWindow::DispatchMessage(int32 code) int32 ServerWindow::MonitorWin(void *data) { ServerWindow *win = (ServerWindow *)data; - BPortLink *ses = win->fSession; + LinkMsgReader *ses = win->fMsgReader; + bool quitting = false; int32 code; status_t err = B_OK; @@ -2085,7 +2165,7 @@ int32 ServerWindow::MonitorWin(void *data) { printf("info: ServerWindow::MonitorWin listening on port %ld.\n", win->fMessagePort); code = AS_CLIENT_DEAD; - err = ses->GetNextReply(&code); + err = ses->GetNextMessage(&code); if (err < B_OK) return err; @@ -2099,6 +2179,7 @@ int32 ServerWindow::MonitorWin(void *data) // this means the client has been killed STRACE(("ServerWindow %s received 'AS_CLIENT_DEAD/AS_DELETE_WINDOW' message code\n",win->Title())); quitting = true; + // ServerWindow's destructor takes care of pulling this object off the desktop. delete win; break; @@ -2112,7 +2193,7 @@ int32 ServerWindow::MonitorWin(void *data) } default: { - win->DispatchMessage(code); + win->DispatchMessage(code, *ses); break; } } diff --git a/src/servers/app/server/ServerWindow.h b/src/servers/app/server/ServerWindow.h index 56d2ce744a..7d1dfe2a50 100644 --- a/src/servers/app/server/ServerWindow.h +++ b/src/servers/app/server/ServerWindow.h @@ -34,6 +34,8 @@ #include #include #include +#include +#include #include "FMWList.h" class BString; @@ -120,12 +122,12 @@ public: private: // methods for retrieving and creating a tree strcture of Layers. - Layer *CreateLayerTree(Layer *localRoot); - void SetLayerState(Layer *layer); - void SetLayerFontState(Layer *layer); + Layer *CreateLayerTree(Layer *localRoot, LinkMsgReader &link); + void SetLayerState(Layer *layer, LinkMsgReader &link); + void SetLayerFontState(Layer *layer, LinkMsgReader &link); // message handle methods. - void DispatchMessage(int32 code); + void DispatchMessage(int32 code, LinkMsgReader &link); static int32 MonitorWin(void *data); @@ -156,7 +158,8 @@ protected: uint32 fToken; int32 fHandlerToken; - BPortLink *fSession; + LinkMsgReader *fMsgReader; + LinkMsgSender *fMsgSender; // cl is short for currentLayer. We'll use it a lot, that's why it's short :-) Layer *cl; diff --git a/src/servers/app/server/ViewDriver.cpp b/src/servers/app/server/ViewDriver.cpp index 7ebd4cb095..33ada77886 100644 --- a/src/servers/app/server/ViewDriver.cpp +++ b/src/servers/app/server/ViewDriver.cpp @@ -606,31 +606,28 @@ bool ViewDriver::DumpToFile(const char *path) \param pensize The thickness of the lines \param colors Array of colors for each respective line */ -void ViewDriver::StrokeLineArray(BPoint *pts, const int32 &numlines, const DrawData *d, RGBColor *colors) +void ViewDriver::StrokeLineArray(const int32 &numlines, const LineArrayData *linedata, + const DrawData *d) { if(!is_initialized) return; - if( !numlines || !pts || !colors || !d) + if( !numlines || !linedata || !d) return; + const LineArrayData *data; + Lock(); screenwin->Lock(); framebuffer->Lock(); drawview->SetPenSize(d->pensize); drawview->SetDrawingMode(d->draw_mode); - int32 ptindex=0; - drawview->BeginLineArray(numlines); for(int32 i=0; iAddLine(pt1,pt2,col); - + data=(const LineArrayData *)&linedata[i]; + drawview->AddLine(data->pt1,data->pt2,data->color); } drawview->EndLineArray(); diff --git a/src/servers/app/server/ViewDriver.h b/src/servers/app/server/ViewDriver.h index 9e27517b74..d64131c321 100644 --- a/src/servers/app/server/ViewDriver.h +++ b/src/servers/app/server/ViewDriver.h @@ -110,8 +110,8 @@ public: virtual void InvertRect(const BRect &r); - virtual void StrokeLineArray(BPoint *pts, const int32 &numlines, - const DrawData *d, RGBColor *colors); + virtual void StrokeLineArray(const int32 &numlines, const LineArrayData *data, + const DrawData *d); virtual void SetMode(const display_mode &mode);