X-Git-Url: https://git.dogcows.com/gitweb?a=blobdiff_plain;f=src%2FWindow.cc;h=d33692449329e071432702f8407d03f3a5b6288a;hb=4e0fde35ac60dcf36c3180b1606abba84ccace34;hp=47809ea900240747bb6411324ab9526f77b08965;hpb=5336c900d07804589600c8af9d838c12dec7ab1c;p=chaz%2Fopenbox diff --git a/src/Window.cc b/src/Window.cc index 47809ea9..d3369244 100644 --- a/src/Window.cc +++ b/src/Window.cc @@ -254,6 +254,11 @@ 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(); @@ -1609,6 +1614,9 @@ void BlackboxWindow::shade(void) { } +/* + * (Un)Sticks a window and its relatives. + */ void BlackboxWindow::stick(void) { if (flags.stuck) { blackbox_attrib.flags ^= AttribOmnipresent; @@ -1628,6 +1636,16 @@ 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(); } @@ -2582,26 +2600,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 +2718,7 @@ void BlackboxWindow::shapeEvent(XShapeEvent *) { #endif // SHAPE -bool BlackboxWindow::validateClient(void) { +bool BlackboxWindow::validateClient(void) const { XSync(blackbox->getXDisplay(), False); XEvent e; @@ -2802,21 +2822,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; }