X-Git-Url: https://git.dogcows.com/gitweb?a=blobdiff_plain;f=src%2FWindow.cc;h=3aabad5268a1caa050e52077de8bc15fd69aa5ea;hb=b48e215ca642d1973e0b1b71e632657c2679443a;hp=9da9033d263a40cbefbfe1498286b6d0d970c3a8;hpb=57ac5e5b5eba515f3d6b8a194b3a389a6d44a186;p=chaz%2Fopenbox diff --git a/src/Window.cc b/src/Window.cc index 9da9033d..3aabad52 100644 --- a/src/Window.cc +++ b/src/Window.cc @@ -2526,30 +2526,72 @@ void BlackboxWindow::motionNotifyEvent(XMotionEvent *me) { const int snap_distance = screen->getEdgeSnapThreshold(); if (snap_distance) { - Rect srect = screen->availableArea(); // window corners const int wleft = dx, wright = dx + frame.rect.width() - 1, wtop = dy, wbottom = dy + frame.rect.height() - 1; + // Maybe this should be saved in the class, and set in the setWorkspace + // function!! + Workspace *w = screen->getWorkspace(getWorkspaceNumber()); + assert(w); + + // try snap to another window + for (unsigned int i = 0, c = w->getCount(); i < c; ++i) { + BlackboxWindow *snapwin = w->getWindow(i); + if (snapwin == this) + continue; // don't snap to self + + const Rect &winrect = snapwin->frameRect(); + int dleft = std::abs(wright - winrect.left()), + dright = std::abs(wleft - winrect.right()), + dtop = std::abs(wbottom - winrect.top()), + dbottom = std::abs(wtop - winrect.bottom()); + + // snap left? + if (dleft < snap_distance && dleft <= dright) { + dx = winrect.left() - frame.rect.width(); + continue; + } + // snap right? + else if (dright < snap_distance) { + dx = winrect.right() + 1; + continue; + } + + // snap top? + if (dtop < snap_distance && dtop <= dbottom) { + dy = winrect.top() - frame.rect.height(); + continue; + } + // snap bottom? + else if (dbottom < snap_distance) { + dy = winrect.bottom() + 1; + continue; + } + } + + // 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) + if (dleft < snap_distance && dleft <= dright) dx = srect.left(); // snap right? - else if (dright < snap_distance && dright < dleft) + else if (dright < snap_distance) dx = srect.right() - frame.rect.width() + 1; // snap top? - if (dtop < snap_distance && dtop < dbottom) + if (dtop < snap_distance && dtop <= dbottom) dy = srect.top(); // snap bottom? - else if (dbottom < snap_distance && dbottom < dtop) + else if (dbottom < snap_distance) dy = srect.bottom() - frame.rect.height() + 1; srect = screen->getRect(); // now get the full screen @@ -2560,17 +2602,17 @@ void BlackboxWindow::motionNotifyEvent(XMotionEvent *me) { dbottom = std::abs(wbottom - srect.bottom()); // snap left? - if (dleft < snap_distance && dleft < dright) + if (dleft < snap_distance && dleft <= dright) dx = srect.left(); // snap right? - else if (dright < snap_distance && dright < dleft) + else if (dright < snap_distance) dx = srect.right() - frame.rect.width() + 1; // snap top? - if (dtop < snap_distance && dtop < dbottom) + if (dtop < snap_distance && dtop <= dbottom) dy = srect.top(); // snap bottom? - else if (dbottom < snap_distance && dbottom < dtop) + else if (dbottom < snap_distance) dy = srect.bottom() - frame.rect.height() + 1; }