[haiku-commits] r38170 - in haiku/trunk: headers/private/interface src/add-ons/decorators/SATDecorator

  • From: clemens.zeidler@xxxxxxxxxxxxxx
  • To: haiku-commits@xxxxxxxxxxxxx
  • Date: Tue, 17 Aug 2010 08:41:35 +0200 (CEST)

Author: czeidler
Date: 2010-08-17 08:41:35 +0200 (Tue, 17 Aug 2010)
New Revision: 38170
Changeset: http://dev.haiku-os.org/changeset/38170

Added:
   haiku/trunk/headers/private/interface/StackAndTilePrivate.h
Modified:
   haiku/trunk/src/add-ons/decorators/SATDecorator/SATDecorator.cpp
   haiku/trunk/src/add-ons/decorators/SATDecorator/SATWindow.cpp
   haiku/trunk/src/add-ons/decorators/SATDecorator/SATWindow.h
   haiku/trunk/src/add-ons/decorators/SATDecorator/StackAndTile.cpp
   haiku/trunk/src/add-ons/decorators/SATDecorator/StackAndTile.h
   haiku/trunk/src/add-ons/decorators/SATDecorator/Stacking.cpp
   haiku/trunk/src/add-ons/decorators/SATDecorator/Stacking.h
Log:
SATDecorator implements event handling and handles the stacking api requests.



Added: haiku/trunk/headers/private/interface/StackAndTilePrivate.h
===================================================================
--- haiku/trunk/headers/private/interface/StackAndTilePrivate.h                 
        (rev 0)
+++ haiku/trunk/headers/private/interface/StackAndTilePrivate.h 2010-08-17 
06:41:35 UTC (rev 38170)
@@ -0,0 +1,22 @@
+#ifndef STACK_AND_TILE_PRIVATE_H
+#define STACK_AND_TILE_PRIVATE_H
+
+namespace BPrivate {
+
+
+const int32 kMagicSATIdentifier = 'SATI';
+
+
+enum sat_messages {
+       kAddWindowToStack,
+       kRemoveWindowFromStack,
+       kRemoveWindowFromStackAt,
+       kCountWindowsOnStack,
+       kWindowOnStackAt,
+       kStackHasWindow
+};
+
+};
+
+
+#endif

Modified: haiku/trunk/src/add-ons/decorators/SATDecorator/SATDecorator.cpp
===================================================================
--- haiku/trunk/src/add-ons/decorators/SATDecorator/SATDecorator.cpp    
2010-08-17 06:25:55 UTC (rev 38169)
+++ haiku/trunk/src/add-ons/decorators/SATDecorator/SATDecorator.cpp    
2010-08-17 06:41:35 UTC (rev 38170)
@@ -16,7 +16,7 @@
 #include "DrawingEngine.h"
 
 
-#define DEBUG_SATDECORATOR
+//#define DEBUG_SATDECORATOR
 #ifdef DEBUG_SATDECORATOR
 #      define STRACE(x) debug_printf x
 #else

Modified: haiku/trunk/src/add-ons/decorators/SATDecorator/SATWindow.cpp
===================================================================
--- haiku/trunk/src/add-ons/decorators/SATDecorator/SATWindow.cpp       
2010-08-17 06:25:55 UTC (rev 38169)
+++ haiku/trunk/src/add-ons/decorators/SATDecorator/SATWindow.cpp       
2010-08-17 06:41:35 UTC (rev 38170)
@@ -11,9 +11,13 @@
 #include <Debug.h>
 
 #include "SATGroup.h"
+#include "ServerApp.h"
 #include "Window.h"
 
 
+using namespace BPrivate;
+
+
 SATWindow::SATWindow(StackAndTile* sat, Window* window)
        :
        fWindow(window),
@@ -72,6 +76,13 @@
 
 
 bool
+SATWindow::HandleMessage(SATWindow* sender, BPrivate::ServerLink& link)
+{
+       return StackingEventHandler::HandleMessage(sender, link);
+}
+
+
+bool
 SATWindow::PropagateToGroup(SATGroup* group, WindowArea* area)
 {
        return fGroupCookie->PropagateToGroup(group, area);
@@ -126,6 +137,27 @@
 }
 
 
+bool
+SATWindow::StackWindow(SATWindow* child)
+{
+       SATGroup* group = GetGroup();
+       WindowArea* area = GetWindowArea();
+       if (!group || !area)
+               return false;
+
+       bool status = group->AddWindow(child, area, this);
+
+       if (status) {
+               area->WindowList().ItemAt(0)->SetStackedMode(true);
+                       // for the case we are the first added window
+               child->SetStackedMode(true);
+       }
+
+       DoGroupLayout();
+       return true;
+}
+
+
 void
 SATWindow::RemovedFromArea(WindowArea* area)
 {

Modified: haiku/trunk/src/add-ons/decorators/SATDecorator/SATWindow.h
===================================================================
--- haiku/trunk/src/add-ons/decorators/SATDecorator/SATWindow.h 2010-08-17 
06:25:55 UTC (rev 38169)
+++ haiku/trunk/src/add-ons/decorators/SATDecorator/SATWindow.h 2010-08-17 
06:41:35 UTC (rev 38170)
@@ -72,10 +72,16 @@
 
                Window*                         GetWindow() { return fWindow; }
                SATDecorator*           GetDecorator() { return fDecorator; }
+               StackAndTile*           GetStackAndTile() { return 
fStackAndTile; }
+               Desktop*                        GetDesktop() { return fDesktop; 
}
                //! Can be NULL if memory allocation failed!
                SATGroup*                       GetGroup();
                WindowArea*                     GetWindowArea() {
                                                                return 
fGroupCookie->GetWindowArea(); }
+
+               bool                            HandleMessage(SATWindow* sender,
+                                                               
BPrivate::ServerLink& link);
+
                bool                            PropagateToGroup(SATGroup* 
group, WindowArea* area);
 
                //! Move the window to the tab's position. 
@@ -86,6 +92,8 @@
                bool                            RemovedFromGroup(SATGroup* 
group);
                void                            RemovedFromArea(WindowArea* 
area);
 
+               bool                            StackWindow(SATWindow* child);
+
                void                            FindSnappingCandidates();
                bool                            JoinCandidates();
                void                            DoGroupLayout();

Modified: haiku/trunk/src/add-ons/decorators/SATDecorator/StackAndTile.cpp
===================================================================
--- haiku/trunk/src/add-ons/decorators/SATDecorator/StackAndTile.cpp    
2010-08-17 06:25:55 UTC (rev 38169)
+++ haiku/trunk/src/add-ons/decorators/SATDecorator/StackAndTile.cpp    
2010-08-17 06:41:35 UTC (rev 38170)
@@ -10,6 +10,8 @@
 
 #include <Debug.h>
 
+#include "StackAndTilePrivate.h"
+
 #include "Desktop.h"
 #include "SATWindow.h"
 #include "Tiling.h"
@@ -35,6 +37,13 @@
 }
 
 
+int32
+StackAndTile::Identifier()
+{
+       return BPrivate::kMagicSATIdentifier;
+}
+
+
 void
 StackAndTile::ListenerRegistered(Desktop* desktop)
 {
@@ -57,6 +66,17 @@
 }
 
 
+bool
+StackAndTile::HandleMessage(Window* sender, BPrivate::ServerLink& link)
+{
+       SATWindow* satWindow = GetSATWindow(sender);
+       if (!satWindow)
+               return false;
+
+       return satWindow->HandleMessage(satWindow, link);
+}
+
+
 void
 StackAndTile::WindowAdded(Window* window)
 {

Modified: haiku/trunk/src/add-ons/decorators/SATDecorator/StackAndTile.h
===================================================================
--- haiku/trunk/src/add-ons/decorators/SATDecorator/StackAndTile.h      
2010-08-17 06:25:55 UTC (rev 38169)
+++ haiku/trunk/src/add-ons/decorators/SATDecorator/StackAndTile.h      
2010-08-17 06:41:35 UTC (rev 38170)
@@ -19,7 +19,7 @@
 #include "WindowList.h"
 
 
-#define DEBUG_STACK_AND_TILE
+//#define DEBUG_STACK_AND_TILE
 
 #ifdef DEBUG_STACK_AND_TILE
 #      define STRACE_SAT(x...) debug_printf("SAT: "x)
@@ -40,10 +40,15 @@
                                                        StackAndTile();
        virtual                                 ~StackAndTile();
 
+       virtual int32                   Identifier();
+
        // DesktopListener hooks
        virtual void                    ListenerRegistered(Desktop* desktop);
        virtual void                    ListenerUnregistered();
 
+       virtual bool                    HandleMessage(Window* sender,
+                                                               
BPrivate::ServerLink& link);
+
        virtual void                    WindowAdded(Window* window);
        virtual void                    WindowRemoved(Window* window);
        

Modified: haiku/trunk/src/add-ons/decorators/SATDecorator/Stacking.cpp
===================================================================
--- haiku/trunk/src/add-ons/decorators/SATDecorator/Stacking.cpp        
2010-08-17 06:25:55 UTC (rev 38169)
+++ haiku/trunk/src/add-ons/decorators/SATDecorator/Stacking.cpp        
2010-08-17 06:41:35 UTC (rev 38170)
@@ -10,6 +10,8 @@
 
 #include <Debug.h>
 
+#include "StackAndTilePrivate.h"
+
 #include "SATWindow.h"
 #include "Window.h"
 
@@ -23,6 +25,178 @@
 #endif
 
 
+using namespace BPrivate;
+
+
+bool
+StackingEventHandler::HandleMessage(SATWindow* sender,
+       BPrivate::ServerLink& link)
+{
+       Desktop* desktop = sender->GetDesktop();
+       StackAndTile* stackAndTile = sender->GetStackAndTile();
+
+       int32 what;
+       link.Read<int32>(&what);
+
+       switch (what) {
+               case kAddWindowToStack:
+               {
+                       port_id port;
+                       int32 token;
+                       team_id team;
+                       link.Read<port_id>(&port);
+                       link.Read<int32>(&token);
+                       link.Read<team_id>(&team);
+                       int32 position;
+                       if (link.Read<int32>(&position) != B_OK)
+                               return false;
+
+                       WindowArea* area = sender->GetWindowArea();
+                       if (!area)
+                               return false;
+                       if (position < 0)
+                               position = area->WindowList().CountItems() - 1;
+
+                       SATWindow* parent = area->WindowList().ItemAt(position);
+                       Window* window = 
desktop->WindowForClientLooperPort(port);
+                       if (!parent || !window) {
+                               link.StartMessage(B_BAD_VALUE);
+                               link.Flush();
+                               break;
+                       }
+
+                       SATWindow* candidate = 
stackAndTile->GetSATWindow(window);
+                       if (!candidate)
+                               return false;
+                       if (!parent->StackWindow(candidate))
+                               return false;
+
+                       link.StartMessage(B_OK);
+                       link.Flush();
+                       break;
+               }
+               case kRemoveWindowFromStack:
+               {
+                       port_id port;
+                       int32 token;
+                       team_id team;
+                       link.Read<port_id>(&port);
+                       link.Read<int32>(&token);
+                       if (link.Read<team_id>(&team) != B_OK)
+                               return false;
+
+                       SATGroup* group = sender->GetGroup();
+                       if (!group)
+                               return false;
+
+                       Window* window = 
desktop->WindowForClientLooperPort(port);
+                       if (!window) {
+                               link.StartMessage(B_BAD_VALUE);
+                               link.Flush();
+                               break;
+                       }
+                       SATWindow* candidate = 
stackAndTile->GetSATWindow(window);
+                       if (!candidate)
+                               return false;
+                       if (!group->RemoveWindow(candidate))
+                               return false;
+                       break;
+               }
+               case kRemoveWindowFromStackAt:
+               {
+                       int32 position;
+                       if (link.Read<int32>(&position) != B_OK)
+                               return false;
+                       SATGroup* group = sender->GetGroup();
+                       WindowArea* area = sender->GetWindowArea();
+                       if (!area || !group)
+                               return false;
+                       SATWindow* removeWindow = 
area->WindowList().ItemAt(position);
+                       if (!removeWindow) {
+                               link.StartMessage(B_BAD_VALUE);
+                               link.Flush();
+                               break;
+                       }
+
+                       if (!group->RemoveWindow(removeWindow))
+                               return false;
+
+                       ServerWindow* window = 
removeWindow->GetWindow()->ServerWindow();
+                       link.StartMessage(B_OK);
+                       link.Attach<port_id>(window->ClientLooperPort());
+                       link.Attach<int32>(window->ClientToken());
+                       link.Attach<team_id>(window->ClientTeam());
+                       link.Flush();
+                       break;
+               }
+               case kCountWindowsOnStack:
+               {
+                       WindowArea* area = sender->GetWindowArea();
+                       if (!area)
+                               return false;
+                       link.StartMessage(B_OK);
+                       link.Attach<int32>(area->WindowList().CountItems());
+                       link.Flush();
+                       break;
+               }
+               case kWindowOnStackAt:
+               {
+                       int32 position;
+                       if (link.Read<int32>(&position) != B_OK)
+                               return false;
+                       WindowArea* area = sender->GetWindowArea();
+                       if (!area)
+                               return false;
+                       SATWindow* satWindow = 
area->WindowList().ItemAt(position);
+                       if (!satWindow) {
+                               link.StartMessage(B_BAD_VALUE);
+                               link.Flush();
+                               break;
+                       }
+
+                       ServerWindow* window = 
satWindow->GetWindow()->ServerWindow();
+                       link.StartMessage(B_OK);
+                       link.Attach<port_id>(window->ClientLooperPort());
+                       link.Attach<int32>(window->ClientToken());
+                       link.Attach<team_id>(window->ClientTeam());
+                       link.Flush();
+                       break;
+               }
+               case kStackHasWindow:
+               {
+                       port_id port;
+                       int32 token;
+                       team_id team;
+                       link.Read<port_id>(&port);
+                       link.Read<int32>(&token);
+                       if (link.Read<team_id>(&team) != B_OK)
+                               return false;
+
+                       Window* window = 
desktop->WindowForClientLooperPort(port);
+                       if (!window) {
+                               link.StartMessage(B_BAD_VALUE);
+                               link.Flush();
+                               break;
+                       }
+                       SATWindow* candidate = 
stackAndTile->GetSATWindow(window);
+                       if (!candidate)
+                               return false;
+
+                       WindowArea* area = sender->GetWindowArea();
+                       if (!area)
+                               return false;
+                       link.StartMessage(B_OK);
+                       
link.Attach<bool>(area->WindowList().HasItem(candidate));
+                       link.Flush();
+                       break;
+               }
+               default:
+                       return false;
+       }
+       return true;
+}
+
+
 SATStacking::SATStacking(SATWindow* window)
        :
        fSATWindow(window),
@@ -68,24 +242,11 @@
 {
        if (!fStackingCandidate)
                return false;
-       SATGroup* group = fStackingCandidate->GetGroup();
-       WindowArea* area = fStackingCandidate->GetWindowArea();
-       if (!group || !area) {
-               _ClearSearchResult();
-               return false;
-       }
 
-       bool status = group->AddWindow(fSATWindow, area, fStackingCandidate);
+       bool result = fStackingCandidate->StackWindow(fSATWindow);
 
-       if (status) {
-               area->WindowList().ItemAt(0)->SetStackedMode(true);
-                       // for the case we are the first added window
-               fSATWindow->SetStackedMode(true);
-       }
-
-       fStackingCandidate->DoGroupLayout();
        _ClearSearchResult();
-       return status;
+       return result;
 }
 
 

Modified: haiku/trunk/src/add-ons/decorators/SATDecorator/Stacking.h
===================================================================
--- haiku/trunk/src/add-ons/decorators/SATDecorator/Stacking.h  2010-08-17 
06:25:55 UTC (rev 38169)
+++ haiku/trunk/src/add-ons/decorators/SATDecorator/Stacking.h  2010-08-17 
06:41:35 UTC (rev 38170)
@@ -15,6 +15,14 @@
 class SATWindow;
 
 
+class StackingEventHandler
+{
+public:
+       static bool                             HandleMessage(SATWindow* sender,
+                                                               
BPrivate::ServerLink& link);
+};
+
+
 class SATStacking : public SATSnappingBehaviour {
 public:
                                                        SATStacking(SATWindow* 
window);


Other related posts: