diff --git a/src/servers/app/server/Desktop.cpp b/src/servers/app/server/Desktop.cpp index 88e83f22a9..993bd8191e 100644 --- a/src/servers/app/server/Desktop.cpp +++ b/src/servers/app/server/Desktop.cpp @@ -343,16 +343,18 @@ void Desktop::RemoveWinBorder(WinBorder *winBorder) return; } - // unlock! - Unlock(); - // Tell to winBorder's RootLayer about this. ActiveRootLayer()->RemoveWinBorder(winBorder); + // unlock! + Unlock(); } void Desktop::AddWinBorderToSubset(WinBorder *winBorder, WinBorder *toWinBorder) { + // NOTE: we can safely lock the entire method body, because this method is called from + // RootLayer's thread only. + // we're playing with window list. lock first. Lock(); @@ -380,15 +382,18 @@ void Desktop::AddWinBorderToSubset(WinBorder *winBorder, WinBorder *toWinBorder) return; } - // hey, unlock! - Unlock(); - // send WinBorder to be added to workspaces, if not already in there. ActiveRootLayer()->AddSubsetWinBorder(winBorder, toWinBorder); + + // hey, unlock! + Unlock(); } void Desktop::RemoveWinBorderFromSubset(WinBorder *winBorder, WinBorder *fromWinBorder) { + // NOTE: we can safely lock the entire method body, because this method is called from + // RootLayer's thread only. + // we're playing with window list. lock first. Lock(); @@ -400,6 +405,9 @@ void Desktop::RemoveWinBorderFromSubset(WinBorder *winBorder, WinBorder *fromWin return; } + // remove WinBorder from workspace, if needed - some other windows may still have it in their subset + ActiveRootLayer()->RemoveSubsetWinBorder(winBorder, fromWinBorder); + if (fromWinBorder->Window()->Feel() == B_NORMAL_WINDOW_FEEL) { //remove from this normal_window's subset. @@ -414,9 +422,6 @@ void Desktop::RemoveWinBorderFromSubset(WinBorder *winBorder, WinBorder *fromWin // hey, unlock! Unlock(); - - // remove WinBorder from workspace, if needed - some other windows may still have it in their subset - ActiveRootLayer()->RemoveSubsetWinBorder(winBorder, fromWinBorder); } inline diff --git a/src/servers/app/server/RootLayer.cpp b/src/servers/app/server/RootLayer.cpp index 9f4ec469e9..bb5e54d336 100644 --- a/src/servers/app/server/RootLayer.cpp +++ b/src/servers/app/server/RootLayer.cpp @@ -262,6 +262,15 @@ int32 RootLayer::WorkingThread(void *data) desktop->AddWinBorderToSubset(winBorder, toWinBorder); break; } + case AS_ROOTLAYER_REMOVE_FROM_SUBSET: + { + WinBorder *winBorder = NULL; + WinBorder *fromWinBorder = NULL; + messageQueue.Read(&winBorder); + messageQueue.Read(&fromWinBorder); + desktop->RemoveWinBorderFromSubset(winBorder, fromWinBorder); + break; + } default: STRACE(("RootLayer(%s)::WorkingThread received unexpected code %lx\n",oneRootLayer->GetName(), code)); break; diff --git a/src/servers/app/server/ServerWindow.cpp b/src/servers/app/server/ServerWindow.cpp index 0c891760d6..b9d946f45d 100644 --- a/src/servers/app/server/ServerWindow.cpp +++ b/src/servers/app/server/ServerWindow.cpp @@ -1480,8 +1480,6 @@ void ServerWindow::DispatchMessage(int32 code, LinkMsgReader &link) int32 mainToken; team_id teamID; -printf("ServerWindow %s: Message AS_REM_FROM_SUBSET UNIMPLEMENTED\n",fTitle.String()); - link.Read(&mainToken); link.Read(&teamID, sizeof(team_id)); @@ -1491,7 +1489,11 @@ printf("ServerWindow %s: Message AS_REM_FROM_SUBSET UNIMPLEMENTED\n",fTitle.Stri fMsgSender->StartMessage(SERVER_TRUE); fMsgSender->Flush(); -// fWinBorder->RemoveFromSubsetOf(wb); + BPortLink msg(-1, -1); + msg.StartMessage(AS_ROOTLAYER_REMOVE_FROM_SUBSET); + msg.Attach(fWinBorder); + msg.Attach(wb); + fWinBorder->GetRootLayer()->EnqueueMessage(msg); } else {