Fixed a stupid bug when checking if the window order changed. Added support for BWindow::Activate(false). Added some debug support for Workspace::WMState. Simplified a bit code for sending a window to back.

git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@14563 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
Adi Oanca
2005-10-29 10:19:23 +00:00
parent 88820e7210
commit 9f0d28e921
6 changed files with 31 additions and 12 deletions
+7 -4
View File
@@ -864,7 +864,7 @@ RootLayer::RevealNewWMState(Workspace::State &oldWMState)
invalidate = true;
}
else if (memcmp(oldWMState.WindowList.Items(), fWMState.WindowList.Items(),
fWMState.WindowList.CountItems()) != 0) {
fWMState.WindowList.CountItems()*sizeof(void*)) != 0) {
invalidate = true;
}
@@ -908,7 +908,7 @@ RootLayer::RevealNewWMState(Workspace::State &oldWMState)
}
bool
RootLayer::SetActive(WinBorder* newActive)
RootLayer::SetActive(WinBorder* newActive, bool activate)
{
bool returnValue = false;
uint32 workspaceIndex = newActive->Workspaces();
@@ -921,7 +921,10 @@ RootLayer::SetActive(WinBorder* newActive)
Workspace::State oldWMState;
ActiveWorkspace()->GetState(&oldWMState);
returnValue = ActiveWorkspace()->AttemptToActivate(newActive);
if (activate)
returnValue = ActiveWorkspace()->AttemptToActivate(newActive);
else
returnValue = ActiveWorkspace()->AttemptToMoveToBack(newActive);
RevealNewWMState(oldWMState);
}
@@ -935,7 +938,7 @@ RootLayer::SetActive(WinBorder* newActive)
// If this WinBorder does not appear in current workspace,
// change to the first one who does.
if (!(workspaceIndex & (0x00000001UL << fActiveWksIndex))) {
if (activate && !(workspaceIndex & (0x00000001UL << fActiveWksIndex))) {
// find an workspace index in which this Layer appears
for (int32 i = 0; i < kMaxWorkspaceCount; i++) {
if (workspaceIndex & (0x00000001UL << i)) {
+1 -1
View File
@@ -93,7 +93,7 @@ public:
inline WinBorder* Focus() const { return fWMState.Focus; }
inline WinBorder* Front() const { return fWMState.Front; }
inline WinBorder* Active() const { return fWMState.Active; }
bool SetActive(WinBorder* newActive);
bool SetActive(WinBorder* newActive, bool activate = true);
inline void SetWorkspaceCount(int32 wksCount);
inline int32 WorkspaceCount() const { return fWsCount; }
+5 -1
View File
@@ -1470,8 +1470,12 @@ myRootLayer->Unlock();
case AS_ACTIVATE_WINDOW:
{
DTRACE(("ServerWindow %s: Message AS_ACTIVATE_WINDOW: Layer: %s\n", Title(), fCurrentLayer->Name()));
bool activate = true;
link.Read<bool>(&activate);
if (myRootLayer && myRootLayer->Lock()) {
myRootLayer->SetActive(fWinBorder);
myRootLayer->SetActive(fWinBorder, activate);
myRootLayer->Unlock();
}
break;
+1 -6
View File
@@ -523,12 +523,7 @@ WinBorder::MouseDown(const BMessage *msg)
// based on what the Decorator returned, properly place this window.
if (action == DEC_MOVETOBACK) {
Workspace::State oldWMState;
GetRootLayer()->ActiveWorkspace()->GetState(&oldWMState);
GetRootLayer()->ActiveWorkspace()->MoveToBack(this);
GetRootLayer()->RevealNewWMState(oldWMState);
GetRootLayer()->SetActive(this, false);
}
else {
GetRootLayer()->SetNotifyLayer(this, B_POINTER_EVENTS, 0UL);
+14
View File
@@ -91,6 +91,20 @@
# define STRACESTREAM() ;
#endif
void
Workspace::State::PrintToStream()
{
printf("WS::State - Front: %s\n", Front? Front->Name(): "NULL");
printf("WS::State - Focus: %s\n", Focus? Focus->Name(): "NULL");
printf("WS::State - Active: %s\n", Active? Active->Name(): "NULL");
for (int32 i = 0; i < WindowList.CountItems(); ++i) {
Layer *l = (Layer*)WindowList.ItemAt(i);
if (l)
printf("\t %ld - %s\n", i, l->Name());
}
}
//----------------------------------------------------------------------------------
/*!
\brief Creates a new Workspace object which has its own resolution and background color.
+3
View File
@@ -52,6 +52,9 @@ class Workspace {
class State {
public:
State() : Front(NULL), Focus(NULL), WindowList(50) { }
void PrintToStream();
WinBorder* Front;
WinBorder* Focus;
WinBorder* Active;