From 63f09583e3e103ce95f222d848e87a7825ee09e7 Mon Sep 17 00:00:00 2001 From: Adi Oanca Date: Sat, 22 Jan 2005 23:25:41 +0000 Subject: [PATCH] Oups. Layer::MoveBy/ResizeBy() escaped me. :-) The actions they used to perform are now executed only by RootLayer's thread. git-svn-id: file:///srv/svn/repos/haiku/trunk/current@10972 a95241bf-73f2-0310-859d-f6bbb57e9c96 --- src/servers/app/server/Layer.cpp | 31 +++++++++++++++++++++++----- src/servers/app/server/Layer.h | 3 +++ src/servers/app/server/RootLayer.cpp | 26 +++++++++++++++++++++++ src/servers/app/server/RootLayer.h | 2 ++ src/servers/app/server/WinBorder.cpp | 4 ++-- 5 files changed, 59 insertions(+), 7 deletions(-) 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