Author: czeidler Date: 2010-05-20 05:51:01 +0200 (Thu, 20 May 2010) New Revision: 36872 Changeset: http://dev.haiku-os.org/changeset/36872/haiku Modified: haiku/branches/features/stack-and-tile/src/servers/app/Desktop.cpp haiku/branches/features/stack-and-tile/src/servers/app/Desktop.h haiku/branches/features/stack-and-tile/src/servers/app/StackAndTile.cpp haiku/branches/features/stack-and-tile/src/servers/app/StackAndTile.h Log: Replace Window specific SAT GetStackAndTileWindow function with own GetSATWindow. Now, Desktop only holds the SAT object and register it as a DesktopListener. Work in progress... Modified: haiku/branches/features/stack-and-tile/src/servers/app/Desktop.cpp =================================================================== --- haiku/branches/features/stack-and-tile/src/servers/app/Desktop.cpp 2010-05-20 03:46:26 UTC (rev 36871) +++ haiku/branches/features/stack-and-tile/src/servers/app/Desktop.cpp 2010-05-20 03:51:01 UTC (rev 36872) @@ -44,6 +44,7 @@ #include "ServerConfig.h" #include "ServerCursor.h" #include "ServerWindow.h" +#include "StackAndTile.h" #include "SystemPalette.h" #include "WindowPrivate.h" #include "Window.h" @@ -457,6 +458,7 @@ fBack(NULL) { fStackAndTile = new StackAndTile(this); + RegisterListener(fStackAndTile); memset(fLastWorkspaceFocus, 0, sizeof(fLastWorkspaceFocus)); @@ -473,6 +475,7 @@ Desktop::~Desktop() { + UnregisterListener(fStackAndTile); delete fStackAndTile; delete fSettings; Modified: haiku/branches/features/stack-and-tile/src/servers/app/Desktop.h =================================================================== --- haiku/branches/features/stack-and-tile/src/servers/app/Desktop.h 2010-05-20 03:46:26 UTC (rev 36871) +++ haiku/branches/features/stack-and-tile/src/servers/app/Desktop.h 2010-05-20 03:51:01 UTC (rev 36872) @@ -21,7 +21,6 @@ #include "Screen.h" #include "ScreenManager.h" #include "ServerCursor.h" -#include "StackAndTile.h" #include "VirtualScreen.h" #include "WindowList.h" #include "Workspace.h" @@ -51,6 +50,7 @@ class DrawingEngine; class HWInterface; class ServerApp; +class StackAndTile; class Window; class WorkspacesView; struct server_read_only_memory; Modified: haiku/branches/features/stack-and-tile/src/servers/app/StackAndTile.cpp =================================================================== --- haiku/branches/features/stack-and-tile/src/servers/app/StackAndTile.cpp 2010-05-20 03:46:26 UTC (rev 36871) +++ haiku/branches/features/stack-and-tile/src/servers/app/StackAndTile.cpp 2010-05-20 03:51:01 UTC (rev 36872) @@ -8,6 +8,9 @@ #include <Debug.h> +using namespace std; + + // #define DEBUG_STACK_AND_TILE @@ -38,13 +41,42 @@ void +StackAndTile::WindowAdded(Window* window) +{ + SATWindow* satWindow = new (std::nothrow)SATWindow( + window); + if (!satWindow) + return; + + ASSERT(fSATWindowMap.find(window) == fSATWindowMap.end()); + fSATWindowMap[window] = satWindow; +} + + +void +StackAndTile::WindowRemoved(Window* window) +{ + SATWindowMap::iterator it = fSATWindowMap.find( + window); + if (it == fSATWindowMap.end()) + return; + + // delete SATWindow + delete it->second; + fSATWindowMap.erase(it); +} + + +void StackAndTile::KeyEvent(uint32 what, int32 key, int32 modifiers) { if (what == B_KEY_DOWN || what == B_UNMAPPED_KEY_DOWN) { // switch between stacked windows if (modifiers & B_OPTION_KEY) { - BList* stackedWindows = fDesktop->FocusWindow()-> - GetStackAndTileWindow()->StackedWindows(); + SATWindow* satWindow = GetSATWindow(fDesktop->FocusWindow()); + if (!satWindow) + return; + BList* stackedWindows = satWindow->StackedWindows(); if (key == 0x61 && stackedWindows) { int32 oldIndex = stackedWindows->IndexOf(fDesktop->FocusWindow()); @@ -80,6 +112,73 @@ void +StackAndTile::MouseDown(Window* window) +{ + SATWindow* satWindow = GetSATWindow(window); + if (!satWindow) + return; + + satWindow->MouseDown(); +} + + +void +StackAndTile::MouseUp(Window* window) +{ + SATWindow* satWindow = GetSATWindow(window); + if (!satWindow) + return; + + satWindow->MouseUp(); +} + + +void +StackAndTile::MoveWindow(Window* window) +{ + SATWindow* satWindow = GetSATWindow(window); + if (!satWindow) + return; + + satWindow->MoveWindow(); +} + + +void +StackAndTile::ResizeWindow(Window* window) +{ + SATWindow* satWindow = GetSATWindow(window); + if (!satWindow) + return; + + satWindow->ResizeWindow(); +} + + +void +StackAndTile::ActivateWindow(Window* window, + WindowList& bringToTopList) +{ + SATWindow* satWindow = GetSATWindow(window); + if (!satWindow) + return; + + satWindow->ActivateWindow(window, bringToTopList); +} + + +bool +StackAndTile::SetDecoratorSettings(Window* window, const BMessage& settings) +{ + SATWindow* satWindow = GetSATWindow(window); + if (!satWindow) + return false; + + return satWindow->SetSettings(settings); +} + + +void StackAndTile::FinishStackingAndSnapping() { for (Window* window = fDesktop->CurrentWindows().LastWindow(); @@ -87,13 +186,35 @@ fDesktop->CurrentWorkspace())) { fDesktop->HighlightTab(window, false); fDesktop->HighlightBorders(window, false); - window->GetStackAndTileWindow()->FinishStackingAndSnapping(); + + SATWindow* windowSAT = GetSATWindow(window); + if (windowSAT) + windowSAT->FinishStackingAndSnapping(); } fIsStackingAndSnapping = false; } -StackAndTileWindow::StackAndTileWindow(Window* window) +SATWindow* +StackAndTile::GetSATWindow(Window* window) +{ + SATWindowMap::const_iterator it = fSATWindowMap.find( + window); + if (it != fSATWindowMap.end()) + return it->second; + + // If we don't know this window, memory allocation might has been failed + // previously. Try to add window now + SATWindow* satWindow = new (std::nothrow)SATWindow( + window); + if (satWindow) + fSATWindowMap[window] = satWindow; + + return satWindow; +} + + +SATWindow::SATWindow(Window* window) : fWindow(window), @@ -137,7 +258,7 @@ } -StackAndTileWindow::~StackAndTileWindow() +SATWindow::~SATWindow() { // if the window still has stackedWindowIds but is not stacked anymore, // clean up the stackedWindowIds (they are not used by other windows @@ -171,7 +292,7 @@ void -StackAndTileWindow::MouseDown() +SATWindow::MouseDown() { // Re-stack and re-snap the window if in stacking & snapping mode if (fStackAndTile->IsStackingAndSnapping()) { @@ -185,7 +306,7 @@ void -StackAndTileWindow::MouseUp() +SATWindow::MouseUp() { // Snap or stack the window if in stack & tiling mode if (fStackAndTile->IsStackingAndSnapping()) { @@ -207,7 +328,7 @@ void -StackAndTileWindow::MoveWindow() +SATWindow::MoveWindow() { // Dragging in StackingAndSnapping mode means stacking and // snapping of this window is removed and can be changed. @@ -225,7 +346,7 @@ void -StackAndTileWindow::ResizeWindow() +SATWindow::ResizeWindow() { // Resizing in StackingAndSnapping mode means stacking and // snapping of this window is removed and can be changed. @@ -242,7 +363,7 @@ void -StackAndTileWindow::ActivateWindow(Window* window, WindowList& bringToTopList) +SATWindow::ActivateWindow(Window* window, WindowList& bringToTopList) { BObjectList<Window> stackedAndTiledWindows; @@ -285,8 +406,7 @@ bool -StackAndTileWindow::SetSettings(const BMessage& settings, - BRegion* updateRegion) +SATWindow::SetSettings(const BMessage& settings) { STRACE_SAT(("DefaultDecorator::SetSettings() on %s\n", fWindow->Title())); @@ -321,22 +441,20 @@ // if it is not this window itself, then stack it with this window // UNLESS the W's stacking list doesn't contain this window, // which implies W's been unstacked while this window was hidden - Window* window = _FindWindow(id); - if (window && window != fWindow - && window->GetStackAndTileWindow()->StackedWindowIds()) { + SATWindow* window = _FindWindow(id); + if (window && window != this && window->StackedWindowIds()) { bool idExists = false; - for (int j = 0; !idExists && - j < window->GetStackAndTileWindow()->StackedWindowIds() + for (int j = 0; !idExists && j < window->StackedWindowIds() ->CountItems(); j++) { int32* stackedId = - static_cast<int32*>(window->GetStackAndTileWindow() - ->StackedWindowIds()->ItemAt(j)); + static_cast<int32*>(window->StackedWindowIds() + ->ItemAt(j)); idExists = windowId == *stackedId; } if (idExists) { if (!windowToStackUnder) { //note this will execute only once during loop - windowToStackUnder = window; + windowToStackUnder = window->GetWindow(); } } else { @@ -353,7 +471,10 @@ if (windowToStackUnder) { StackWindowBefore(windowToStackUnder); - windowToStackUnder->GetStackAndTileWindow()->StackAndTile(); + SATWindow* windowToStackUnderSAT + = fStackAndTile->GetSATWindow(windowToStackUnder); + if (windowToStackUnderSAT) + windowToStackUnderSAT->StackAndTile(); } else InitStackedWindowIds(); @@ -411,7 +532,7 @@ void -StackAndTileWindow::_SnapWindowFromSettings(const char* label, +SATWindow::_SnapWindowFromSettings(const char* label, SnapOrientation thisSnapOrientation, SnapOrientation otherSnapOrientation, const BMessage* settings) @@ -424,8 +545,8 @@ int32 id; settings->FindInt32(label, i, &id); - Window* window = _FindWindow(id); - if (window == fWindow) { + SATWindow* window = _FindWindow(id); + if (window == this) { continue; } @@ -438,9 +559,8 @@ // was de-snapped while this window was hidden. So only add the // other window to this window's snapping list when such is not // the case. - BList* otherList = window->GetStackAndTileWindow() - ->GetSnappingList(otherSnapOrientation, - thisSnapOrientation, false); + BList* otherList = window->GetSnappingList(otherSnapOrientation, + thisSnapOrientation, false); if (!otherList) { debug_suffix = "\n"; continue; @@ -469,7 +589,7 @@ bool -StackAndTileWindow::GetSettings(BMessage* settings) const +SATWindow::GetSettings(BMessage* settings) const { STRACE_SAT(("DefaultDecorator::GetSettings() on %s\n", fWindow->Title())); @@ -514,7 +634,7 @@ bool -StackAndTileWindow::_StoreIntsInSettings(const char* label, +SATWindow::_StoreIntsInSettings(const char* label, BList* ids, BMessage* settings) const { if (ids) { @@ -530,67 +650,59 @@ void -StackAndTileWindow::_EnsureWindowWithinScreenBounds(Window* window, Window* detached) +SATWindow::_EnsureWindowWithinScreenBounds(SATWindow* window, + SATWindow* detached) { BRect screenFrame = fWindow->Screen()->Frame(); float deltaX = 0; float deltaY = 0; - BList* windowsToRight = window->GetStackAndTileWindow() - ->Right2LeftSnappingWindowIds(); - BList* windowsToLeft = window->GetStackAndTileWindow() - ->Left2RightSnappingWindowIds(); - BList* windowsToTop = window->GetStackAndTileWindow() - ->Bottom2TopSnappingWindowIds(); - BList* windowsToBottom = window->GetStackAndTileWindow() - ->Top2BottomSnappingWindowIds(); - if (window->Frame().left < 0 - && (!windowsToRight - || windowsToRight->IsEmpty() - || windowsToRight->CountItems() == 1 - && *static_cast<int32*>(windowsToRight->ItemAt(0)) - == detached->GetStackAndTileWindow()->WindowId())) { + BRect windowFrame = window->fWindow->Frame(); + + BList* windowsToRight = window->Right2LeftSnappingWindowIds(); + BList* windowsToLeft = window->Left2RightSnappingWindowIds(); + BList* windowsToTop = window->Bottom2TopSnappingWindowIds(); + BList* windowsToBottom = window->Top2BottomSnappingWindowIds(); + + if (windowFrame.left < 0 && (!windowsToRight || windowsToRight->IsEmpty() + || windowsToRight->CountItems() == 1 + && *static_cast<int32*>(windowsToRight->ItemAt(0)) + == detached->WindowId())) { // If window is off-screen to the left and there's no window tiled // to its right that can still "save" it from going totally off-screen - deltaX = 6 - window->Frame().left; + deltaX = 6 - windowFrame.left; } - else if (window->Frame().right > screenFrame.right - && (!windowsToLeft - || windowsToLeft->IsEmpty() - || windowsToLeft->CountItems() == 1 - && *static_cast<int32*>(windowsToLeft->ItemAt(0)) - == detached->GetStackAndTileWindow()->WindowId())) { + else if (windowFrame.right > screenFrame.right && (!windowsToLeft + || windowsToLeft->IsEmpty() || windowsToLeft->CountItems() == 1 + && *static_cast<int32*>(windowsToLeft->ItemAt(0)) + == detached->WindowId())) { // If window is off-screen to the right and there's no window tiled // to its left that can still "save" it from going totally off-screen - deltaX = screenFrame.right - window->Frame().right - 6; + deltaX = screenFrame.right - windowFrame.right - 6; } - if (window->Frame().top < 0 - && (!windowsToTop - || windowsToTop->IsEmpty() - || windowsToTop->CountItems() == 1 - && *static_cast<int32*>(windowsToTop->ItemAt(0)) - == detached->GetStackAndTileWindow()->WindowId())) { + if (windowFrame.top < 0 && (!windowsToTop || windowsToTop->IsEmpty() + || windowsToTop->CountItems() == 1 + && *static_cast<int32*>(windowsToTop->ItemAt(0)) + == detached->WindowId())) { // If window is off-screen to the top and there's no window tiled // to its bottom that can still "save" it from going totally off-screen - deltaY = 27 - window->Frame().top; + deltaY = 27 - windowFrame.top; } - else if (window->Frame().bottom > screenFrame.bottom - && (!windowsToBottom - || windowsToBottom->IsEmpty() - || windowsToBottom->CountItems() == 1 - && *static_cast<int32*>(windowsToBottom->ItemAt(0)) - == detached->GetStackAndTileWindow()->WindowId())) { + else if (windowFrame.bottom > screenFrame.bottom && (!windowsToBottom + || windowsToBottom->IsEmpty() || windowsToBottom->CountItems() == 1 + && *static_cast<int32*>(windowsToBottom->ItemAt(0)) + == detached->WindowId())) { // If window is off-screen to the bottom and there's no window tiled // to its top that can still "save" it from going totally off-screen - deltaY = screenFrame.bottom - window->Frame().bottom - 6; + deltaY = screenFrame.bottom - windowFrame.bottom - 6; } if (deltaX != 0 || deltaY != 0) - fWindow->Desktop()->MoveWindowBy(window, deltaX, deltaY); + fWindow->Desktop()->MoveWindowBy(window->fWindow, deltaX, deltaY); } void -StackAndTileWindow::InitStackedWindowIds() +SATWindow::InitStackedWindowIds() { if (!fStackedWindowIds) fStackedWindowIds = new BList(); @@ -603,7 +715,7 @@ method returns immediately. */ void -StackAndTileWindow::_InitStackingAndSnapping() +SATWindow::_InitStackingAndSnapping() { STRACE_SAT(("Window::_InitStackingAndSnapping() on %s, fLeftVar=%d\n", fWindow->Title(), fLeftVar)); @@ -687,7 +799,7 @@ snapping of a window can be set up from scratch. */ void -StackAndTileWindow::_RemoveStackingAndSnapping() +SATWindow::_RemoveStackingAndSnapping() { STRACE_SAT(("Window::_RemoveStackingAndSnapping() on %s, fLeftVar=%d\n", fWindow->Title(), fLeftVar)); @@ -727,43 +839,39 @@ if (fWindow == fStackedWindows->FirstItem()) { Window* newFirstWindow = static_cast<Window*>( fStackedWindows->ItemAt(1)); + SATWindow* newFirstWindowSAT = fStackAndTile->GetSATWindow( + newFirstWindow); + if (newFirstWindowSAT) { + // the first window does not need stacking constraints + delete newFirstWindowSAT->fLeftStackingConstraint; + delete newFirstWindowSAT->fTopStackingConstraint; + delete newFirstWindowSAT->fRightStackingConstraint; + delete newFirstWindowSAT->fBottomStackingConstraint; + newFirstWindowSAT->fLeftStackingConstraint = NULL; + newFirstWindowSAT->fTopStackingConstraint = NULL; + newFirstWindowSAT->fRightStackingConstraint = NULL; + newFirstWindowSAT->fBottomStackingConstraint = NULL; - // the first window does not need stacking constraints - delete newFirstWindow->GetStackAndTileWindow() - ->fLeftStackingConstraint; - delete newFirstWindow->GetStackAndTileWindow() - ->fTopStackingConstraint; - delete newFirstWindow->GetStackAndTileWindow() - ->fRightStackingConstraint; - delete newFirstWindow->GetStackAndTileWindow() - ->fBottomStackingConstraint; - newFirstWindow->GetStackAndTileWindow() - ->fLeftStackingConstraint = NULL; - newFirstWindow->GetStackAndTileWindow() - ->fTopStackingConstraint = NULL; - newFirstWindow->GetStackAndTileWindow() - ->fRightStackingConstraint = NULL; - newFirstWindow->GetStackAndTileWindow() - ->fBottomStackingConstraint = NULL; - - // the following windows need stacking constraints referring to - // the first window - for (int i = 2; i < fStackedWindows->CountItems(); i++) { - Window* window = static_cast<Window*>( - fStackedWindows->ItemAt(i)); - window->GetStackAndTileWindow()->fLeftStackingConstraint - ->SetLeftSide(1, window->GetStackAndTileWindow()->fLeftVar, - -1, newFirstWindow->GetStackAndTileWindow()->fLeftVar); - window->GetStackAndTileWindow()->fTopStackingConstraint - ->SetLeftSide(1, window->GetStackAndTileWindow()->fTopVar, - -1, newFirstWindow->GetStackAndTileWindow()->fTopVar); - window->GetStackAndTileWindow()->fRightStackingConstraint - ->SetLeftSide(1, window->GetStackAndTileWindow()->fRightVar, - -1, newFirstWindow->GetStackAndTileWindow()->fRightVar); - window->GetStackAndTileWindow()->fBottomStackingConstraint - ->SetLeftSide(1, - window->GetStackAndTileWindow()->fBottomVar, -1, - newFirstWindow->GetStackAndTileWindow()->fBottomVar); + // the following windows need stacking constraints referring to + // the first window + for (int i = 2; i < fStackedWindows->CountItems(); i++) { + Window* window = static_cast<Window*>( + fStackedWindows->ItemAt(i)); + SATWindow* windowSAT = fStackAndTile->GetSATWindow( + window); + if (!windowSAT) + continue; + + windowSAT->fLeftStackingConstraint->SetLeftSide(1, + windowSAT->fLeftVar, -1, newFirstWindowSAT->fLeftVar); + windowSAT->fTopStackingConstraint->SetLeftSide(1, + windowSAT->fTopVar, -1, newFirstWindowSAT->fTopVar); + windowSAT->fRightStackingConstraint->SetLeftSide(1, + windowSAT->fRightVar, -1, newFirstWindowSAT->fRightVar); + windowSAT->fBottomStackingConstraint->SetLeftSide(1, + windowSAT->fBottomVar, -1, + newFirstWindowSAT->fBottomVar); + } } } @@ -792,115 +900,64 @@ // For each previously snapped window, make sure that it is within // screen bounds, so as to prevent it from being lost off-screen - for (int i = 0; fLeft2LeftSnappingWindowIds - && i < fLeft2LeftSnappingWindowIds->CountItems(); i++) { - int32* id = static_cast<int32*>(fLeft2LeftSnappingWindowIds->ItemAt(i)); - Window* win = _FindWindow(*id); - if (win) { - _EnsureWindowWithinScreenBounds(win, fWindow); - win->GetStackAndTileWindow()->StackAndTile(); - } - } - for (int i = 0; fLeft2RightSnappingWindowIds - && i < fLeft2RightSnappingWindowIds->CountItems(); i++) { - int32* id = static_cast<int32*>(fLeft2RightSnappingWindowIds->ItemAt(i)); - Window* win = _FindWindow(*id); - if (win) { - _EnsureWindowWithinScreenBounds(win, fWindow); - win->GetStackAndTileWindow()->StackAndTile(); - } - } - for (int i = 0; fRight2LeftSnappingWindowIds - && i < fRight2LeftSnappingWindowIds->CountItems(); i++) { - int32* id = static_cast<int32*>(fRight2LeftSnappingWindowIds->ItemAt(i)); - Window* win = _FindWindow(*id); - if (win) { - _EnsureWindowWithinScreenBounds(win, fWindow); - win->GetStackAndTileWindow()->StackAndTile(); - } - } - for (int i = 0; fRight2RightSnappingWindowIds - && i < fRight2RightSnappingWindowIds->CountItems(); i++) { - int32* id = static_cast<int32*>(fRight2RightSnappingWindowIds->ItemAt(i)); - Window* win = _FindWindow(*id); - if (win) { - _EnsureWindowWithinScreenBounds(win, fWindow); - win->GetStackAndTileWindow()->StackAndTile(); - } - } - for (int i = 0; fTop2TopSnappingWindowIds - && i < fTop2TopSnappingWindowIds->CountItems(); i++) { - int32* id = static_cast<int32*>(fTop2TopSnappingWindowIds->ItemAt(i)); - Window* win = _FindWindow(*id); - if (win) { - _EnsureWindowWithinScreenBounds(win, fWindow); - win->GetStackAndTileWindow()->StackAndTile(); - } - } - for (int i = 0; fTop2BottomSnappingWindowIds - && i < fTop2BottomSnappingWindowIds->CountItems(); i++) { - int32* id = static_cast<int32*>(fTop2BottomSnappingWindowIds->ItemAt(i)); - Window* win = _FindWindow(*id); - if (win) { - _EnsureWindowWithinScreenBounds(win, fWindow); - win->GetStackAndTileWindow()->StackAndTile(); - } - } - for (int i = 0; fBottom2TopSnappingWindowIds - && i < fBottom2TopSnappingWindowIds->CountItems(); i++) { - int32* id = static_cast<int32*>(fBottom2TopSnappingWindowIds->ItemAt(i)); - Window* win = _FindWindow(*id); - if (win) { - _EnsureWindowWithinScreenBounds(win, fWindow); - win->GetStackAndTileWindow()->StackAndTile(); - } - } - for (int i = 0; fBottom2BottomSnappingWindowIds - && i < fBottom2BottomSnappingWindowIds->CountItems(); i++) { - int32* id = static_cast<int32*>(fBottom2BottomSnappingWindowIds->ItemAt(i)); - Window* win = _FindWindow(*id); - if (win) { - _EnsureWindowWithinScreenBounds(win, fWindow); - win->GetStackAndTileWindow()->StackAndTile(); - } - } + _EnsureAndSAT(fLeft2LeftSnappingWindowIds); + _EnsureAndSAT(fLeft2RightSnappingWindowIds); + _EnsureAndSAT(fRight2LeftSnappingWindowIds); + _EnsureAndSAT(fRight2RightSnappingWindowIds); + _EnsureAndSAT(fTop2TopSnappingWindowIds); + _EnsureAndSAT(fTop2BottomSnappingWindowIds); + _EnsureAndSAT(fBottom2TopSnappingWindowIds); + _EnsureAndSAT(fBottom2BottomSnappingWindowIds); STRACE_SAT(("Finished Window::_RemoveStackingAndSnapping() on %s\n", fWindow->Title())); } +void +SATWindow::_EnsureAndSAT(BList* idList) +{ + if (!idList) + return; + + for (int i = 0; i < idList->CountItems(); i++) { + int32* id = static_cast<int32*>(idList->ItemAt(i)); + SATWindow* winSAT = _FindWindow(*id); + if (winSAT) { + _EnsureWindowWithinScreenBounds(winSAT, this); + winSAT->StackAndTile(); + } + } +} + + /*! \brief Looks for a suitable stacking candidate by checking which window tabs overlap with this window's tab, and gives visual feedback by adjusting window tab highlights. This method is called during the Stack & Tile configuration mode. */ void -StackAndTileWindow::_CheckIfReadyToStack() +SATWindow::_CheckIfReadyToStack() { // stacking only works if this window has a tab if (!fWindow->Decorator()) return; - Window* prevWindowUnder = fWindowUnder; + SATWindow* prevWindowUnder = fWindowUnder; fWindowUnder = NULL; // search for stacking candidate - BRect thisTabRect( - fWindow->Decorator()->TabRect().left, - fWindow->Decorator()->TabRect().top, + BRect thisTabRect(fWindow->Decorator()->TabRect().left, + fWindow->Decorator()->TabRect().top, fWindow->Decorator()->TabRect().right + 1, - fWindow->Decorator()->TabRect().bottom); + fWindow->Decorator()->TabRect().bottom); for (Window* window = fWindow->Desktop()->CurrentWindows().LastWindow(); window; window = window->PreviousWindow(fWindow->CurrentWorkspace())) { - if (window != fWindow - && !window->IsHidden() - && window->Decorator() + if (window != fWindow && !window->IsHidden() && window->Decorator() && thisTabRect.Intersects(window->Decorator()->TabRect())) { - // remember window as the candidate for stacking - fWindowUnder = window; + fWindowUnder = fStackAndTile->GetSATWindow(window); break; } } @@ -909,13 +966,13 @@ if(prevWindowUnder != fWindowUnder) { if(!prevWindowUnder) { // candidate found for the first time fWindow->Desktop()->HighlightTab(fWindow, true); - fWindow->Desktop()->HighlightTab(fWindowUnder, true); + fWindow->Desktop()->HighlightTab(fWindowUnder->fWindow, true); } else if(!fWindowUnder) { // no candidate after there was one fWindow->Desktop()->HighlightTab(fWindow, false); - fWindow->Desktop()->HighlightTab(prevWindowUnder, false); + fWindow->Desktop()->HighlightTab(prevWindowUnder->fWindow, false); } else { // changing from one to another candidate - fWindow->Desktop()->HighlightTab(prevWindowUnder, false); - fWindow->Desktop()->HighlightTab(fWindowUnder, true); + fWindow->Desktop()->HighlightTab(prevWindowUnder->fWindow, false); + fWindow->Desktop()->HighlightTab(fWindowUnder->fWindow, true); } } } @@ -926,7 +983,7 @@ candidate is cleared. */ void -StackAndTileWindow::_StackWindow() +SATWindow::_StackWindow() { STRACE_SAT(("Window::_StackWindow() on %s, fWindowUnder=%x\n", fWindow->Title(), fWindowUnder)); @@ -937,28 +994,28 @@ // align this window with the stack fWindow->Desktop()->MoveWindowBy(fWindow, - fWindowUnder->Frame().left - fWindow->Frame().left, - fWindowUnder->Frame().top - fWindow->Frame().top); + fWindowUnder->fWindow->Frame().left - fWindow->Frame().left, + fWindowUnder->fWindow->Frame().top - fWindow->Frame().top); fWindow->Desktop()->ResizeWindowBy(fWindow, - fWindowUnder->Frame().right - fWindow->Frame().right, - fWindowUnder->Frame().bottom - fWindow->Frame().bottom); + fWindowUnder->fWindow->Frame().right - fWindow->Frame().right, + fWindowUnder->fWindow->Frame().bottom - fWindow->Frame().bottom); // make sure there is a stacked window list - BList* stack = fWindowUnder->GetStackAndTileWindow()->fStackedWindows; + BList* stack = fWindowUnder->fStackedWindows; if (!stack) { stack = new BList(); stack->AddItem(fWindowUnder); - fWindowUnder->GetStackAndTileWindow()->fStackedWindows = stack; + fWindowUnder->fStackedWindows = stack; } // make sure there is a stacked window id list - BList* stackIds = fWindowUnder->GetStackAndTileWindow()->fStackedWindowIds; + BList* stackIds = fWindowUnder->fStackedWindowIds; if (!stackIds) { stackIds = new BList(); int32* id = static_cast<int32*>(malloc(sizeof(int32))); - *id = fWindowUnder->GetStackAndTileWindow()->WindowId(); + *id = fWindowUnder->WindowId(); stackIds->AddItem(id); - fWindowUnder->GetStackAndTileWindow()->fStackedWindowIds = stackIds; + fWindowUnder->fStackedWindowIds = stackIds; } // add this window's id to the stacked window id list - ONLY @@ -977,25 +1034,28 @@ // add this window to the stack before the windowUnder, // rearrange the window tabs and initialize constraints - stack->AddItem(fWindow, stack->IndexOf(fWindowUnder)); + stack->AddItem(fWindow, stack->IndexOf(fWindowUnder->fWindow)); fStackedWindows = stack; _ArrangeStackedWindowTabs(); _InitStackingAndSnapping(); // set up stacking constraints Window* firstWindow = static_cast<Window*>(stack->FirstItem()); - if (fWindow != firstWindow) { + SATWindow* firstWindowSAT = NULL; + if (fWindow != firstWindow) + firstWindowSAT = fStackAndTile->GetSATWindow(firstWindow); + if (firstWindowSAT){ // if this is not the first window, then add stacking constraints // referring to the first window in the stack - firstWindow->GetStackAndTileWindow()->_InitStackingAndSnapping(); + firstWindowSAT->_InitStackingAndSnapping(); fLeftStackingConstraint = fLeftVar->IsEqual( - firstWindow->GetStackAndTileWindow()->fLeftVar); + firstWindowSAT->fLeftVar); fTopStackingConstraint = fTopVar->IsEqual( - firstWindow->GetStackAndTileWindow()->fTopVar); + firstWindowSAT->fTopVar); fRightStackingConstraint = fRightVar->IsEqual( - firstWindow->GetStackAndTileWindow()->fRightVar); + firstWindowSAT->fRightVar); fBottomStackingConstraint = fBottomVar->IsEqual( - firstWindow->GetStackAndTileWindow()->fBottomVar); + firstWindowSAT->fBottomVar); BString label("stacking of "); label << fWindow->Title(); fLeftStackingConstraint->SetLabel(label.String()); @@ -1009,7 +1069,8 @@ for (int i = 1; i < fStackedWindows->CountItems(); i++) { Window* window = static_cast<Window*>( fStackedWindows->ItemAt(i)); - StackAndTileWindow* satWindow = window->GetStackAndTileWindow(); + SATWindow* satWindow = fStackAndTile->GetSATWindow(window); + // is in stack list so we don't need to check if valid satWindow->_InitStackingAndSnapping(); // either create new stacking constraints @@ -1055,9 +1116,9 @@ \param window the window with the stack where this window will be added. */ void -StackAndTileWindow::StackWindowBefore(Window* window) +SATWindow::StackWindowBefore(Window* window) { - fWindowUnder = window; + fWindowUnder = fStackAndTile->GetSATWindow(window); _StackWindow(); } @@ -1066,7 +1127,7 @@ this window. */ void -StackAndTileWindow::_ArrangeStackedWindowTabs() +SATWindow::_ArrangeStackedWindowTabs() { STRACE_SAT(("Window::_ArrangeStackedWindowTabs() on %s, fStackedWindows=%x\n", fWindow->Title(), fStackedWindows)); @@ -1093,7 +1154,7 @@ configuration mode. */ void -StackAndTileWindow::_CheckIfReadyToSnap() +SATWindow::_CheckIfReadyToSnap() { if (!fLeftAdjacentWindows) { fLeftAdjacentWindows = new BList(); @@ -1115,54 +1176,53 @@ fBottomAdjacentWindows->MakeEmpty(); // go through all windows and look for snapping candidates - for (Window* window2 = fWindow->Desktop()->CurrentWindows().LastWindow(); - window2; - window2 = window2->PreviousWindow(fWindow->CurrentWorkspace())) { - if (!window2->IsHidden() - && fWindow != window2 // don't snap window to itself - && window2 != fWindowUnder // don't snap with stacking candidate - && !(strcmp(window2->Title(), "Deskbar")==0) - && !(strcmp(window2->Title(), "Desktop")==0)) { + for (Window* window = fWindow->Desktop()->CurrentWindows().LastWindow(); + window; window = window->PreviousWindow(fWindow->CurrentWorkspace())) { + if (!window->IsHidden() + && fWindow != window // don't snap window to itself + && fWindowUnder && window != fWindowUnder->fWindow + // don't snap with stacking candidate + && !(strcmp(window->Title(), "Deskbar")==0) + && !(strcmp(window->Title(), "Desktop")==0)) { - // is window2 adjacent on the left of this window? - BRect thisLeft( - fWindow->Frame().left - 12, fWindow->Frame().top + 12, - fWindow->Frame().left + 6, fWindow->Frame().bottom - 12); - BRect window2Right( - window2->Frame().right - 6, window2->Frame().top + 12, - window2->Frame().right + 12, window2->Frame().bottom - 12); + // is window adjacent on the left of this window? + BRect thisLeft(fWindow->Frame().left - 12, + fWindow->Frame().top + 12, fWindow->Frame().left + 6, + fWindow->Frame().bottom - 12); + BRect window2Right(window->Frame().right - 6, + window->Frame().top + 12, window->Frame().right + 12, + window->Frame().bottom - 12); if (thisLeft.Intersects(window2Right)) - fLeftAdjacentWindows->AddItem(window2); + fLeftAdjacentWindows->AddItem(window); // is window2 adjacent on the top of this window? - BRect thisTop( - fWindow->Frame().left + 12, fWindow->Frame().top - 22, + BRect thisTop(fWindow->Frame().left + 12, fWindow->Frame().top - 22, fWindow->Frame().right - 12, fWindow->Frame().top + 6); - BRect window2Bottom( - window2->Frame().left + 12, window2->Frame().bottom - 6, - window2->Frame().right - 12, window2->Frame().bottom + 12); + BRect window2Bottom(window->Frame().left + 12, + window->Frame().bottom - 6, window->Frame().right - 12, + window->Frame().bottom + 12); if (thisTop.Intersects(window2Bottom)) - fTopAdjacentWindows->AddItem(window2); + fTopAdjacentWindows->AddItem(window); // is window2 adjacent on the right of this window? - BRect thisRight( - fWindow->Frame().right - 6, fWindow->Frame().top + 12, - fWindow->Frame().right + 12, fWindow->Frame().bottom - 12); - BRect window2Left( - window2->Frame().left - 12, window2->Frame().top + 12, - window2->Frame().left + 6, window2->Frame().bottom - 12); + BRect thisRight(fWindow->Frame().right - 6, + fWindow->Frame().top + 12, fWindow->Frame().right + 12, + fWindow->Frame().bottom - 12); + BRect window2Left(window->Frame().left - 12, + window->Frame().top + 12, window->Frame().left + 6, + window->Frame().bottom - 12); if (thisRight.Intersects(window2Left)) - fRightAdjacentWindows->AddItem(window2); + fRightAdjacentWindows->AddItem(window); // is window2 adjacent on the bottom of this window? - BRect thisBottom( - fWindow->Frame().left + 12, fWindow->Frame().bottom - 6, - fWindow->Frame().right - 12, fWindow->Frame().bottom + 12); - BRect window2Top( - window2->Frame().left + 12, window2->Frame().top - 22, - window2->Frame().right - 12, window2->Frame().top + 6); + BRect thisBottom(fWindow->Frame().left + 12, + fWindow->Frame().bottom - 6, fWindow->Frame().right - 12, + fWindow->Frame().bottom + 12); + BRect window2Top(window->Frame().left + 12, + window->Frame().top - 22, window->Frame().right - 12, + window->Frame().top + 6); if (thisBottom.Intersects(window2Top)) - fBottomAdjacentWindows->AddItem(window2); + fBottomAdjacentWindows->AddItem(window); } } @@ -1222,13 +1282,13 @@ on each side. Afterwards snapping candidates are cleared. */ void -StackAndTileWindow::_SnapWindow() +SATWindow::_SnapWindow() { BRect bounds; - Window* leftmostWindow; - Window* topmostWindow; - Window* rightmostWindow; - Window* bottommostWindow; + SATWindow* leftmostWindow; + SATWindow* topmostWindow; + SATWindow* rightmostWindow; + SATWindow* bottommostWindow; // snap other windows to the left border if (!fLeftAdjacentWindows->IsEmpty()) { @@ -1240,15 +1300,15 @@ fWindow->Desktop()->MoveWindowBy(fWindow, bounds.right - fWindow->Frame().left + 11, 0); _InitStackingAndSnapping(); - topmostWindow->GetStackAndTileWindow()->_InitStackingAndSnapping(); - bottommostWindow->GetStackAndTileWindow()->_InitStackingAndSnapping(); + topmostWindow->_InitStackingAndSnapping(); + bottommostWindow->_InitStackingAndSnapping(); // adjust top border if (fTopAdjacentWindows->IsEmpty()) { fWindow->Desktop()->MoveWindowBy(fWindow, 0, bounds.top - fWindow->Frame().top); Constraint* topSnapping = fTopVar->IsEqual( - topmostWindow->GetStackAndTileWindow()->fTopVar); + topmostWindow->fTopVar); BString label("topSnapping of "); label << fWindow->Title(); topSnapping->SetLabel(label.String()); @@ -1256,14 +1316,12 @@ AddToSnappingList(topmostWindow, SNAP_TOP, SNAP_TOP); AddToSnappingList(topmostWindow, SNAP_LEFT, SNAP_RIGHT); - topmostWindow->GetStackAndTileWindow()->AddToSnappingList( - fWindow, SNAP_TOP, SNAP_TOP); - topmostWindow->GetStackAndTileWindow()->AddToSnappingList( - fWindow, SNAP_RIGHT, SNAP_LEFT); + topmostWindow->AddToSnappingList(this, SNAP_TOP, SNAP_TOP); + topmostWindow->AddToSnappingList(this, SNAP_RIGHT, SNAP_LEFT); STRACE_SAT(("Adding %s[%d] to %s[%d]'s T2T & L2R list\n", topmostWindow->Title(), - topmostWindow->GetStackAndTileWindow()->WindowId(), [... truncated: 899 lines follow ...]