From 66fdfb907b2c76b138fde8ad456963561381f524 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Axel=20D=C3=B6rfler?= Date: Wed, 30 Nov 2005 11:19:20 +0000 Subject: [PATCH] Some preparations to reactivate the workspace feature. git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@15239 a95241bf-73f2-0310-859d-f6bbb57e9c96 --- src/servers/app/RootLayer.cpp | 49 +++++++++++++++++++++-------------- src/servers/app/Workspace.cpp | 32 +++++++++++++++++++---- src/servers/app/Workspace.h | 13 +++++++--- 3 files changed, 66 insertions(+), 28 deletions(-) diff --git a/src/servers/app/RootLayer.cpp b/src/servers/app/RootLayer.cpp index 033d668c87..2dbc241a5c 100644 --- a/src/servers/app/RootLayer.cpp +++ b/src/servers/app/RootLayer.cpp @@ -400,17 +400,42 @@ RootLayer::SetWorkspace(int32 index, Workspace& workspace) _UpdateWorkspace(workspace); // add new windows, and include them in the changed region - but only - // those that were not visible before + // those that were not visible before (or whose position changed) for (int32 i = 0; i < workspace.CountWindows(); i++) { - WindowLayer* window = workspace.WindowAt(i); + window_layer_info* info = workspace.WindowAt(i); + WindowLayer* window = info->window; - if (!window->IsHidden() - && (window->Workspaces() & (1UL << previousIndex)) == 0) { + if (window->IsHidden()) + continue; + + if (info->position == kInvalidWindowPosition) { + // if you enter a workspace for the first time, the position + // of the window in the previous workspace is adopted + info->position = window->Frame().LeftTop(); + } + + if ((window->Workspaces() & (1UL << previousIndex)) == 0) { // this window was not visible before + + // TODO: what we really want here is the visible region of the window BRegion region; window->GetOnScreenRegion(region); + changed.Include(®ion); + } else if (window->Frame().LeftTop() != info->position) { + // the window was visible before, but its on-screen location changed + BPoint offset = info->position - window->Frame().LeftTop(); + window->MoveBy(offset.x, offset.y); + + // TODO: we're playing dumb here - what we need is a MoveBy() that + // gives us a dirty region back, and since the new clipping code + // will give us just that, we don't take any special measurement + // here + GetOnScreenRegion(changed); + } else { + // the window is still visible and on the same location + continue; } _AddChildToList(window); @@ -494,22 +519,6 @@ RootLayer::SetWindowLayerLook(WindowLayer *windowLayer, int32 newLook) // TODO } -#if 0 -void -RootLayer::RevealNewWMState(Workspace::State &oldWMState) -{ - // send window activation messages - if (oldWMState.Focus != fWMState.Focus) { - if (oldWMState.Focus) - oldWMState.Focus->Activated(false); - if (fWMState.Focus) { - fWMState.Focus->Activated(true); - fDesktop->EventDispatcher().SetFocus(&fWMState.Focus->Window()->FocusMessenger()); - } else - fDesktop->EventDispatcher().SetFocus(NULL); - } -} -#endif void RootLayer::_WindowsChanged(BRegion& region) diff --git a/src/servers/app/Workspace.cpp b/src/servers/app/Workspace.cpp index 0692856863..9e5dec8949 100644 --- a/src/servers/app/Workspace.cpp +++ b/src/servers/app/Workspace.cpp @@ -11,16 +11,19 @@ #include "Workspace.h" #include "WindowLayer.h" +#include #include #include static RGBColor kDefaultColor = RGBColor(51, 102, 152); +const BPoint kInvalidWindowPosition = BPoint(NAN, NAN); Workspace::Workspace() : - fWindows(20) + fWindows(20, true) + // this list owns its items { _SetDefaults(); } @@ -32,24 +35,43 @@ Workspace::~Workspace() void -Workspace::SetWindows(const BObjectList& windows) +Workspace::SetWindows(const BObjectList& windows) { fWindows.MakeEmpty(); - fWindows.AddList((BObjectList *)&windows); + fWindows.AddList((BObjectList *)&windows); } bool Workspace::AddWindow(WindowLayer* window) { - return fWindows.AddItem(window); + window_layer_info* info = new (nothrow) window_layer_info; + if (info == NULL) + return false; + + info->position = kInvalidWindowPosition; + info->window = window; + + bool success = fWindows.AddItem(info); + if (!success) + delete info; + + return success; } void Workspace::RemoveWindow(WindowLayer* window) { - fWindows.RemoveItem(window); + for (int32 i = fWindows.CountItems(); i-- > 0;) { + window_layer_info* info = fWindows.ItemAt(i); + + if (info->window == window) { + fWindows.RemoveItemAt(i); + delete info; + return; + } + } } diff --git a/src/servers/app/Workspace.h b/src/servers/app/Workspace.h index a290cbf67b..dd510e6175 100644 --- a/src/servers/app/Workspace.h +++ b/src/servers/app/Workspace.h @@ -25,17 +25,22 @@ struct display_info { display_mode mode; }; +struct window_layer_info { + BPoint position; + WindowLayer* window; +}; + class Workspace { public: Workspace(); ~Workspace(); - void SetWindows(const BObjectList& windows); + void SetWindows(const BObjectList& windows); bool AddWindow(WindowLayer* window); void RemoveWindow(WindowLayer* window); int32 CountWindows() const { return fWindows.CountItems(); } - WindowLayer* WindowAt(int32 index) const { return fWindows.ItemAt(index); } + window_layer_info* WindowAt(int32 index) const { return fWindows.ItemAt(index); } // displays @@ -55,7 +60,7 @@ class Workspace { private: void _SetDefaults(); - BObjectList fWindows; + BObjectList fWindows; WindowLayer* fFront; WindowLayer* fFocus; @@ -64,4 +69,6 @@ class Workspace { RGBColor fColor; }; +extern const BPoint kInvalidWindowPosition; + #endif /* WORKSPACE_H */