X-Git-Url: https://git.dogcows.com/gitweb?a=blobdiff_plain;f=src%2FWorkspace.cc;h=64710a59a999f86d14b089ef5600c22f2bbdf9da;hb=8941da8e41d15ae6729c04b2933d74869c25e857;hp=0bc906cbe6e3707c91a2dfabc1e3284c1a4ec3eb;hpb=59cea4f2d3a7ff6723b120fb52a8958ef036537e;p=chaz%2Fopenbox diff --git a/src/Workspace.cc b/src/Workspace.cc index 0bc906cb..64710a59 100644 --- a/src/Workspace.cc +++ b/src/Workspace.cc @@ -38,6 +38,8 @@ extern "C" { #endif // HAVE_STRING_H } +#include + #include #include @@ -222,7 +224,6 @@ void Workspace::lowerTransients(const BlackboxWindow * const win, wkspc->stackingList.push_back((*it)); } } - } @@ -488,11 +489,14 @@ bool Workspace::smartPlacement(Rect& win, const Rect& availableArea) { spaces.push_back(availableArea); //initially the entire screen is free //Find Free Spaces - BlackboxWindowList::iterator wit = windowList.begin(), - end = windowList.end(); + BlackboxWindowList::const_iterator wit = windowList.begin(), + end = windowList.end(); Rect tmp; for (; wit != end; ++wit) { const BlackboxWindow* const curr = *wit; + + if (curr->isShaded()) continue; + tmp.setRect(curr->frameRect().x(), curr->frameRect().y(), curr->frameRect().width() + screen->getBorderWidth(), curr->frameRect().height() + screen->getBorderWidth()); @@ -503,26 +507,26 @@ bool Workspace::smartPlacement(Rect& win, const Rect& availableArea) { if (screen->getPlacementPolicy() == BScreen::RowSmartPlacement) { if(screen->getRowPlacementDirection() == BScreen::LeftRight) { if(screen->getColPlacementDirection() == BScreen::TopBottom) - sort(spaces.begin(), spaces.end(), rowLRTB); + std::sort(spaces.begin(), spaces.end(), rowLRTB); else - sort(spaces.begin(), spaces.end(), rowLRBT); + std::sort(spaces.begin(), spaces.end(), rowLRBT); } else { if(screen->getColPlacementDirection() == BScreen::TopBottom) - sort(spaces.begin(), spaces.end(), rowRLTB); + std::sort(spaces.begin(), spaces.end(), rowRLTB); else - sort(spaces.begin(), spaces.end(), rowRLBT); + std::sort(spaces.begin(), spaces.end(), rowRLBT); } } else { if(screen->getColPlacementDirection() == BScreen::TopBottom) { if(screen->getRowPlacementDirection() == BScreen::LeftRight) - sort(spaces.begin(), spaces.end(), colLRTB); + std::sort(spaces.begin(), spaces.end(), colLRTB); else - sort(spaces.begin(), spaces.end(), colRLTB); + std::sort(spaces.begin(), spaces.end(), colRLTB); } else { if(screen->getRowPlacementDirection() == BScreen::LeftRight) - sort(spaces.begin(), spaces.end(), colLRBT); + std::sort(spaces.begin(), spaces.end(), colLRBT); else - sort(spaces.begin(), spaces.end(), colRLBT); + std::sort(spaces.begin(), spaces.end(), colRLBT); } } @@ -556,6 +560,31 @@ bool Workspace::smartPlacement(Rect& win, const Rect& availableArea) { } +bool Workspace::underMousePlacement(Rect &win, const Rect &availableArea) { + int x, y, rx, ry; + Window c, r; + unsigned int m; + XQueryPointer(screen->getBlackbox()->getXDisplay(), screen->getRootWindow(), + &r, &c, &rx, &ry, &x, &y, &m); + x = rx - win.width() / 2; + y = ry - win.height() / 2; + + if (x < availableArea.x()) + x = availableArea.x(); + if (y < availableArea.y()) + y = availableArea.y(); + if (x + win.width() > availableArea.x() + availableArea.width()) + x = availableArea.x() + availableArea.width() - win.width(); + if (y + win.height() > availableArea.y() + availableArea.height()) + y = availableArea.y() + availableArea.height() - win.height(); + + win.setX(x); + win.setY(y); + + return True; +} + + bool Workspace::cascadePlacement(Rect &win, const Rect &availableArea) { if ((cascade_x > static_cast(availableArea.width() / 2)) || (cascade_y > static_cast(availableArea.height() / 2))) @@ -583,6 +612,8 @@ void Workspace::placeWindow(BlackboxWindow *win) { case BScreen::ColSmartPlacement: placed = smartPlacement(new_win, availableArea); break; + case BScreen::UnderMousePlacement: + placed = underMousePlacement(new_win, availableArea); default: break; // handled below } // switch