From: Dana Jansens Date: Mon, 22 Jul 2002 06:49:12 +0000 (+0000) Subject: window snapping now has xinerama support X-Git-Url: https://git.brokenzipper.com/gitweb?a=commitdiff_plain;h=debe8a2f74a67b8b484ae74b5d86769c3b2672eb;p=chaz%2Fopenbox window snapping now has xinerama support --- diff --git a/src/Window.cc b/src/Window.cc index 85144ffd..a5fe7b4b 100644 --- a/src/Window.cc +++ b/src/Window.cc @@ -3035,48 +3035,45 @@ void BlackboxWindow::doMove(int x_root, int y_root) { } } - // try snap to the screen's available area - Rect srect = screen->availableArea(); - - int dleft = std::abs(wleft - srect.left()), - dright = std::abs(wright - srect.right()), - dtop = std::abs(wtop - srect.top()), - dbottom = std::abs(wbottom - srect.bottom()); - - // snap left? - if (dleft < snap_distance && dleft <= dright) - dx = srect.left(); - // snap right? - else if (dright < snap_distance) - dx = srect.right() - frame.rect.width() + 1; - - // snap top? - if (dtop < snap_distance && dtop <= dbottom) - dy = srect.top(); - // snap bottom? - else if (dbottom < snap_distance) - dy = srect.bottom() - frame.rect.height() + 1; - - srect = screen->getRect(); // now get the full screen - - dleft = std::abs(wleft - srect.left()), - dright = std::abs(wright - srect.right()), - dtop = std::abs(wtop - srect.top()), - dbottom = std::abs(wbottom - srect.bottom()); - - // snap left? - if (dleft < snap_distance && dleft <= dright) - dx = srect.left(); - // snap right? - else if (dright < snap_distance) - dx = srect.right() - frame.rect.width() + 1; - - // snap top? - if (dtop < snap_distance && dtop <= dbottom) - dy = srect.top(); - // snap bottom? - else if (dbottom < snap_distance) - dy = srect.bottom() - frame.rect.height() + 1; + RectList snaplist; // the list of rects we will try to snap to + + // snap to the strut (and screen boundaries for xinerama) +#ifdef XINERAMA + if (screen->isXineramaActive() && blackbox->doXineramaSnapping()) { + RectList::iterator it, end = screen->allAvailableAreas().end(); + for (it = screen->allAvailableAreas().begin(); it != end; ++it) + snaplist.push_back(*it); + } else +#endif // XINERAMA + if (! screen->doFullMax()) + snaplist.push_back(screen->availableArea()); + + // always snap to the screen edges + snaplist.push_back(screen->getRect()); + + RectList::iterator it, end = snaplist.end(); + for (it = snaplist.begin(); it != end; ++it) { + Rect &srect = *it; + + int dleft = std::abs(wleft - srect.left()), + dright = std::abs(wright - srect.right()), + dtop = std::abs(wtop - srect.top()), + dbottom = std::abs(wbottom - srect.bottom()); + + // snap left? + if (dleft < snap_distance && dleft <= dright) + dx = srect.left(); + // snap right? + else if (dright < snap_distance) + dx = srect.right() - frame.rect.width() + 1; + + // snap top? + if (dtop < snap_distance && dtop <= dbottom) + dy = srect.top(); + // snap bottom? + else if (dbottom < snap_distance) + dy = srect.bottom() - frame.rect.height() + 1; + } } if (screen->doOpaqueMove()) {