diff --git a/src/add-ons/decorators/SATDecorator/SATWindow.cpp b/src/add-ons/decorators/SATDecorator/SATWindow.cpp index 4f463c729d..aea9911f97 100644 --- a/src/add-ons/decorators/SATDecorator/SATWindow.cpp +++ b/src/add-ons/decorators/SATDecorator/SATWindow.cpp @@ -89,6 +89,29 @@ SATWindow::PropagateToGroup(SATGroup* group, WindowArea* area) } +void +SATWindow::UpdateGroupWindowsSize() +{ + SATGroup* group = GetGroup(); + if (!group) + return; + + for (int i = 0; i < group->CountItems(); i++) { + SATWindow* window = group->WindowAt(i); + if (window == this) + continue; + window->UpdateWindowSize(); + } +} + + +void +SATWindow::UpdateWindowSize() +{ + fGroupCookie->UpdateWindowSize(); +} + + void SATWindow::MoveWindowToSAT(int32 workspace) { @@ -458,6 +481,17 @@ GroupCookie::MoveWindow(int32 workspace) } +void +GroupCookie::UpdateWindowSize() +{ + BRect frame = fSATWindow->CompleteWindowFrame(); + + // adjust window size soft constraints + widthConstraint->SetRightSide(frame.Width()); + heightConstraint->SetRightSide(frame.Height()); +} + + bool GroupCookie::Init(SATGroup* group, WindowArea* area) { @@ -474,11 +508,6 @@ GroupCookie::Init(SATGroup* group, WindowArea* area) rightBorder = linearSpec->AddVariable(); bottomBorder = linearSpec->AddVariable(); - leftBorder->SetRange(-DBL_MAX, DBL_MAX); - topBorder->SetRange(-DBL_MAX, DBL_MAX); - rightBorder->SetRange(-DBL_MAX, DBL_MAX); - bottomBorder->SetRange(-DBL_MAX, DBL_MAX); - if (!leftBorder || !topBorder || !rightBorder || !bottomBorder) { // clean up Uninit(); diff --git a/src/add-ons/decorators/SATDecorator/SATWindow.h b/src/add-ons/decorators/SATDecorator/SATWindow.h index a09bc51a7f..f3e22b92a8 100644 --- a/src/add-ons/decorators/SATDecorator/SATWindow.h +++ b/src/add-ons/decorators/SATDecorator/SATWindow.h @@ -32,6 +32,7 @@ public: void DoGroupLayout(SATWindow* triggerWindow); void MoveWindow(int32 workspace); + void UpdateWindowSize(); SATGroup* GetGroup() { return fSATGroup.Get(); } @@ -84,6 +85,9 @@ public: bool PropagateToGroup(SATGroup* group, WindowArea* area); + void UpdateGroupWindowsSize(); + void UpdateWindowSize(); + //! Move the window to the tab's position. void MoveWindowToSAT(int32 workspace); diff --git a/src/add-ons/decorators/SATDecorator/StackAndTile.cpp b/src/add-ons/decorators/SATDecorator/StackAndTile.cpp index ea0caec49c..bc96fad52b 100644 --- a/src/add-ons/decorators/SATDecorator/StackAndTile.cpp +++ b/src/add-ons/decorators/SATDecorator/StackAndTile.cpp @@ -165,16 +165,27 @@ StackAndTile::WindowMoved(Window* window) return; if (SATKeyPressed()) - satWindow->FindSnappingCandidates(); - else - satWindow->DoGroupLayout(); + satWindow->FindSnappingCandidates(); + else + satWindow->DoGroupLayout(); } void StackAndTile::WindowResized(Window* window) { - WindowMoved(window); + SATWindow* satWindow = GetSATWindow(window); + if (!satWindow) + return; + + if (SATKeyPressed()) + satWindow->FindSnappingCandidates(); + else { + satWindow->DoGroupLayout(); + // after solve the layout update the size constraints of all windows in + // the group + satWindow->UpdateGroupWindowsSize(); + } } @@ -185,7 +196,6 @@ StackAndTile::WindowActitvated(Window* window) if (!satWindow) return; _ActivateWindow(satWindow); - }