diff --git a/src/servers/app/server/Layer.cpp b/src/servers/app/server/Layer.cpp index 08f902684d..a95b70a416 100644 --- a/src/servers/app/server/Layer.cpp +++ b/src/servers/app/server/Layer.cpp @@ -40,7 +40,8 @@ #include "RootLayer.h" #include "DisplayDriver.h" #include "LayerData.h" -#include +#include "PortLink.h" +#include "ServerProtocol.h" //#define DEBUG_LAYER #ifdef DEBUG_LAYER @@ -1159,6 +1160,18 @@ void Layer::MoveBy(float x, float y) return; } + BPortLink msg(-1, -1); + msg.StartMessage(AS_ROOTLAYER_LAYER_MOVE); + msg.Attach(this); + msg.Attach(x); + msg.Attach(y); + GetRootLayer()->EnqueueMessage(msg); + + STRACE(("Layer(%s)::MoveBy() END\n", GetName())); +} + +void Layer::move_layer(float x, float y) +{ fFrameAction = B_LAYER_ACTION_MOVE; BPoint pt(x,y); @@ -1171,8 +1184,6 @@ void Layer::MoveBy(float x, float y) EmptyGlobals(); fFrameAction = B_LAYER_ACTION_NONE; - - STRACE(("Layer(%s)::MoveBy() END\n", GetName())); } void Layer::EmptyGlobals() @@ -1265,6 +1276,18 @@ void Layer::ResizeBy(float x, float y) return; } + BPortLink msg(-1, -1); + msg.StartMessage(AS_ROOTLAYER_LAYER_RESIZE); + msg.Attach(this); + msg.Attach(x); + msg.Attach(y); + GetRootLayer()->EnqueueMessage(msg); + + STRACE(("Layer(%s)::ResizeBy() END\n", GetName())); +} + +void Layer::resize_layer(float x, float y) +{ fFrameAction = B_LAYER_ACTION_RESIZE; BPoint pt(x,y); @@ -1280,8 +1303,6 @@ void Layer::ResizeBy(float x, float y) EmptyGlobals(); fFrameAction = B_LAYER_ACTION_NONE; - - STRACE(("Layer(%s)::ResizeBy() END\n", GetName())); } //! Prints information about the layer's current state diff --git a/src/servers/app/server/Layer.h b/src/servers/app/server/Layer.h index 9fa75fbc9f..ba69d20ef4 100644 --- a/src/servers/app/server/Layer.h +++ b/src/servers/app/server/Layer.h @@ -158,6 +158,9 @@ protected: friend class ServerWindow; friend class Workspace; + void move_layer(float x, float y); + void resize_layer(float x, float y); + BRect fFrame; BPoint fBoundsLeftTop; Layer *fParent; diff --git a/src/servers/app/server/RootLayer.cpp b/src/servers/app/server/RootLayer.cpp index a7551972ee..e8d509c751 100644 --- a/src/servers/app/server/RootLayer.cpp +++ b/src/servers/app/server/RootLayer.cpp @@ -211,6 +211,26 @@ int32 RootLayer::WorkingThread(void *data) oneRootLayer->redraw_layer(layer, redrawRegion); break; } + case AS_ROOTLAYER_LAYER_MOVE: + { + Layer *layer = NULL; + float x, y; + messageQueue.Read(&layer); + messageQueue.Read(&x); + messageQueue.Read(&y); + layer->move_layer(x, y); + break; + } + case AS_ROOTLAYER_LAYER_RESIZE: + { + Layer *layer = NULL; + float x, y; + messageQueue.Read(&layer); + messageQueue.Read(&x); + messageQueue.Read(&y); + layer->resize_layer(x, y); + break; + } default: STRACE(("RootLayer(%s)::WorkingThread received unexpected code %lx\n",oneRootLayer->GetName(), oneRootLayer->code)); break; @@ -244,6 +264,12 @@ void RootLayer::invalidate_layer(Layer *layer, const BRegion ®ion) layer->FullInvalidate(region); } +status_t RootLayer::EnqueueMessage(BPortLink &message) +{ + message.SetSendPort(fListenPort); + message.Flush(); +} + void RootLayer::GoRedraw(const Layer *layer, const BRegion ®ion) { BPortLink msg(fListenPort, -1); diff --git a/src/servers/app/server/RootLayer.h b/src/servers/app/server/RootLayer.h index ccf13862c2..0495441906 100644 --- a/src/servers/app/server/RootLayer.h +++ b/src/servers/app/server/RootLayer.h @@ -42,6 +42,7 @@ class Screen; class WinBorder; class Desktop; class DisplayDriver; +class BPortLink; /*! \class RootLayer RootLayer.h @@ -115,6 +116,7 @@ public: void Unlock() { fAllRegionsLock.Unlock(); } bool IsLocked() { return fAllRegionsLock.IsLocked(); } void RunThread(); + status_t EnqueueMessage(BPortLink &message); void GoInvalidate(const Layer *layer, const BRegion ®ion); void GoRedraw(const Layer *layer, const BRegion ®ion); diff --git a/src/servers/app/server/WinBorder.cpp b/src/servers/app/server/WinBorder.cpp index 280b484bc5..f149fa9e0a 100644 --- a/src/servers/app/server/WinBorder.cpp +++ b/src/servers/app/server/WinBorder.cpp @@ -411,7 +411,7 @@ void WinBorder::MoveBy(float x, float y) if(fDecorator) fDecorator->MoveBy(x,y); - Layer::MoveBy(x,y); + move_layer(x,y); } //! Resizes the winborder with redraw @@ -423,7 +423,7 @@ void WinBorder::ResizeBy(float x, float y) if(fDecorator) fDecorator->ResizeBy(x,y); - Layer::ResizeBy(x,y); + resize_layer(x,y); } //! Returns true if hidden