X-Git-Url: https://git.brokenzipper.com/gitweb?a=blobdiff_plain;f=src%2FWorkspace.cc;h=91bc141958865f3d706091bd1ee215c4db1840d1;hb=12fcb33bfaa03b3c6245d15bfb1809f7facc857f;hp=0bc906cbe6e3707c91a2dfabc1e3284c1a4ec3eb;hpb=59cea4f2d3a7ff6723b120fb52a8958ef036537e;p=chaz%2Fopenbox diff --git a/src/Workspace.cc b/src/Workspace.cc index 0bc906cb..91bc1419 100644 --- a/src/Workspace.cc +++ b/src/Workspace.cc @@ -556,6 +556,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 +608,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