status_t SATGroup::ArchiveGroup(BMessage& archive) { archive.AddInt32("htab_count", fHorizontalTabs.CountItems()); archive.AddInt32("vtab_count", fVerticalTabs.CountItems()); for (int i = 0; i < fWindowAreaList.CountItems(); i++) { WindowArea* area = fWindowAreaList.ItemAt(i); int32 leftTab = fVerticalTabs.IndexOf(area->LeftTab()); int32 rightTab = fVerticalTabs.IndexOf(area->RightTab()); int32 topTab = fHorizontalTabs.IndexOf(area->TopTab()); int32 bottomTab = fHorizontalTabs.IndexOf(area->BottomTab()); BMessage areaMessage; areaMessage.AddInt32("left_tab", leftTab); areaMessage.AddInt32("right_tab", rightTab); areaMessage.AddInt32("top_tab", topTab); areaMessage.AddInt32("bottom_tab", bottomTab); const SATWindowList& windowList = area->WindowList(); for (int a = 0; a < windowList.CountItems(); a++) areaMessage.AddInt64("window", windowList.ItemAt(a)->Id()); archive.AddMessage("area", &areaMessage); } return B_OK; }
bool SATWindow::StackWindow(SATWindow* child) { SATGroup* group = GetGroup(); WindowArea* area = GetWindowArea(); if (!group || !area) return false; bool status = group->AddWindow(child, area, this); if (status) { area->WindowList().ItemAt(0)->SetStackedMode(true); // for the case we are the first added window child->SetStackedMode(true); } DoGroupLayout(); return true; }
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); } }
bool StackingEventHandler::HandleMessage(SATWindow* sender, BPrivate::LinkReceiver& link, BPrivate::LinkSender& reply) { Desktop* desktop = sender->GetDesktop(); StackAndTile* stackAndTile = sender->GetStackAndTile(); int32 what; link.Read<int32>(&what); switch (what) { case kAddWindowToStack: { port_id port; int32 token; team_id team; link.Read<port_id>(&port); link.Read<int32>(&token); link.Read<team_id>(&team); int32 position; if (link.Read<int32>(&position) != B_OK) return false; WindowArea* area = sender->GetWindowArea(); if (!area) return false; if (position < 0) position = area->WindowList().CountItems() - 1; SATWindow* parent = area->WindowList().ItemAt(position); Window* window = desktop->WindowForClientLooperPort(port); if (!parent || !window) { reply.StartMessage(B_BAD_VALUE); reply.Flush(); break; } SATWindow* candidate = stackAndTile->GetSATWindow(window); if (!candidate) return false; if (!parent->StackWindow(candidate)) return false; reply.StartMessage(B_OK); reply.Flush(); break; } case kRemoveWindowFromStack: { port_id port; int32 token; team_id team; link.Read<port_id>(&port); link.Read<int32>(&token); if (link.Read<team_id>(&team) != B_OK) return false; SATGroup* group = sender->GetGroup(); if (!group) return false; Window* window = desktop->WindowForClientLooperPort(port); if (!window) { reply.StartMessage(B_BAD_VALUE); reply.Flush(); break; } SATWindow* candidate = stackAndTile->GetSATWindow(window); if (!candidate) return false; if (!group->RemoveWindow(candidate, false)) return false; break; } case kRemoveWindowFromStackAt: { int32 position; if (link.Read<int32>(&position) != B_OK) return false; SATGroup* group = sender->GetGroup(); WindowArea* area = sender->GetWindowArea(); if (!area || !group) return false; SATWindow* removeWindow = area->WindowList().ItemAt(position); if (!removeWindow) { reply.StartMessage(B_BAD_VALUE); reply.Flush(); break; } if (!group->RemoveWindow(removeWindow, false)) return false; ServerWindow* window = removeWindow->GetWindow()->ServerWindow(); reply.StartMessage(B_OK); reply.Attach<port_id>(window->ClientLooperPort()); reply.Attach<int32>(window->ClientToken()); reply.Attach<team_id>(window->ClientTeam()); reply.Flush(); break; } case kCountWindowsOnStack: { WindowArea* area = sender->GetWindowArea(); if (!area) return false; reply.StartMessage(B_OK); reply.Attach<int32>(area->WindowList().CountItems()); reply.Flush(); break; } case kWindowOnStackAt: { int32 position; if (link.Read<int32>(&position) != B_OK) return false; WindowArea* area = sender->GetWindowArea(); if (!area) return false; SATWindow* satWindow = area->WindowList().ItemAt(position); if (!satWindow) { reply.StartMessage(B_BAD_VALUE); reply.Flush(); break; } ServerWindow* window = satWindow->GetWindow()->ServerWindow(); reply.StartMessage(B_OK); reply.Attach<port_id>(window->ClientLooperPort()); reply.Attach<int32>(window->ClientToken()); reply.Attach<team_id>(window->ClientTeam()); reply.Flush(); break; } case kStackHasWindow: { port_id port; int32 token; team_id team; link.Read<port_id>(&port); link.Read<int32>(&token); if (link.Read<team_id>(&team) != B_OK) return false; Window* window = desktop->WindowForClientLooperPort(port); if (!window) { reply.StartMessage(B_BAD_VALUE); reply.Flush(); break; } SATWindow* candidate = stackAndTile->GetSATWindow(window); if (!candidate) return false; WindowArea* area = sender->GetWindowArea(); if (!area) return false; reply.StartMessage(B_OK); reply.Attach<bool>(area->WindowList().HasItem(candidate)); reply.Flush(); break; } default: return false; } return true; }