work around for layers not being moved that have not yet been added to the tree. See WinBorder::MoveTo for the explaination. The same problem should be at other places and most likely for normal views as well. This fixes BWindow::MoveXX() when it is not yet Show()n

git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@12500 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
Stephan Aßmus 2005-04-28 23:56:40 +00:00
parent 879fd19be5
commit 1596a167c0
5 changed files with 56 additions and 24 deletions

View File

@ -1911,7 +1911,6 @@ void BWindow::MoveBy(float dx, float dy)
void BWindow::MoveTo( BPoint point ) void BWindow::MoveTo( BPoint point )
{ {
printf("BWindow::MoveTo(%.1f, %.1f)\n", point.x, point.y);
Lock(); Lock();
if (fFrame.left != point.x || fFrame.top != point.y) { if (fFrame.left != point.x || fFrame.top != point.y) {

View File

@ -559,11 +559,13 @@ Layer::RebuildRegions( const BRegion& reg, uint32 action, BPoint pt, BPoint ptOf
switch(action) { switch(action) {
case B_LAYER_NONE: { case B_LAYER_NONE: {
RBTRACE(("1) Layer(%s): Action B_LAYER_NONE\n", GetName())); RBTRACE(("1) Layer(%s): Action B_LAYER_NONE\n", GetName()));
STRACE(("1) Layer(%s): Action B_LAYER_NONE\n", GetName()));
oldRegion = fVisible; oldRegion = fVisible;
break; break;
} }
case B_LAYER_MOVE: { case B_LAYER_MOVE: {
RBTRACE(("1) Layer(%s): Action B_LAYER_MOVE\n", GetName())); RBTRACE(("1) Layer(%s): Action B_LAYER_MOVE\n", GetName()));
STRACE(("1) Layer(%s): Action B_LAYER_MOVE\n", GetName()));
oldRegion = fFullVisible; oldRegion = fFullVisible;
fFrame.OffsetBy(pt.x, pt.y); fFrame.OffsetBy(pt.x, pt.y);
fFull.OffsetBy(pt.x, pt.y); fFull.OffsetBy(pt.x, pt.y);
@ -576,12 +578,14 @@ Layer::RebuildRegions( const BRegion& reg, uint32 action, BPoint pt, BPoint ptOf
} }
case B_LAYER_SIMPLE_MOVE: { case B_LAYER_SIMPLE_MOVE: {
RBTRACE(("1) Layer(%s): Action B_LAYER_SIMPLE_MOVE\n", GetName())); RBTRACE(("1) Layer(%s): Action B_LAYER_SIMPLE_MOVE\n", GetName()));
STRACE(("1) Layer(%s): Action B_LAYER_SIMPLE_MOVE\n", GetName()));
fFull.OffsetBy(pt.x, pt.y); fFull.OffsetBy(pt.x, pt.y);
break; break;
} }
case B_LAYER_RESIZE: { case B_LAYER_RESIZE: {
RBTRACE(("1) Layer(%s): Action B_LAYER_RESIZE\n", GetName())); RBTRACE(("1) Layer(%s): Action B_LAYER_RESIZE\n", GetName()));
STRACE(("1) Layer(%s): Action B_LAYER_RESIZE\n", GetName()));
oldRegion = fVisible; oldRegion = fVisible;
fFrame.right += pt.x; fFrame.right += pt.x;
@ -596,6 +600,7 @@ Layer::RebuildRegions( const BRegion& reg, uint32 action, BPoint pt, BPoint ptOf
} }
case B_LAYER_MASK_RESIZE: { case B_LAYER_MASK_RESIZE: {
RBTRACE(("1) Layer(%s): Action B_LAYER_MASK_RESIZE\n", GetName())); RBTRACE(("1) Layer(%s): Action B_LAYER_MASK_RESIZE\n", GetName()));
STRACE(("1) Layer(%s): Action B_LAYER_MASK_RESIZE\n", GetName()));
oldRegion = fVisible; oldRegion = fVisible;
BPoint offset, rSize; BPoint offset, rSize;
@ -1265,20 +1270,23 @@ Layer::move_layer(float x, float y)
{ {
fFrameAction = B_LAYER_ACTION_MOVE; fFrameAction = B_LAYER_ACTION_MOVE;
BPoint pt(x,y); /* if (fClassID == AS_WINBORDER_CLASS) {
BRect rect(fFull.Frame().OffsetByCopy(pt));
if (fClassID == AS_WINBORDER_CLASS) {
WinBorder *wb = (WinBorder*)this; WinBorder *wb = (WinBorder*)this;
wb->zUpdateReg.OffsetBy(x, y); wb->zUpdateReg.OffsetBy(x, y);
wb->yUpdateReg.OffsetBy(x, y); wb->yUpdateReg.OffsetBy(x, y);
wb->fUpdateReg.OffsetBy(x, y); wb->fUpdateReg.OffsetBy(x, y);
} }*/
BPoint pt(x, y);
BRect rect(fFull.Frame().OffsetByCopy(pt));
fParent->StartRebuildRegions(BRegion(rect), this, B_LAYER_MOVE, pt); fParent->StartRebuildRegions(BRegion(rect), this, B_LAYER_MOVE, pt);
fDriver->CopyRegionList(&fRootLayer->fCopyRegList, fDriver->CopyRegionList(&fRootLayer->fCopyRegList,
&fRootLayer->fCopyList, &fRootLayer->fCopyList,
fRootLayer->fCopyRegList.CountItems(), fRootLayer->fCopyRegList.CountItems(),
&fFullVisible); &fFullVisible);
fParent->Redraw(fRootLayer->fRedrawReg, this); fParent->Redraw(fRootLayer->fRedrawReg, this);
EmptyGlobals(); EmptyGlobals();

View File

@ -199,6 +199,10 @@ class Layer {
void Invalidate(const BRegion& region); void Invalidate(const BRegion& region);
BRect fFrame; BRect fFrame;
// TODO: should be removed or reused in a similar fashion
// to hold the accumulated origins from the graphics state stack.
// The same needs to be done for "scale". (Keeping an accumulated
// value.)
// BPoint fBoundsLeftTop; // BPoint fBoundsLeftTop;
WinBorder* fOwner; WinBorder* fOwner;
Layer* fParent; Layer* fParent;

View File

@ -1227,17 +1227,13 @@ void RootLayer::MouseEventHandler(int32 code, BPortLink& msg)
} }
} }
if (winBorderUnder) if (winBorderUnder) {
{
BPoint pt = evt.where;
pt -= fLastMousePossition;
if (fMovingWindow) BPoint delta = evt.where - fLastMousePossition;
{
if(winBorderUnder->fDecorator)
winBorderUnder->fDecorator->MoveBy(pt.x, pt.y);
winBorderUnder->move_layer(pt.x, pt.y); if (fMovingWindow) {
winBorderUnder->MoveBy(delta.x, delta.y);
// I know the way we get BWindow's new location it's not nice :-), // I know the way we get BWindow's new location it's not nice :-),
// but I don't see another way. fTopLayer.Frame().LeftTop() does not change, ever. // but I don't see another way. fTopLayer.Frame().LeftTop() does not change, ever.
@ -1245,22 +1241,18 @@ void RootLayer::MouseEventHandler(int32 code, BPortLink& msg)
BMessage msg(B_WINDOW_MOVED); BMessage msg(B_WINDOW_MOVED);
msg.AddPoint("where", location); msg.AddPoint("where", location);
winBorderUnder->Window()->SendMessageToClient(&msg, B_NULL_TOKEN, false); winBorderUnder->Window()->SendMessageToClient(&msg, B_NULL_TOKEN, false);
}
else if (fResizingWindow)
{
if(winBorderUnder->fDecorator)
winBorderUnder->fDecorator->ResizeBy(pt.x, pt.y);
winBorderUnder->resize_layer(pt.x, pt.y); } else if (fResizingWindow) {
winBorderUnder->ResizeBy(delta.x, delta.y);
BRect frame(winBorderUnder->fTopLayer->Frame()); BRect frame(winBorderUnder->fTopLayer->Frame());
BMessage msg(B_WINDOW_RESIZED); BMessage msg(B_WINDOW_RESIZED);
msg.AddInt32("width", frame.Width()); msg.AddInt32("width", frame.Width());
msg.AddInt32("height", frame.Height()); msg.AddInt32("height", frame.Height());
winBorderUnder->Window()->SendMessageToClient(&msg, B_NULL_TOKEN, false); winBorderUnder->Window()->SendMessageToClient(&msg, B_NULL_TOKEN, false);
}
else } else {
{
winBorderUnder->MouseMoved(winBorderUnder->TellWhat(evt)); winBorderUnder->MouseMoved(winBorderUnder->TellWhat(evt));
} }
} }

View File

@ -313,7 +313,36 @@ void WinBorder::MoveBy(float x, float y)
if(fDecorator) if(fDecorator)
fDecorator->MoveBy(x,y); fDecorator->MoveBy(x,y);
move_layer(x,y); // NOTE: I moved this here from Layer::move_layer()
// Should this have any bad consequences I'm not aware of?
zUpdateReg.OffsetBy(x, y);
yUpdateReg.OffsetBy(x, y);
fUpdateReg.OffsetBy(x, y);
if (IsHidden()) {
// TODO: This is a work around for a design issue:
// The actual movement of a layer is done during
// the region rebuild. The mechanism is somewhat
// complicated and scheduled for refractoring...
// The problem here for hidden layers is that
// they seem *not* to be part of the layer tree.
// I don't think this is wrong as such, but of
// course the rebuilding of regions does not take
// place then. I don't understand yet the consequences
// for normal views, but this here fixes at least
// BWindows being MoveTo()ed before they are Show()n.
// In Layer::move_to, StartRebuildRegions() is called
// on fParent. But the rest of the this layers tree
// has not been added to fParent apperantly. So now
// you ask why fParent is even valid? Me too.
fFrame.OffsetBy(x, y);
fFull.OffsetBy(x, y);
fTopLayer->move_layer(x, y);
// ...and here we get really hacky...
fTopLayer->fFrame.OffsetTo(0.0, 0.0);
} else {
move_layer(x, y);
}
} }
//! Resizes the winborder with redraw //! Resizes the winborder with redraw