From 34168867a471d95c126ca2b3516291ea97bfd778 Mon Sep 17 00:00:00 2001 From: Adi Oanca Date: Fri, 16 Jan 2004 16:09:36 +0000 Subject: [PATCH] solved some problems with floating subset windows git-svn-id: file:///srv/svn/repos/haiku/trunk/current@6108 a95241bf-73f2-0310-859d-f6bbb57e9c96 --- src/servers/app/server/Desktop.cpp | 5 +++-- src/servers/app/server/Desktop.h | 2 +- src/servers/app/server/ServerWindow.cpp | 4 +++- src/servers/app/server/WinBorder.cpp | 9 ++++---- src/servers/app/server/Workspace.cpp | 29 ++++++++++++++++++++----- 5 files changed, 36 insertions(+), 13 deletions(-) diff --git a/src/servers/app/server/Desktop.cpp b/src/servers/app/server/Desktop.cpp index d0d3c20645..589ea2fd39 100644 --- a/src/servers/app/server/Desktop.cpp +++ b/src/servers/app/server/Desktop.cpp @@ -456,11 +456,12 @@ void Desktop::PrintToStream(){ } //--------------------------------------------------------------------------- -WinBorder* Desktop::FindWinBorderByServerWindowToken(int32 token){ +WinBorder* Desktop::FindWinBorderByServerWindowTokenAndTeamID(int32 token, team_id teamID){ WinBorder* wb; fLayerLock.Lock(); for (int32 i = 0; (wb = (WinBorder*)fWinBorderList.ItemAt(i)); i++){ - if (wb->Window()->ClientToken() == token) + if (wb->Window()->ClientToken() == token + && wb->Window()->ClientTeamID() == teamID) break; } fLayerLock.Unlock(); diff --git a/src/servers/app/server/Desktop.h b/src/servers/app/server/Desktop.h index 053f74577e..e21e195e18 100644 --- a/src/servers/app/server/Desktop.h +++ b/src/servers/app/server/Desktop.h @@ -74,7 +74,7 @@ public: // "Private" to app_server :-) - means they should not be used very much void RemoveSubsetWindow(WinBorder* wb); - WinBorder* FindWinBorderByServerWindowToken(int32 token); + WinBorder* FindWinBorderByServerWindowTokenAndTeamID(int32 token, team_id teamID); BLocker fGeneralLock; BLocker fLayerLock; diff --git a/src/servers/app/server/ServerWindow.cpp b/src/servers/app/server/ServerWindow.cpp index b9ebe098b7..23a1e705e2 100644 --- a/src/servers/app/server/ServerWindow.cpp +++ b/src/servers/app/server/ServerWindow.cpp @@ -1390,10 +1390,12 @@ TODO: Figure out what Adi did here and convert to PortMessages { WinBorder *wb; int32 mainToken; + team_id teamID; ses->ReadInt32(&mainToken); + ses->ReadData(&teamID, sizeof(team_id)); - wb = desktop->FindWinBorderByServerWindowToken(mainToken); + wb = desktop->FindWinBorderByServerWindowTokenAndTeamID(mainToken, teamID); if(wb){ ses->WriteInt32(SERVER_TRUE); ses->Sync(); diff --git a/src/servers/app/server/WinBorder.cpp b/src/servers/app/server/WinBorder.cpp index ed6bc36769..b29d049f02 100644 --- a/src/servers/app/server/WinBorder.cpp +++ b/src/servers/app/server/WinBorder.cpp @@ -91,6 +91,7 @@ WinBorder::WinBorder(const BRect &r, const char *name, const int32 look, const i fLastMousePosition.Set(-1,-1); SetLevel(); + fMainWinBorder = NULL; _decorator = NULL; if (feel == B_NO_BORDER_WINDOW_LOOK){ @@ -734,9 +735,9 @@ void WinBorder::AddToSubsetOf(WinBorder* main){ RootLayer *rl = main->GetRootLayer(); desktop->fGeneralLock.Lock(); -printf("WinBorder(%s)::AddToSubsetOf() - General lock acquired\n", GetName()); +printf("WinBorder(%s)::AddToSubsetOf(%s) - General lock acquired\n", GetName(), main->GetName()); rl->fMainLock.Lock(); -printf("WinBorder(%s)::AddToSubsetOf() - Main lock acquired\n", GetName()); +printf("WinBorder(%s)::AddToSubsetOf(%s) - Main lock acquired\n", GetName(), main->GetName()); for(int32 i = 0; i < rl->WorkspaceCount(); i++){ Workspace *ws = rl->WorkspaceAt(i+1); @@ -745,9 +746,9 @@ printf("WinBorder(%s)::AddToSubsetOf() - Main lock acquired\n", GetName()); } rl->fMainLock.Unlock(); -printf("WinBorder(%s)::AddToSubsetOf() - Main lock released\n", GetName()); +printf("WinBorder(%s)::AddToSubsetOf(%s) - Main lock released\n", GetName(), main->GetName()); desktop->fGeneralLock.Unlock(); -printf("WinBorder(%s)::AddToSubsetOf() - General lock released\n", GetName()); +printf("WinBorder(%s)::AddToSubsetOf(%s) - General lock released\n", GetName(), main->GetName()); } } } diff --git a/src/servers/app/server/Workspace.cpp b/src/servers/app/server/Workspace.cpp index 18f5824023..1687321356 100644 --- a/src/servers/app/server/Workspace.cpp +++ b/src/servers/app/server/Workspace.cpp @@ -181,13 +181,13 @@ STRACE(("\n@Workspace(%ld)::SetFOCUSLayer( %s )\n", ID(), layer? layer->GetName( } // TODO: there had to be a Invalidate() vresion witch takes a BRegion parameter +STRACESTREAM(); Invalidate(); } else{ // Do nothing! } -STRACESTREAM(); STRACE(("\n#Workspace(%ld)::SetFOCUSLayer( %s ) ENDED\n", ID(), layer? layer->GetName(): "NULL")); return FocusLayer(); @@ -333,8 +333,10 @@ void Workspace::RemoveItem(ListData* item){ item->upperItem = NULL; item->lowerItem = NULL; - if (fFocusItem == item) + if (fFocusItem == item){ + fFocusItem->layerPtr->SetFocus(false); fFocusItem = NULL; + } if (fFrontItem == item) fFrontItem = NULL; if (fCurrentItem == item) @@ -517,6 +519,8 @@ STRACE(("#WS(%ld)::SASNF(%s) ENDED 1\n", ID(), preferred? preferred->GetName(): return; } +// ListData *exFocusItem = fFocusItem; + // properly place this 'preferred' WinBorder. ListData *lastInserted; lastInserted = FindPlace(HasItem(preferred)); @@ -549,6 +553,18 @@ STRACE((" NORMAL Window '%s' -", preferred? preferred->GetName(): "NULL")); // if they are in the same team... if (preferred->Window()->ClientTeamID() == fFrontItem->layerPtr->Window()->ClientTeamID()){ STRACE((" SAME TeamID\n")); +/* + { + int32 exFeel = exFocusItem? exFocusItem->layerPtr->Window()->Feel() : 0; + if (exFocusItem && + (exFeel == B_FLOATING_SUBSET_WINDOW_FEEL || exFeel == B_MODAL_SUBSET_WINDOW_FEEL) + { + if ( !(fFocusItem->layerPtr->Window()->fWinFMWList.HasItem(exFocusItem->layerPtr)) ){ + + } + } + } +*/ // collect subset windows that are common to application's windows... // NOTE: A subset window *can* be added to more than just one window. FMWList commonFMW; @@ -683,7 +699,7 @@ STRACE((" DIFERRENT TeamID\n")); // windows to be inserted fFrontItem = NULL; goto et1; - } // else - if diferrent ClientTeamID()s. + } // END: else - if diferrent ClientTeamID()s. } // if (fFrontItem) && NORMAL_WINDOW else{ STRACE((" NO previous FRONT Item\n")); @@ -913,7 +929,8 @@ STRACE((" MODAL ALL/SYSTEM FIRST Window '%s'\n", preferred? preferred->GetName() else STRACE((" The window IS Hidden\n")); - ListData *newFrontItem = NULL; + ListData *exFrontItem = fFrontItem; + ListData *newFrontItem = NULL; if(preferred){ int32 feel = fBottomItem->layerPtr->Window()->Feel(); @@ -921,7 +938,9 @@ STRACE((" MODAL ALL/SYSTEM FIRST Window '%s'\n", preferred? preferred->GetName() if(preferred->_level == B_FLOATING_SUBSET_FEEL || preferred->_level == B_FLOATING_APP_FEEL || preferred->_level == B_FLOATING_ALL_FEEL) - { } + { + newFrontItem = exFrontItem; + } // if the last in workspace's list is one of these, GIVE focus to it! else if((feel == B_SYSTEM_FIRST || feel == B_MODAL_ALL_WINDOW_FEEL) && !(fBottomItem->layerPtr->IsHidden()) )