When embedded on the Desktop as a replicent, prevent the Desktop view from
painting over the workspaces view. The way this is currently handled in app_server makes it flicker even in double buffered mode. git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@29791 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
@@ -89,6 +89,10 @@ class WorkspacesView : public BView {
|
|||||||
static WorkspacesView* Instantiate(BMessage* archive);
|
static WorkspacesView* Instantiate(BMessage* archive);
|
||||||
virtual status_t Archive(BMessage* archive, bool deep = true) const;
|
virtual status_t Archive(BMessage* archive, bool deep = true) const;
|
||||||
|
|
||||||
|
virtual void AttachedToWindow();
|
||||||
|
virtual void DetachedFromWindow();
|
||||||
|
virtual void FrameMoved(BPoint newPosition);
|
||||||
|
virtual void FrameResized(float newWidth, float newHeight);
|
||||||
virtual void MessageReceived(BMessage* message);
|
virtual void MessageReceived(BMessage* message);
|
||||||
virtual void MouseMoved(BPoint where, uint32 transit,
|
virtual void MouseMoved(BPoint where, uint32 transit,
|
||||||
const BMessage* dragMessage);
|
const BMessage* dragMessage);
|
||||||
@@ -96,6 +100,13 @@ class WorkspacesView : public BView {
|
|||||||
|
|
||||||
private:
|
private:
|
||||||
void _AboutRequested();
|
void _AboutRequested();
|
||||||
|
|
||||||
|
void _UpdateParentClipping();
|
||||||
|
void _ExcludeFromParentClipping();
|
||||||
|
void _CleanupParentClipping();
|
||||||
|
|
||||||
|
BView* fParentWhichDrawsOnChildren;
|
||||||
|
BRect fCurrentFrame;
|
||||||
};
|
};
|
||||||
|
|
||||||
class WorkspacesWindow : public BWindow {
|
class WorkspacesWindow : public BWindow {
|
||||||
@@ -290,7 +301,11 @@ WorkspacesSettings::SetWindowFrame(BRect frame)
|
|||||||
|
|
||||||
|
|
||||||
WorkspacesView::WorkspacesView(BRect frame)
|
WorkspacesView::WorkspacesView(BRect frame)
|
||||||
: BView(frame, "workspaces", B_FOLLOW_ALL, kWorkspacesViewFlag)
|
:
|
||||||
|
BView(frame, "workspaces", B_FOLLOW_ALL,
|
||||||
|
kWorkspacesViewFlag | B_FRAME_EVENTS),
|
||||||
|
fParentWhichDrawsOnChildren(NULL),
|
||||||
|
fCurrentFrame(frame)
|
||||||
{
|
{
|
||||||
frame.OffsetTo(B_ORIGIN);
|
frame.OffsetTo(B_ORIGIN);
|
||||||
frame.top = frame.bottom - 7;
|
frame.top = frame.bottom - 7;
|
||||||
@@ -302,8 +317,13 @@ WorkspacesView::WorkspacesView(BRect frame)
|
|||||||
|
|
||||||
|
|
||||||
WorkspacesView::WorkspacesView(BMessage* archive)
|
WorkspacesView::WorkspacesView(BMessage* archive)
|
||||||
: BView(archive)
|
:
|
||||||
|
BView(archive),
|
||||||
|
fParentWhichDrawsOnChildren(NULL),
|
||||||
|
fCurrentFrame(Frame())
|
||||||
{
|
{
|
||||||
|
// Just in case we are instantiated from an older archive...
|
||||||
|
SetFlags(Flags() | B_FRAME_EVENTS);
|
||||||
// Make sure the auto-raise feature didn't leave any artifacts - this is
|
// Make sure the auto-raise feature didn't leave any artifacts - this is
|
||||||
// not a good idea to keep enabled for a replicant.
|
// not a good idea to keep enabled for a replicant.
|
||||||
if (EventMask() != 0)
|
if (EventMask() != 0)
|
||||||
@@ -361,6 +381,75 @@ WorkspacesView::_AboutRequested()
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void
|
||||||
|
WorkspacesView::AttachedToWindow()
|
||||||
|
{
|
||||||
|
BView* parent = Parent();
|
||||||
|
if (parent != NULL && (parent->Flags() & B_DRAW_ON_CHILDREN) != 0) {
|
||||||
|
fParentWhichDrawsOnChildren = parent;
|
||||||
|
_ExcludeFromParentClipping();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void
|
||||||
|
WorkspacesView::DetachedFromWindow()
|
||||||
|
{
|
||||||
|
if (fParentWhichDrawsOnChildren != NULL)
|
||||||
|
_CleanupParentClipping();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void
|
||||||
|
WorkspacesView::FrameMoved(BPoint newPosition)
|
||||||
|
{
|
||||||
|
_UpdateParentClipping();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void
|
||||||
|
WorkspacesView::FrameResized(float newWidth, float newHeight)
|
||||||
|
{
|
||||||
|
_UpdateParentClipping();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void
|
||||||
|
WorkspacesView::_UpdateParentClipping()
|
||||||
|
{
|
||||||
|
if (fParentWhichDrawsOnChildren != NULL) {
|
||||||
|
_CleanupParentClipping();
|
||||||
|
_ExcludeFromParentClipping();
|
||||||
|
fParentWhichDrawsOnChildren->Invalidate(fCurrentFrame);
|
||||||
|
fCurrentFrame = Frame();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void
|
||||||
|
WorkspacesView::_ExcludeFromParentClipping()
|
||||||
|
{
|
||||||
|
// Prevent the parent view to draw over us. Do so in a way that allows
|
||||||
|
// restoring the parent to the previous state.
|
||||||
|
fParentWhichDrawsOnChildren->PushState();
|
||||||
|
|
||||||
|
BRegion clipping(fParentWhichDrawsOnChildren->Bounds());
|
||||||
|
clipping.Exclude(Frame());
|
||||||
|
fParentWhichDrawsOnChildren->ConstrainClippingRegion(&clipping);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void
|
||||||
|
WorkspacesView::_CleanupParentClipping()
|
||||||
|
{
|
||||||
|
// Restore the previous parent state. NOTE: This relies on views
|
||||||
|
// being detached in exactly the opposite order as them being
|
||||||
|
// attached. Otherwise we would mess up states if a sibbling view did
|
||||||
|
// the same thing we did in AttachedToWindow()...
|
||||||
|
fParentWhichDrawsOnChildren->PopState();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
void
|
void
|
||||||
WorkspacesView::MessageReceived(BMessage* message)
|
WorkspacesView::MessageReceived(BMessage* message)
|
||||||
{
|
{
|
||||||
|
|||||||
Reference in New Issue
Block a user