diff --git a/src/servers/app/Desktop.cpp b/src/servers/app/Desktop.cpp index 544ad6f341..c0cdd842cd 100644 --- a/src/servers/app/Desktop.cpp +++ b/src/servers/app/Desktop.cpp @@ -1484,7 +1484,7 @@ Desktop::MoveWindowBy(Window* window, float x, float y, int32 workspace) } stackWindow->Anchor(workspace).position += BPoint(x, y); - stackWindow->SetCurrentWorkspace(workspace); + stackWindow->SetPriorWorkspace(workspace); _WindowChanged(stackWindow); } } diff --git a/src/servers/app/Window.cpp b/src/servers/app/Window.cpp index 3585eea8a5..85609c4e41 100644 --- a/src/servers/app/Window.cpp +++ b/src/servers/app/Window.cpp @@ -112,6 +112,7 @@ Window::Window(const BRect& frame, const char *name, fFeel(feel), fWorkspaces(workspaces), fCurrentWorkspace(-1), + fPriorWorkspace(-1), fMinWidth(1), fMaxWidth(32768), diff --git a/src/servers/app/Window.h b/src/servers/app/Window.h index ebc84421fd..911e5ba51b 100644 --- a/src/servers/app/Window.h +++ b/src/servers/app/Window.h @@ -222,11 +222,16 @@ public: inline bool IsMinimized() const { return fMinimized; } void SetCurrentWorkspace(int32 index) - { fCurrentWorkspace = index; } + { fCurrentWorkspace = index; fPriorWorkspace = index; } int32 CurrentWorkspace() const { return fCurrentWorkspace; } bool IsVisible() const; + void SetPriorWorkspace(int32 index) + { fPriorWorkspace = index; } + int32 PriorWorkspace() const + { return fPriorWorkspace; } + bool IsDragging() const; bool IsResizing() const; @@ -430,6 +435,7 @@ protected: uint32 fFlags; uint32 fWorkspaces; int32 fCurrentWorkspace; + int32 fPriorWorkspace; int32 fMinWidth; int32 fMaxWidth; diff --git a/src/servers/app/stackandtile/SATGroup.cpp b/src/servers/app/stackandtile/SATGroup.cpp index 805e6a6b78..6b8efa803f 100644 --- a/src/servers/app/stackandtile/SATGroup.cpp +++ b/src/servers/app/stackandtile/SATGroup.cpp @@ -530,9 +530,10 @@ WindowArea::_MoveToSAT(SATWindow* triggerWindow) float deltaByY = round(frameSAT.bottom - frame.bottom); int32 workspace = triggerWindow->GetWindow()->CurrentWorkspace(); + if (workspace < 0) + workspace = triggerWindow->GetWindow()->PriorWorkspace(); Desktop* desktop = triggerWindow->GetWindow()->Desktop(); - desktop->MoveWindowBy(topWindow->GetWindow(), deltaToX, deltaToY, - workspace); + desktop->MoveWindowBy(topWindow->GetWindow(), deltaToX, deltaToY, workspace); // Update frame to the new position desktop->ResizeWindowBy(topWindow->GetWindow(), deltaByX, deltaByY); diff --git a/src/servers/app/stackandtile/SATWindow.cpp b/src/servers/app/stackandtile/SATWindow.cpp index 46a539b2db..633ce02949 100644 --- a/src/servers/app/stackandtile/SATWindow.cpp +++ b/src/servers/app/stackandtile/SATWindow.cpp @@ -389,11 +389,16 @@ BRect SATWindow::CompleteWindowFrame() { BRect frame = fWindow->Frame(); - if (fDesktop + if (fDesktop && fWindow->IsVisible() && fDesktop->CurrentWorkspace() != fWindow->CurrentWorkspace()) { window_anchor& anchor = fWindow->Anchor(fWindow->CurrentWorkspace()); if (anchor.position != kInvalidWindowPosition) frame.OffsetTo(anchor.position); + } else if (fDesktop && !fWindow->IsVisible() && fWindow->PriorWorkspace() >= 0 + && fDesktop->CurrentWorkspace() != fWindow->PriorWorkspace()) { + window_anchor& anchor = fWindow->Anchor(fWindow->PriorWorkspace()); + if (anchor.position != kInvalidWindowPosition) + frame.OffsetTo(anchor.position); } AddDecorator(frame);