Some preparations to reactivate the workspace feature.
git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@15239 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
@@ -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)
|
||||
|
||||
@@ -11,16 +11,19 @@
|
||||
#include "Workspace.h"
|
||||
#include "WindowLayer.h"
|
||||
|
||||
#include <math.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
|
||||
|
||||
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<WindowLayer>& windows)
|
||||
Workspace::SetWindows(const BObjectList<window_layer_info>& windows)
|
||||
{
|
||||
fWindows.MakeEmpty();
|
||||
fWindows.AddList((BObjectList<WindowLayer> *)&windows);
|
||||
fWindows.AddList((BObjectList<window_layer_info> *)&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;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -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<WindowLayer>& windows);
|
||||
void SetWindows(const BObjectList<window_layer_info>& 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<WindowLayer> fWindows;
|
||||
BObjectList<window_layer_info> fWindows;
|
||||
WindowLayer* fFront;
|
||||
WindowLayer* fFocus;
|
||||
|
||||
@@ -64,4 +69,6 @@ class Workspace {
|
||||
RGBColor fColor;
|
||||
};
|
||||
|
||||
extern const BPoint kInvalidWindowPosition;
|
||||
|
||||
#endif /* WORKSPACE_H */
|
||||
|
||||
Reference in New Issue
Block a user