[haiku-commits] r36872 - haiku/branches/features/stack-and-tile/src/servers/app

  • From: clemens.zeidler@xxxxxxxxxxxxxx
  • To: haiku-commits@xxxxxxxxxxxxx
  • Date: Thu, 20 May 2010 05:51:01 +0200 (CEST)

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 ...]

Other related posts:

  • » [haiku-commits] r36872 - haiku/branches/features/stack-and-tile/src/servers/app - clemens . zeidler