X-Git-Url: https://git.brokenzipper.com/gitweb?a=blobdiff_plain;f=src%2FWindow.cc;h=be03e4aab012d3c1b7f9204668be3a5e36132138;hb=7a55323343635d8a29bb62cd49d8d6a5c103f317;hp=47809ea900240747bb6411324ab9526f77b08965;hpb=5336c900d07804589600c8af9d838c12dec7ab1c;p=chaz%2Fopenbox diff --git a/src/Window.cc b/src/Window.cc index 47809ea9..be03e4aa 100644 --- a/src/Window.cc +++ b/src/Window.cc @@ -2525,38 +2525,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 (blackbox->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 left of other window? + if (dleft < snap_distance && dleft <= dright) { + dx = winrect.left() - frame.rect.width(); + + if (blackbox->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(); + } + + continue; + } + // snap right of other window? + else if (dright < snap_distance) { + dx = winrect.right() + 1; + + if (blackbox->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(); + } + + continue; + } + + // snap top of other window? + if (dtop < snap_distance && dtop <= dbottom) { + dy = winrect.top() - frame.rect.height(); + + if (blackbox->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(); + } + + continue; + } + // snap bottom of other window? + else if (dbottom < snap_distance) { + dy = winrect.bottom() + 1; + + if (blackbox->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(); + } + + continue; + } } } @@ -2582,26 +2628,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()) { @@ -2698,7 +2746,7 @@ void BlackboxWindow::shapeEvent(XShapeEvent *) { #endif // SHAPE -bool BlackboxWindow::validateClient(void) { +bool BlackboxWindow::validateClient(void) const { XSync(blackbox->getXDisplay(), False); XEvent e; @@ -2802,21 +2850,37 @@ void BlackboxWindow::changeBlackboxHints(BlackboxHints *net) { default: case DecorNormal: - decorations |= Decor_Titlebar | Decor_Handle | Decor_Border | - Decor_Iconify | Decor_Maximize; + decorations |= Decor_Titlebar | Decor_Border | Decor_Iconify; + + decorations = ((functions & Func_Resize) && !isTransient() ? + decorations | Decor_Handle : + decorations &= ~Decor_Handle); + decorations = (functions & Func_Maximize ? + decorations | Decor_Maximize : + decorations &= ~Decor_Maximize); break; case DecorTiny: decorations |= Decor_Titlebar | Decor_Iconify; - decorations &= ~(Decor_Border | Decor_Handle | Decor_Maximize); + decorations &= ~(Decor_Border | Decor_Handle); + + decorations = (functions & Func_Maximize ? + decorations | Decor_Maximize : + decorations &= ~Decor_Maximize); break; case DecorTool: decorations |= Decor_Titlebar; - decorations &= ~(Decor_Iconify | Decor_Border | Decor_Handle); - functions |= Func_Move; + decorations &= ~(Decor_Iconify | Decor_Border); + + decorations = ((functions & Func_Resize) && !isTransient() ? + decorations | Decor_Handle : + decorations &= ~Decor_Handle); + decorations = (functions & Func_Maximize ? + decorations | Decor_Maximize : + decorations &= ~Decor_Maximize); break; }