+static bool colLRTB(const Rect &first, const Rect &second) {
+ if (first.x() == second.x())
+ return first.y() < second.y();
+ return first.x() < second.x();
+}
+
+static bool colLRBT(const Rect &first, const Rect &second) {
+ if (first.x() == second.x())
+ return first.bottom() > second.bottom();
+ return first.x() < second.x();
+}
+
+static bool colRLTB(const Rect &first, const Rect &second) {
+ if (first.right() == second.right())
+ return first.y() < second.y();
+ return first.right() > second.right();
+}
+
+static bool colRLBT(const Rect &first, const Rect &second) {
+ if (first.right() == second.right())
+ return first.bottom() > second.bottom();
+ return first.right() > second.right();
+}
+
+
+bool Workspace::smartPlacement(Rect& win) {
+ rectList spaces;
+
+ //initially the entire screen is free
+#ifdef XINERAMA
+ if (screen->isXineramaActive() &&
+ screen->getBlackbox()->doXineramaPlacement()) {
+ RectList availableAreas = screen->allAvailableAreas();
+ RectList::iterator it, end = availableAreas.end();
+
+ for (it = availableAreas.begin(); it != end; ++it)
+ spaces.push_back(*it);
+ } else
+#endif // XINERAMA
+ spaces.push_back(screen->availableArea());
+
+ //Find Free Spaces
+ BlackboxWindowList::const_iterator wit = windowList.begin(),
+ end = windowList.end();
+ Rect tmp;
+ for (; wit != end; ++wit) {
+ const BlackboxWindow* const curr = *wit;
+
+ // watch for shaded windows and full-maxed windows
+ if (curr->isShaded()) {
+ if (screen->getPlaceIgnoreShaded()) continue;
+ } else if (curr->isMaximizedFull()) {
+ if (screen->getPlaceIgnoreMaximized()) continue;