+
+bool Workspace::isLastWindow(const BlackboxWindow* const w) const {
+ return (w == windowList.back());
+}
+
+
+void Workspace::setCurrent(void) {
+ screen->changeWorkspaceID(id);
+}
+
+
+void Workspace::readName(void) {
+ XAtom::StringVect namesList;
+ unsigned long numnames = id + 1;
+
+ // attempt to get from the _NET_WM_DESKTOP_NAMES property
+ if (xatom->getValue(screen->getRootWindow(), XAtom::net_desktop_names,
+ XAtom::utf8, numnames, namesList) &&
+ namesList.size() > id) {
+ name = namesList[id];
+
+ clientmenu->setLabel(name);
+ clientmenu->update();
+ } else {
+ /*
+ Use a default name. This doesn't actually change the class. That will
+ happen after the setName changes the root property, and that change
+ makes its way back to this function.
+ */
+ string tmp =i18n(WorkspaceSet, WorkspaceDefaultNameFormat,
+ "Workspace %d");
+ assert(tmp.length() < 32);
+ char default_name[32];
+ sprintf(default_name, tmp.c_str(), id + 1);
+
+ setName(default_name); // save this into the _NET_WM_DESKTOP_NAMES property
+ }
+}
+
+
+void Workspace::setName(const string& new_name) {
+ // set the _NET_WM_DESKTOP_NAMES property with the new name
+ XAtom::StringVect namesList;
+ unsigned long numnames = (unsigned) -1;
+ if (xatom->getValue(screen->getRootWindow(), XAtom::net_desktop_names,
+ XAtom::utf8, numnames, namesList) &&
+ namesList.size() > id)
+ namesList[id] = new_name;
+ else
+ namesList.push_back(new_name);
+
+ xatom->setValue(screen->getRootWindow(), XAtom::net_desktop_names,
+ XAtom::utf8, namesList);
+}
+
+
+/*
+ * Calculate free space available for window placement.
+ */
+typedef std::vector<Rect> rectList;
+
+static rectList calcSpace(const Rect &win, const rectList &spaces) {
+ Rect isect, extra;