diff --git a/src/servers/app/server/Desktop.cpp b/src/servers/app/server/Desktop.cpp index e88e3f8cc4..c5394ccac8 100644 --- a/src/servers/app/server/Desktop.cpp +++ b/src/servers/app/server/Desktop.cpp @@ -259,6 +259,14 @@ void Desktop::AddWinBorder(WinBorder* winBorder) // other windows are added to the current RootLayer only. ActiveRootLayer()->AddWinBorder(winBorder); + // TODO: try to unify this code with that for B_MOUSE_DOWN + winBorder->Window()->Lock(); + BRegion invalidRegion; + invalidRegion.Include(&(winBorder->fFull)); + invalidRegion.Include(&(winBorder->fTopLayer->fFull)); + winBorder->fParent->RebuildAndForceRedraw(invalidRegion, winBorder); + winBorder->Window()->Unlock(); + // add that pointer to user winboder list so that we can keep track of them. fLayerLock.Lock(); fWinBorderList.AddItem(winBorder); @@ -345,7 +353,8 @@ printf("Focus: %s\n", ws->FocusLayer()->GetName()); ws->BringToFrontANormalWindow(target); ws->SearchAndSetNewFront(target); previousFocus = ws->FocusLayer(); - activeFocus = ws->SetFocusLayer(target); + ws->SearchAndSetNewFocus(target); + activeFocus = ws->FocusLayer(); activeFocus->Window()->Lock(); diff --git a/src/servers/app/server/Layer.cpp b/src/servers/app/server/Layer.cpp index 108b012cbb..c25497ee83 100644 --- a/src/servers/app/server/Layer.cpp +++ b/src/servers/app/server/Layer.cpp @@ -446,7 +446,15 @@ void Layer::RequestDraw(const BRegion ®, Layer *startFrom) int redraw = false; if (startFrom == NULL) redraw = true; - +/* +srand(real_time_clock_usecs()); +RGBColor c(rand()/256,34,56); +BRegion reg1 = reg; +fDriver->ConstrainClippingRegion(®1); +fDriver->FillRect(reg.Frame(), c); +fDriver->ConstrainClippingRegion(NULL); +snooze(1000000); +*/ if (fVisible.CountRects() > 0) { // client side drawing. Send only one UPDATE message! @@ -526,7 +534,6 @@ void Layer::RequestDraw(const BRegion ®, Layer *startFrom) void Layer::Draw(const BRect &r) { // TODO/NOTE: this should be an empty method! the next lines are for testing only - #ifdef DEBUG_LAYER printf("Layer::Draw: "); r.PrintToStream(); diff --git a/src/servers/app/server/RootLayer.cpp b/src/servers/app/server/RootLayer.cpp index 5f04f2d609..dc45de7361 100644 --- a/src/servers/app/server/RootLayer.cpp +++ b/src/servers/app/server/RootLayer.cpp @@ -216,12 +216,6 @@ void RootLayer::AddWinBorderToWorkspaces(WinBorder* winBorder, uint32 wks) if (!(fMainLock.IsLocked())) debugger("RootLayer::AddWinBorderToWorkspaces - fMainLock has to be locked!\n"); - if (wks == B_CURRENT_WORKSPACE) - { - ActiveWorkspace()->AddLayerPtr(winBorder); - return; - } - for( int32 i=0; i < 32; i++) { if( wks & (0x00000001 << i) && i < WorkspaceCount()) @@ -243,7 +237,7 @@ void RootLayer::AddWinBorder(WinBorder* winBorder) STRACE(("*RootLayer::AddWinBorder(%s) - Main lock acquired\n", winBorder->GetName())); // in case we want to be added to the current workspace - if (winBorder->Window()->Workspaces() == 0) + if (winBorder->Window()->Workspaces() == B_CURRENT_WORKSPACE) winBorder->Window()->QuietlySetWorkspaces(0x00000001 << (ActiveWorkspaceIndex()-1)); // add winBorder to the known list of WinBorders so we can keep track of it. @@ -253,86 +247,43 @@ void RootLayer::AddWinBorder(WinBorder* winBorder) switch(winBorder->Window()->Feel()) { case B_MODAL_SUBSET_WINDOW_FEEL: + case B_FLOATING_SUBSET_WINDOW_FEEL: { -printf("XXXXXXXX1: 21\n"); // this kind of window isn't added anywhere. It will be added // to main window's subset when winBorder::AddToSubsetOf(main) // will be called. break; } case B_MODAL_APP_WINDOW_FEEL: + case B_FLOATING_APP_WINDOW_FEEL: { -printf("XXXXXXXX1: 22\n"); // add to app's list of Floating/Modal windows (as opposed to the system's) winBorder->Window()->App()->fAppFMWList.AddItem(winBorder); - // determine in witch workspaces to add this winBorder. + // determine in which workspaces to add this winBorder object. uint32 wks = 0; - - // TODO: change later when you put this code into the server for (int32 i=0; iGoToBottomItem(); wb!=NULL; wb = ws->GoToUpperItem()) { - if ( !(wb->IsHidden()) && - winBorder->Window()->ClientTeamID() == wb->Window()->ClientTeamID()) + if ( winBorder->Window()->ClientTeamID() == wb->Window()->ClientTeamID()) { wks = wks | winBorder->Window()->Workspaces(); break; } } } - // by using _bottomchild and _uppersibling. AddWinBorderToWorkspaces(winBorder, wks); break; } case B_MODAL_ALL_WINDOW_FEEL: - { -printf("XXXXXXXX1: 23\n"); - // add to system's list of Floating/Modal Windows (as opposed to the app's list) - fMainFMWList.AddItem(winBorder); - - // add this winBorder to all workspaces - AddWinBorderToWorkspaces(winBorder, 0xffffffffUL); - break; - } - - case B_FLOATING_SUBSET_WINDOW_FEEL: - { -printf("XXXXXXXX1: 24\n"); - // this kind of window isn't added anywhere. It *will* be added to WS's list - // when its main window will become the front one. - // Also, it will be added to MainWinBorder's list when - // winBorder::AddToSubset(main) is called. - break; - } - - case B_FLOATING_APP_WINDOW_FEEL: - { -printf("XXXXXXXX1: 25\n"); - // add to app's list of Floating/Modal windows (as opposed to the system's) - winBorder->Window()->App()->fAppFMWList.AddItem(winBorder); - - for (int32 i=0; iFrontLayer(); - if(wb && wb->Window()->ClientTeamID() == winBorder->Window()->ClientTeamID() - && wb->Window()->Feel() == B_NORMAL_WINDOW_FEEL) - { - ws->AddLayerPtr(winBorder); - } - } - - break; - } - case B_FLOATING_ALL_WINDOW_FEEL: { -printf("XXXXXXXX1: 26\n"); - // add to system's list of Floating/Modal Windows (as opposed to the app's list) + // add to system's list of Floating/Modal Windows fMainFMWList.AddItem(winBorder); // add this winBorder to all workspaces @@ -342,25 +293,24 @@ printf("XXXXXXXX1: 26\n"); case B_NORMAL_WINDOW_FEEL: { -printf("XXXXXXXX1: 27\n"); // add this winBorder to the specified workspaces AddWinBorderToWorkspaces(winBorder, winBorder->Window()->Workspaces()); break; } + case B_SYSTEM_LAST: case B_SYSTEM_FIRST: { -printf("XXXXXXXX1: 28\n"); // add this winBorder to all workspaces AddWinBorderToWorkspaces(winBorder, 0xffffffffUL); break; } default:{ -printf("XXXXXXXX1: 29\n"); + debugger("RootLayer::AddWinBorder() - what kind of window is this?"); break; } } // end switch(winborder->Feel()) -printf("XXXXXXXX1: 4\n"); + fMainLock.Unlock(); STRACE(("*RootLayer::AddWinBorder(%s) - Main lock released\n", winBorder->GetName())); @@ -456,7 +406,7 @@ bool RootLayer::SetFrontWinBorder(WinBorder* winBorder) if (!winBorder) { - ActiveWorkspace()->SetFrontLayer(NULL); + ActiveWorkspace()->SearchAndSetNewFront(NULL); return true; } @@ -486,12 +436,12 @@ bool RootLayer::SetFrontWinBorder(WinBorder* winBorder) if(newWorkspace != ActiveWorkspaceIndex()) { - WorkspaceAt(newWorkspace)->SetFrontLayer(winBorder); + WorkspaceAt(newWorkspace)->SearchAndSetNewFront(winBorder); SetActiveWorkspaceByIndex(newWorkspace); } else { - ActiveWorkspace()->SetFrontLayer(winBorder); + ActiveWorkspace()->SearchAndSetNewFront(winBorder); } fMainLock.Unlock(); diff --git a/src/servers/app/server/ServerWindow.cpp b/src/servers/app/server/ServerWindow.cpp index 1092b9604b..7acc764f02 100644 --- a/src/servers/app/server/ServerWindow.cpp +++ b/src/servers/app/server/ServerWindow.cpp @@ -288,7 +288,7 @@ void ServerWindow::Show(void) ws->BringToFrontANormalWindow(fWinBorder); ws->SearchAndSetNewFront(fWinBorder); previousFocus = ws->FocusLayer(); - ws->SetFocusLayer(fWinBorder); + ws->SearchAndSetNewFocus(fWinBorder); // TODO: only do this in for the active workspace! // first redraw previous window's decorator. It has lost focus state. if (previousFocus) @@ -351,12 +351,12 @@ void ServerWindow::Hide(void) if (ws->FrontLayer() == fWinBorder) { ws->HideSubsetWindows(fWinBorder); - ws->SetFocusLayer(ws->FrontLayer()); + ws->SearchAndSetNewFocus(ws->FrontLayer()); } else { if (ws->FocusLayer() == fWinBorder) - ws->SetFocusLayer(fWinBorder); + ws->SearchAndSetNewFocus(fWinBorder); else ws->Invalidate(); } diff --git a/src/servers/app/server/Workspace.cpp b/src/servers/app/server/Workspace.cpp index 47bf58bd36..fd9a65d282 100644 --- a/src/servers/app/server/Workspace.cpp +++ b/src/servers/app/server/Workspace.cpp @@ -113,6 +113,9 @@ Workspace::~Workspace(void) */ bool Workspace::AddLayerPtr(WinBorder *layer) { + if (layer == NULL) + debugger("NULL pointer in Workspace::AddLayerPtr\n"); + // allocate a new item ListData *item; item = new ListData; @@ -130,15 +133,13 @@ bool Workspace::AddLayerPtr(WinBorder *layer) STRACE(("\n*AddLayerPtr(%s) -", layer->GetName())); - // this may happen in case of subset windows. - if(!(layer->IsHidden())) - { - // do a *smart* search and set the new 'front' - SearchAndSetNewFront(layer); + BringToFrontANormalWindow(layer); - // do a *smart* search and set the new 'focus' + a redraw - SetFocusLayer(layer); - } + // do a *smart* search and set the new 'front' + SearchAndSetNewFront(layer); + + // do a *smart* search and set the new 'focus' + SearchAndSetNewFocus(layer); return true; } @@ -200,14 +201,9 @@ bool Workspace::RemoveLayerPtr(WinBorder *layer) // reset some internal variables layer->SetMainWinBorder(NULL); - // its RootLayer is set to NULL by Layer::RemoveChild(layer); - STRACE(("Layer %s found and removed from Workspace No %ld\n", layer->GetName(), ID())); - if(wasFocus) - SetFocusLayer(nextItem? nextItem->layerPtr: NULL); - else - Invalidate(); + SearchAndSetNewFocus(nextItem? nextItem->layerPtr: NULL); return true; } @@ -267,53 +263,11 @@ bool Workspace::HideSubsetWindows(WinBorder *layer) } } -WinBorder *Workspace::SetFocusLayer(WinBorder *layer) -{ - STRACE(("\n@Workspace(%ld)::SetFOCUSLayer( %s )\n", ID(), layer? layer->GetName(): "NULL")); - - if(!(desktop->fGeneralLock.IsLocked())) - debugger("Workspace::SetFocusLayer - desktop->fGeneralLock must be LOCKED!\n"); - - WinBorder *previousFocus = FocusLayer(); - - SearchAndSetNewFocus(layer); - - if(previousFocus != FocusLayer()) - { - if(previousFocus) - previousFocus->HighlightDecorator(false); - - if(FocusLayer()) - FocusLayer()->HighlightDecorator(true); - } - - STRACE(("\n#Workspace(%ld)::SetFOCUSLayer( %s ) ENDED\n", ID(), layer? layer->GetName(): "NULL")); - - return FocusLayer(); -} - WinBorder *Workspace::FocusLayer() const { return fFocusItem ? fFocusItem->layerPtr : NULL; } -WinBorder *Workspace::SetFrontLayer(WinBorder *layer) -{ - STRACE(("\n@Workspace(%ld)::SetFrontLayer( %s )\n", ID(), layer? layer->GetName(): "NULL")); - - if(!(desktop->fGeneralLock.IsLocked())) - debugger("Workspace::SetFRONTLayer - desktop->fGeneralLock must be LOCKED!\n"); - - SearchAndSetNewFront(layer); - - STRACESTREAM(); - - // TODO: remove? - Invalidate(); - - return fFrontItem? fFrontItem->layerPtr: NULL;; -} - WinBorder *Workspace::FrontLayer() const { return fFrontItem? fFrontItem->layerPtr: NULL; diff --git a/src/servers/app/server/Workspace.h b/src/servers/app/server/Workspace.h index 228f536435..d9f6ffd107 100644 --- a/src/servers/app/server/Workspace.h +++ b/src/servers/app/server/Workspace.h @@ -54,9 +54,7 @@ public: bool AddLayerPtr(WinBorder *layer); bool RemoveLayerPtr(WinBorder *layer); bool HideSubsetWindows(WinBorder *layer); - WinBorder *SetFocusLayer(WinBorder *layer); WinBorder *FocusLayer(void) const; - WinBorder *SetFrontLayer(WinBorder *layer); WinBorder *FrontLayer(void) const; void MoveToBack(WinBorder *newLast);