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);