X-Git-Url: https://git.brokenzipper.com/gitweb?a=blobdiff_plain;f=src%2FWindow.cc;h=417e15ac7f5d68615eb72e9f0bd2b5d4666ffe61;hb=8941da8e41d15ae6729c04b2933d74869c25e857;hp=d33692449329e071432702f8407d03f3a5b6288a;hpb=4e0fde35ac60dcf36c3180b1606abba84ccace34;p=chaz%2Fopenbox diff --git a/src/Window.cc b/src/Window.cc index d3369244..417e15ac 100644 --- a/src/Window.cc +++ b/src/Window.cc @@ -254,11 +254,6 @@ BlackboxWindow::BlackboxWindow(Blackbox *b, Window w, BScreen *s) { frame.rect.width(), frame.rect.height()); } - // get sticky state from our parent window if we've got one - if (isTransient() && client.transient_for != (BlackboxWindow *) ~0ul && - client.transient_for->isStuck() != flags.stuck) - stick(); - if (flags.shaded) { flags.shaded = False; shade(); @@ -273,7 +268,6 @@ BlackboxWindow::BlackboxWindow(Blackbox *b, Window w, BScreen *s) { BlackboxWindow::~BlackboxWindow(void) { - #ifdef DEBUG fprintf(stderr, "BlackboxWindow::~BlackboxWindow: destroying 0x%lx\n", client.window); @@ -1614,9 +1608,6 @@ void BlackboxWindow::shade(void) { } -/* - * (Un)Sticks a window and its relatives. - */ void BlackboxWindow::stick(void) { if (flags.stuck) { blackbox_attrib.flags ^= AttribOmnipresent; @@ -1636,16 +1627,6 @@ void BlackboxWindow::stick(void) { setState(current_state); } - // go up the chain - if (isTransient() && client.transient_for != (BlackboxWindow *) ~0ul && - client.transient_for->isStuck() != flags.stuck) - client.transient_for->stick(); - // go down the chain - BlackboxWindowList::iterator it; - const BlackboxWindowList::iterator end = client.transientList.end(); - for (it = client.transientList.begin(); it != end; ++it) - if ((*it)->isStuck() != flags.stuck) - (*it)->stick(); } @@ -2543,38 +2524,84 @@ void BlackboxWindow::motionNotifyEvent(XMotionEvent *me) { 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; + if (screen->getWindowToWindowSnap()) { + // 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 top of other window? + if (dtop < snap_distance && dtop <= dbottom) { + dy = winrect.top() - frame.rect.height(); + + if (screen->getWindowCornerSnap()) { + // 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() + 1; + } + + continue; + } + // snap bottom of other window? + else if (dbottom < snap_distance) { + dy = winrect.bottom() + 1; + + if (screen->getWindowCornerSnap()) { + // 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() + 1; + } + + continue; + } + + // snap left of other window? + if (dleft < snap_distance && dleft <= dright) { + dx = winrect.left() - frame.rect.width(); + + if (screen->getWindowCornerSnap()) { + // 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() + 1; + } + + continue; + } + // snap right of other window? + else if (dright < snap_distance) { + dx = winrect.right() + 1; + + if (screen->getWindowCornerSnap()) { + // 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() + 1; + } + + continue; + } } }