SATGroup* GroupIterator::NextGroup() { SATGroup* group = NULL; do { Window* window = fCurrentWindow; if (window == NULL) { group = NULL; break; } fCurrentWindow = fCurrentWindow->PreviousWindow( fCurrentWindow->CurrentWorkspace()); if (window->IsHidden() || strcmp(window->Title(), "Deskbar") == 0 || strcmp(window->Title(), "Desktop") == 0) { continue; } SATWindow* satWindow = fStackAndTile->GetSATWindow(window); group = satWindow->GetGroup(); } while (group == NULL || fCurrentGroup == group); fCurrentGroup = group; return fCurrentGroup; }
void SATGroup::_SplitGroupIfNecessary(WindowArea* removedArea) { // if there are windows stacked in the area we don't need to split if (!removedArea || removedArea->WindowList().CountItems() > 1) return; WindowAreaList neighbourWindows; _FillNeighbourList(neighbourWindows, removedArea); bool ownGroupProcessed = false; WindowAreaList newGroup; while (_FindConnectedGroup(neighbourWindows, removedArea, newGroup)) { STRACE_SAT("Connected group found; %i window(s)\n", (int)newGroup.CountItems()); if (newGroup.CountItems() == 1 && newGroup.ItemAt(0)->WindowList().CountItems() == 1) { SATWindow* window = newGroup.ItemAt(0)->WindowList().ItemAt(0); RemoveWindow(window); _EnsureGroupIsOnScreen(window->GetGroup()); } else if (ownGroupProcessed) _SpawnNewGroup(newGroup); else { _EnsureGroupIsOnScreen(this); ownGroupProcessed = true; } newGroup.MakeEmpty(); } }
void StackAndTile::WindowHidden(Window* window, bool fromMinimize) { SATWindow* satWindow = GetSATWindow(window); if (satWindow == NULL) return; SATGroup* group = satWindow->GetGroup(); if (group == NULL) return; if (fromMinimize == false && group->CountItems() > 1) group->RemoveWindow(satWindow, false); }
void StackAndTile::WindowFeelChanged(Window* window, window_feel feel) { // check if it is still a compatible feel if (feel == B_NORMAL_WINDOW_FEEL) return; SATWindow* satWindow = GetSATWindow(window); if (satWindow == NULL) return; SATGroup* group = satWindow->GetGroup(); if (group == NULL) return; if (group->CountItems() > 1) group->RemoveWindow(satWindow, false); }
void StackAndTile::WindowMinimized(Window* window, bool minimize) { SATWindow* satWindow = GetSATWindow(window); if (satWindow == NULL) return; SATGroup* group = satWindow->GetGroup(); if (group == NULL) return; Desktop* desktop = satWindow->GetWindow()->Desktop(); if (desktop == NULL) return; for (int i = 0; i < group->CountItems(); i++) { SATWindow* listWindow = group->WindowAt(i); if (listWindow != satWindow) listWindow->GetWindow()->ServerWindow()->NotifyMinimize(minimize); } }
bool SATWindowBehaviour::AlterDeltaForSnap(Window* window, BPoint& delta, bigtime_t now) { if (DefaultWindowBehaviour::AlterDeltaForSnap(window, delta, now) == true) return true; SATWindow* satWindow = fStackAndTile->GetSATWindow(window); if (satWindow == NULL) return false; SATGroup* group = satWindow->GetGroup(); if (group == NULL) return false; BRect groupFrame = group->WindowAt(0)->CompleteWindowFrame(); for (int32 i = 1; i < group->CountItems(); i++) groupFrame = groupFrame | group->WindowAt(i)->CompleteWindowFrame(); return fMagneticBorder.AlterDeltaForSnap(window->Screen(), groupFrame, delta, now); }
void StackAndTile::WindowWorkspacesChanged(Window* window, uint32 workspaces) { SATWindow* satWindow = GetSATWindow(window); if (satWindow == NULL) return; SATGroup* group = satWindow->GetGroup(); if (group == NULL) return; Desktop* desktop = satWindow->GetWindow()->Desktop(); if (desktop == NULL) return; const WindowAreaList& areaList = group->GetAreaList(); for (int32 i = 0; i < areaList.CountItems(); i++) { WindowArea* area = areaList.ItemAt(i); if (area->WindowList().HasItem(satWindow)) continue; SATWindow* topWindow = area->TopWindow(); desktop->SetWindowWorkspaces(topWindow->GetWindow(), workspaces); } }
void StackAndTile::WindowSentBehind(Window* window, Window* behindOf) { SATWindow* satWindow = GetSATWindow(window); if (satWindow == NULL) return; SATGroup* group = satWindow->GetGroup(); if (group == NULL) return; Desktop* desktop = satWindow->GetWindow()->Desktop(); if (desktop == NULL) return; const WindowAreaList& areaList = group->GetAreaList(); for (int32 i = 0; i < areaList.CountItems(); i++) { WindowArea* area = areaList.ItemAt(i); SATWindow* topWindow = area->TopWindow(); if (topWindow == NULL || topWindow == satWindow) continue; desktop->SendWindowBehind(topWindow->GetWindow(), behindOf); } }