X-Git-Url: https://git.dogcows.com/gitweb?a=blobdiff_plain;f=src%2FWindow.cc;h=86898d542124bd2c36166873edd9dd35b04e91b0;hb=f0c2fa18bef6a0f74d607eb390b98ccfbd8d778f;hp=840954ec0ab22555e55111e2b6ecee78c332306a;hpb=9ccebf111819c77108c179b906d824cb2a2a790d;p=chaz%2Fopenbox diff --git a/src/Window.cc b/src/Window.cc index 840954ec..86898d54 100644 --- a/src/Window.cc +++ b/src/Window.cc @@ -2537,25 +2537,61 @@ void BlackboxWindow::motionNotifyEvent(XMotionEvent *me) { dtop = std::abs(wbottom - winrect.top()), dbottom = std::abs(wtop - winrect.bottom()); - // snap left? + // snap left of other window? if (dleft < snap_distance && dleft <= dright) { dx = winrect.left() - frame.rect.width(); + + // try corner-snap to its other sides + dtop = std::abs(wtop - winrect.top()); + dbottom = std::abs(wbottom - winrect.bottom()); + if (dtop < snap_distance && dtop <= dbottom) + dy = winrect.top(); + else if (dbottom < snap_distance) + dy = winrect.bottom() - frame.rect.height(); + continue; } - // snap right? + // snap right of other window? else if (dright < snap_distance) { dx = winrect.right() + 1; + + // try corner-snap to its other sides + dtop = std::abs(wtop - winrect.top()); + dbottom = std::abs(wbottom - winrect.bottom()); + if (dtop < snap_distance && dtop <= dbottom) + dy = winrect.top(); + else if (dbottom < snap_distance) + dy = winrect.bottom() - frame.rect.height(); + continue; } - // snap top? + // snap top of other window? if (dtop < snap_distance && dtop <= dbottom) { dy = winrect.top() - frame.rect.height(); + + // try corner-snap to its other sides + dleft = std::abs(wleft - winrect.left()); + dright = std::abs(wright - winrect.right()); + if (dleft < snap_distance && dleft <= dright) + dx = winrect.left(); + else if (dright < snap_distance) + dx = winrect.right() - frame.rect.width(); + continue; } - // snap bottom? + // snap bottom of other window? else if (dbottom < snap_distance) { dy = winrect.bottom() + 1; + + // try corner-snap to its other sides + dleft = std::abs(wleft - winrect.left()); + dright = std::abs(wright - winrect.right()); + if (dleft < snap_distance && dleft <= dright) + dx = winrect.left(); + else if (dright < snap_distance) + dx = winrect.right() - frame.rect.width(); + continue; } } @@ -2582,26 +2618,28 @@ void BlackboxWindow::motionNotifyEvent(XMotionEvent *me) { else if (dbottom < snap_distance) dy = srect.bottom() - frame.rect.height() + 1; - srect = screen->getRect(); // now get the full screen + if (! screen->doFullMax()) { + 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()); + 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 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; + // 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()) {