moving and resizing windows works with the new clipping code. scrolling BViews also works.

git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@13311 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
Adi Oanca 2005-06-28 12:25:32 +00:00
parent 3b3a60ad5a
commit ecf3bc3eb4
7 changed files with 113 additions and 50 deletions

View File

@ -891,6 +891,7 @@ Layer::Draw(const BRect &rect)
fDriver->FillRect(rect, ViewColor()); fDriver->FillRect(rect, ViewColor());
} }
#ifndef NEW_CLIPPING
// EmptyGlobals // EmptyGlobals
void void
Layer::EmptyGlobals() Layer::EmptyGlobals()
@ -907,6 +908,7 @@ Layer::EmptyGlobals()
delete (BPoint*)fRootLayer->fCopyList.ItemAt(i); delete (BPoint*)fRootLayer->fCopyList.ItemAt(i);
fRootLayer->fCopyList.MakeEmpty(); fRootLayer->fCopyList.MakeEmpty();
} }
#endif
/*! /*!
\brief Shows the layer \brief Shows the layer
@ -1056,6 +1058,22 @@ Layer::ResizeBy(float x, float y)
STRACE(("Layer(%s)::ResizeBy() END\n", Name())); STRACE(("Layer(%s)::ResizeBy() END\n", Name()));
} }
//! scrolls the layer by the specified amount, complete with redraw
void
Layer::ScrollBy(float x, float y)
{
STRACE(("Layer(%s)::ScrollBy() START\n", Name()));
BPrivate::PortLink msg(-1, -1);
msg.StartMessage(AS_ROOTLAYER_LAYER_SCROLL);
msg.Attach<Layer*>(this);
msg.Attach<float>(x);
msg.Attach<float>(y);
GetRootLayer()->EnqueueMessage(msg);
STRACE(("Layer(%s)::ScrollBy() END\n", Name()));
}
// BoundsOrigin // BoundsOrigin
BPoint BPoint
Layer::BoundsOrigin() const Layer::BoundsOrigin() const
@ -1835,9 +1853,9 @@ Layer::do_Invalidate(const BRegion &invalid, const Layer *startFrom)
startFrom? startFrom: BottomChild()); startFrom? startFrom: BottomChild());
// add localVisible to our RootLayer's redraw region. // add localVisible to our RootLayer's redraw region.
GetRootLayer()->fRedrawReg.Include(&localVisible); // GetRootLayer()->fRedrawReg.Include(&localVisible);
// TODO: --- GetRootLayer()->fRedrawReg = localVisible;
GetRootLayer()->RequestDraw(GetRootLayer()->fRedrawReg, BottomChild()); GetRootLayer()->RequestDraw(GetRootLayer()->fRedrawReg, NULL);
// GetRootLayer()->RequestRedraw(); // TODO: what if we pass (fParent, startFromTHIS, &redrawReg)? // GetRootLayer()->RequestRedraw(); // TODO: what if we pass (fParent, startFromTHIS, &redrawReg)?
} }
@ -1848,9 +1866,9 @@ Layer::do_Redraw(const BRegion &invalid, const Layer *startFrom)
localVisible.IntersectWith(&invalid); localVisible.IntersectWith(&invalid);
// add localVisible to our RootLayer's redraw region. // add localVisible to our RootLayer's redraw region.
GetRootLayer()->fRedrawReg.Include(&localVisible); // GetRootLayer()->fRedrawReg.Include(&localVisible);
// TODO: --- GetRootLayer()->fRedrawReg = localVisible;
GetRootLayer()->RequestDraw(GetRootLayer()->fRedrawReg, BottomChild()); GetRootLayer()->RequestDraw(GetRootLayer()->fRedrawReg, NULL);
// GetRootLayer()->RequestRedraw(); // TODO: what if we pass (fParent, startFromTHIS, &redrawReg)? // GetRootLayer()->RequestRedraw(); // TODO: what if we pass (fParent, startFromTHIS, &redrawReg)?
} }
@ -2029,7 +2047,8 @@ Layer::do_ResizeBy(float dx, float dy)
rezize_layer_redraw_more(redrawReg, dx, dy); rezize_layer_redraw_more(redrawReg, dx, dy);
// add redrawReg to our RootLayer's redraw region. // add redrawReg to our RootLayer's redraw region.
GetRootLayer()->fRedrawReg.Include(&redrawReg); // GetRootLayer()->fRedrawReg.Include(&redrawReg);
GetRootLayer()->fRedrawReg = redrawReg;
// include layer's visible region in case we want a full update on resize // include layer's visible region in case we want a full update on resize
if (fFlags & B_FULL_UPDATE_ON_RESIZE && fVisible2.Frame().IsValid()) { if (fFlags & B_FULL_UPDATE_ON_RESIZE && fVisible2.Frame().IsValid()) {
resize_layer_full_update_on_resize(GetRootLayer()->fRedrawReg, dx, dy); resize_layer_full_update_on_resize(GetRootLayer()->fRedrawReg, dx, dy);
@ -2038,8 +2057,7 @@ Layer::do_ResizeBy(float dx, float dy)
GetRootLayer()->fRedrawReg.Include(&oldVisible); GetRootLayer()->fRedrawReg.Include(&oldVisible);
} }
// clear canvas and set invalid regions for affected WinBorders // clear canvas and set invalid regions for affected WinBorders
// TODO: --- GetRootLayer()->RequestDraw(GetRootLayer()->fRedrawReg, NULL);
GetRootLayer()->RequestDraw(GetRootLayer()->fRedrawReg, BottomChild());
// GetRootLayer()->RequestRedraw(); // TODO: what if we pass (fParent, startFromTHIS, &redrawReg)? // GetRootLayer()->RequestRedraw(); // TODO: what if we pass (fParent, startFromTHIS, &redrawReg)?
} }
} }
@ -2085,13 +2103,12 @@ void Layer::do_MoveBy(float dx, float dy)
// offset back and instruct the HW to do the actual copying. // offset back and instruct the HW to do the actual copying.
oldFullVisible.OffsetBy(-dx, -dy); oldFullVisible.OffsetBy(-dx, -dy);
// TODO: uncomment!!! GetDisplayDriver()->CopyRegion(&oldFullVisible, dx, dy);
// GetRootLayer()->CopyRegion(&oldFullVisible, dx, dy);
// add redrawReg to our RootLayer's redraw region. // add redrawReg to our RootLayer's redraw region.
GetRootLayer()->fRedrawReg.Include(&redrawReg); // GetRootLayer()->fRedrawReg.Include(&redrawReg);
// TODO: --- GetRootLayer()->fRedrawReg = redrawReg;
GetRootLayer()->RequestDraw(GetRootLayer()->fRedrawReg, BottomChild()); GetRootLayer()->RequestDraw(GetRootLayer()->fRedrawReg, NULL);
// GetRootLayer()->RequestRedraw(); // TODO: what if we pass (fParent, startFromTHIS, &redrawReg)? // GetRootLayer()->RequestRedraw(); // TODO: what if we pass (fParent, startFromTHIS, &redrawReg)?
} }
} }
@ -2118,17 +2135,16 @@ Layer::do_ScrollBy(float dx, float dy)
// compute the common region. we'll use HW acc to copy this to the new location. // compute the common region. we'll use HW acc to copy this to the new location.
invalid.IntersectWith(&fFullVisible2); invalid.IntersectWith(&fFullVisible2);
// TODO: uncomment!!! GetDisplayDriver()->CopyRegion(&invalid, -dx, -dy);
// GetRootLayer()->CopyRegion(&invalid, -dx, -dy);
// common region goes back to its original location. then, by excluding // common region goes back to its original location. then, by excluding
// it from curent fullVisible we'll obtain the region that needs to be redrawn. // it from curent fullVisible we'll obtain the region that needs to be redrawn.
invalid.OffsetBy(-dx, -dy); invalid.OffsetBy(-dx, -dy);
redrawReg.Exclude(&invalid); redrawReg.Exclude(&invalid);
GetRootLayer()->fRedrawReg.Include(&redrawReg); // GetRootLayer()->fRedrawReg.Include(&redrawReg);
// TODO: --- GetRootLayer()->fRedrawReg = redrawReg;
GetRootLayer()->RequestDraw(GetRootLayer()->fRedrawReg, BottomChild()); GetRootLayer()->RequestDraw(GetRootLayer()->fRedrawReg, NULL);
// GetRootLayer()->RequestRedraw(); // TODO: what if we pass (fParent, startFromTHIS, &redrawReg)? // GetRootLayer()->RequestRedraw(); // TODO: what if we pass (fParent, startFromTHIS, &redrawReg)?
} }

View File

@ -110,14 +110,15 @@ class Layer {
uint32 ResizeOthers(float x, float y, uint32 ResizeOthers(float x, float y,
BPoint coords[], BPoint coords[],
BPoint* ptOffset); BPoint* ptOffset);
void EmptyGlobals();
#endif #endif
void Redraw(const BRegion& reg, void Redraw(const BRegion& reg,
Layer* startFrom = NULL); Layer* startFrom = NULL);
virtual void Draw(const BRect& r); virtual void Draw(const BRect& r);
void EmptyGlobals();
void Show(bool invalidate = true); void Show(bool invalidate = true);
void Hide(bool invalidate = true); void Hide(bool invalidate = true);
bool IsHidden() const; bool IsHidden() const;
@ -132,6 +133,7 @@ class Layer {
virtual void MoveBy(float x, float y); virtual void MoveBy(float x, float y);
virtual void ResizeBy(float x, float y); virtual void ResizeBy(float x, float y);
virtual void ScrollBy(float x, float y);
BPoint BoundsOrigin() const; // BoundsFrameDiff()? BPoint BoundsOrigin() const; // BoundsFrameDiff()?
float Scale() const; float Scale() const;

View File

@ -338,6 +338,20 @@ RootLayer::WorkingThread(void *data)
layer->resize_layer(x, y); layer->resize_layer(x, y);
#else #else
layer->do_ResizeBy(x, y); layer->do_ResizeBy(x, y);
#endif
break;
}
case AS_ROOTLAYER_LAYER_SCROLL:
{
Layer *layer = NULL;
float x, y;
messageQueue.Read<Layer*>(&layer);
messageQueue.Read<float>(&x);
messageQueue.Read<float>(&y);
#ifndef NEW_CLIPPING
// nothing
#else
layer->do_ScrollBy(x, y);
#endif #endif
break; break;
} }
@ -1417,7 +1431,6 @@ fprintf(stderr, "mouse position changed in B_MOUSE_UP (%.1f, %.1f) from last B_M
wheelmsg.AddInt64("when", evt.when); wheelmsg.AddInt64("when", evt.when);
wheelmsg.AddFloat("be:wheel_delta_x",evt.wheel_delta_x); wheelmsg.AddFloat("be:wheel_delta_x",evt.wheel_delta_x);
wheelmsg.AddFloat("be:wheel_delta_y",evt.wheel_delta_y); wheelmsg.AddFloat("be:wheel_delta_y",evt.wheel_delta_y);
fLastMouseMoved->Window()->SendMessageToClient(&wheelmsg, fLastMouseMoved->fViewToken, false); fLastMouseMoved->Window()->SendMessageToClient(&wheelmsg, fLastMouseMoved->fViewToken, false);
} }
} else { } else {

View File

@ -72,6 +72,9 @@ public:
virtual void MoveBy(float x, float y); virtual void MoveBy(float x, float y);
virtual void ResizeBy(float x, float y); virtual void ResizeBy(float x, float y);
virtual void ScrollBy(float x, float y)
{ // not allowed
}
// For the active workspaces // For the active workspaces
virtual Layer* TopChild(void) const; virtual Layer* TopChild(void) const;

View File

@ -413,7 +413,7 @@ ServerWindow::_DispatchMessage(int32 code, BPrivate::LinkReceiver &link)
link.Read<float>(&dh); link.Read<float>(&dh);
link.Read<float>(&dv); link.Read<float>(&dv);
#ifndef NEW_CLIPPING
// scroll visually by using the CopyBits() implementation // scroll visually by using the CopyBits() implementation
// this will also take care of invalidating previously invisible // this will also take care of invalidating previously invisible
// areas (areas scrolled into view) // areas (areas scrolled into view)
@ -436,7 +436,9 @@ ServerWindow::_DispatchMessage(int32 code, BPrivate::LinkReceiver &link)
fCurrentLayer->fLayerData->OffsetOrigin(BPoint(dh, dv)); fCurrentLayer->fLayerData->OffsetOrigin(BPoint(dh, dv));
_CopyBits(myRootLayer, fCurrentLayer, src, dst, xOffset, yOffset); _CopyBits(myRootLayer, fCurrentLayer, src, dst, xOffset, yOffset);
#else
fCurrentLayer->ScrollBy(dh, dv);
#endif
break; break;
} }

View File

@ -171,6 +171,8 @@ WinBorder::Draw(const BRect &r)
void void
WinBorder::MoveBy(float x, float y) WinBorder::MoveBy(float x, float y)
{ {
#ifndef NEW_CLIPPING
x = (float)int32(x); x = (float)int32(x);
y = (float)int32(y); y = (float)int32(y);
@ -181,8 +183,6 @@ y = (float)int32(y);
if (fDecorator) if (fDecorator)
fDecorator->MoveBy(x,y); fDecorator->MoveBy(x,y);
#ifndef NEW_CLIPPING
// NOTE: I moved this here from Layer::move_layer() // NOTE: I moved this here from Layer::move_layer()
// Should this have any bad consequences I'm not aware of? // Should this have any bad consequences I'm not aware of?
fCumulativeRegion.OffsetBy(x, y); fCumulativeRegion.OffsetBy(x, y);
@ -213,16 +213,16 @@ fInUpdateRegion.OffsetBy(x, y);
move_layer(x, y); move_layer(x, y);
} }
#else
// implement. maybe...
#endif
if (Window()) { if (Window()) {
// dispatch a message to the client informing about the changed size // dispatch a message to the client informing about the changed size
BMessage msg(B_WINDOW_MOVED); BMessage msg(B_WINDOW_MOVED);
msg.AddPoint("where", fFrame.LeftTop()); msg.AddPoint("where", fFrame.LeftTop());
Window()->SendMessageToClient(&msg, B_NULL_TOKEN, false); Window()->SendMessageToClient(&msg, B_NULL_TOKEN, false);
} }
#else
Layer::MoveBy(x, y);
#endif
} }
@ -234,6 +234,7 @@ WinBorder::ResizeBy(float x, float y)
if (!_ResizeBy(x, y)) if (!_ResizeBy(x, y))
return; return;
#ifndef NEW_CLIPPING
if (Window()) { if (Window()) {
// send a message to the client informing about the changed size // send a message to the client informing about the changed size
BMessage msg(B_WINDOW_RESIZED); BMessage msg(B_WINDOW_RESIZED);
@ -245,6 +246,7 @@ WinBorder::ResizeBy(float x, float y)
Window()->SendMessageToClient(&msg, B_NULL_TOKEN, false); Window()->SendMessageToClient(&msg, B_NULL_TOKEN, false);
} }
#endif
} }
@ -252,10 +254,6 @@ WinBorder::ResizeBy(float x, float y)
bool bool
WinBorder::_ResizeBy(float x, float y) WinBorder::_ResizeBy(float x, float y)
{ {
// ToDo: remove/fix these?
x = (float)int32(x);
y = (float)int32(y);
float wantWidth = fFrame.Width() + x; float wantWidth = fFrame.Width() + x;
float wantHeight = fFrame.Height() + y; float wantHeight = fFrame.Height() + y;
@ -276,10 +274,10 @@ y = (float)int32(y);
if (x == 0.0 && y == 0.0) if (x == 0.0 && y == 0.0)
return false; return false;
#ifndef NEW_CLIPPING
if (fDecorator) if (fDecorator)
fDecorator->ResizeBy(x, y); fDecorator->ResizeBy(x, y);
#ifndef NEW_CLIPPING
if (IsHidden()) { if (IsHidden()) {
// TODO: See large comment in MoveBy() // TODO: See large comment in MoveBy()
fFrame.right += x; fFrame.right += x;
@ -292,7 +290,7 @@ y = (float)int32(y);
} }
#else #else
// Do? I don't think so. The new move/resize/scroll hooks should handle these Layer::ResizeBy(x, y);
#endif #endif
return true; return true;
@ -396,6 +394,7 @@ WinBorder::SetSizeLimits(float minWidth, float maxWidth,
else if (maxHeightDiff < 0.0) // we're currently larger than maxHeight else if (maxHeightDiff < 0.0) // we're currently larger than maxHeight
yDiff = maxHeightDiff; yDiff = maxHeightDiff;
// Layer::ResizeBy(xDiff, yDiff);
ResizeBy(xDiff, yDiff); ResizeBy(xDiff, yDiff);
} }
@ -498,13 +497,21 @@ WinBorder::MouseMoved(const PointerEvent& event)
fBringToFrontOnRelease = false; fBringToFrontOnRelease = false;
BPoint delta = event.where - fLastMousePosition; BPoint delta = event.where - fLastMousePosition;
#ifndef NEW_CLIPPING
MoveBy(delta.x, delta.y); MoveBy(delta.x, delta.y);
#else
do_MoveBy(delta.x, delta.y);
#endif
} }
if (fIsResizing) { if (fIsResizing) {
BRect frame(fFrame.LeftTop(), event.where - fResizingClickOffset); BRect frame(fFrame.LeftTop(), event.where - fResizingClickOffset);
BPoint delta = frame.RightBottom() - fFrame.RightBottom(); BPoint delta = frame.RightBottom() - fFrame.RightBottom();
#ifndef NEW_CLIPPING
ResizeBy(delta.x, delta.y); ResizeBy(delta.x, delta.y);
#else
do_ResizeBy(delta.x, delta.y);
#endif
} }
if (fIsSlidingTab) { if (fIsSlidingTab) {
} }
@ -585,17 +592,6 @@ WinBorder::HighlightDecorator(bool active)
fDecorator->SetFocus(active); fDecorator->SetFocus(active);
} }
//! Returns true if the point is in the WinBorder's screen area
bool
WinBorder::HasPoint(const BPoint& pt) const
{
#ifndef NEW_CLIPPING
return fFullVisible.Contains(pt);
#else
return NULL;
#endif
}
// Unimplemented. Hook function for handling when system GUI colors change // Unimplemented. Hook function for handling when system GUI colors change
void void
WinBorder::UpdateColors() WinBorder::UpdateColors()
@ -695,6 +691,10 @@ WinBorder::_ActionFor(const PointerEvent& event) const
if (fTopLayer->fFullVisible.Contains(event.where)) if (fTopLayer->fFullVisible.Contains(event.where))
return DEC_NONE; return DEC_NONE;
else else
#else
if (fTopLayer->fFullVisible2.Contains(event.where))
return DEC_NONE;
else
#endif #endif
if (fDecorator) if (fDecorator)
return fDecorator->Clicked(event.where, event.buttons, event.modifiers); return fDecorator->Clicked(event.where, event.buttons, event.modifiers);
@ -705,12 +705,38 @@ WinBorder::_ActionFor(const PointerEvent& event) const
#ifdef NEW_CLIPPING #ifdef NEW_CLIPPING
void WinBorder::MovedByHook(float dx, float dy) void WinBorder::MovedByHook(float dx, float dy)
{ {
STRACE(("WinBorder(%s)::MovedByHook(%.1f, %.1f) fDecorator: %p\n", GetName(), x, y, fDecorator));
fDecRegion.OffsetBy(dx, dy); fDecRegion.OffsetBy(dx, dy);
if (fDecorator)
fDecorator->MoveBy(dx, dy);
fCumulativeRegion.OffsetBy(dx, dy);
fInUpdateRegion.OffsetBy(dx, dy);
// dispatch a message to the client informing about the changed size
BMessage msg(B_WINDOW_MOVED);
msg.AddInt64("when", system_time());
msg.AddPoint("where", Frame().LeftTop());
Window()->SendMessageToClient(&msg, B_NULL_TOKEN, false);
} }
void WinBorder::ResizedByHook(float dx, float dy, bool automatic) void WinBorder::ResizedByHook(float dx, float dy, bool automatic)
{ {
STRACE(("WinBorder(%s)::ResizedByHook(%.1f, %.1f, %s) fDecorator: %p\n", GetName(), x, y, automatic?"true":"false", fDecorator));
fRebuildDecRegion = true; fRebuildDecRegion = true;
if (fDecorator)
fDecorator->ResizeBy(dx, dy);
// send a message to the client informing about the changed size
BRect frame(fTopLayer->Frame());
BMessage msg(B_WINDOW_RESIZED);
msg.AddInt64("when", system_time());
msg.AddInt32("width", frame.IntegerWidth());
msg.AddInt32("height", frame.IntegerHeight());
Window()->SendMessageToClient(&msg, B_NULL_TOKEN, false);
} }
void WinBorder::set_decorator_region(BRect bounds) void WinBorder::set_decorator_region(BRect bounds)

View File

@ -63,6 +63,9 @@ class WinBorder : public Layer {
virtual void MoveBy(float x, float y); virtual void MoveBy(float x, float y);
virtual void ResizeBy(float x, float y); virtual void ResizeBy(float x, float y);
virtual void ScrollBy(float x, float y)
{ // not allowed
}
#ifndef NEW_CLIPPING #ifndef NEW_CLIPPING
virtual void RebuildFullRegion(); virtual void RebuildFullRegion();
#endif #endif
@ -108,8 +111,6 @@ class WinBorder : public Layer {
void HighlightDecorator(bool active); void HighlightDecorator(bool active);
bool HasPoint(const BPoint &pt) const;
inline void QuietlySetWorkspaces(uint32 wks) { fWorkspaces = wks; } inline void QuietlySetWorkspaces(uint32 wks) { fWorkspaces = wks; }
void QuietlySetFeel(int32 feel); void QuietlySetFeel(int32 feel);