X-Git-Url: https://git.brokenzipper.com/gitweb?a=blobdiff_plain;f=src%2FWindow.cc;h=f768f6c15e90ad088401ce6071e1b7055c04535d;hb=3f6f897d88d820a7a7e8b388aff12c8d56f96fa4;hp=c2e8644b9c7b8d5b6a327bc0ea7951d4d99e4b40;hpb=9cd9d92bb1d66db9329bf5cd6e42e8b0096945e6;p=chaz%2Fopenbox diff --git a/src/Window.cc b/src/Window.cc index c2e8644b..f768f6c1 100644 --- a/src/Window.cc +++ b/src/Window.cc @@ -54,6 +54,7 @@ #ifdef SLIT # include "Slit.h" #endif // SLIT +#include "Util.h" /* * Initializes the class with default values/the window's set initial values. @@ -168,9 +169,8 @@ OpenboxWindow::OpenboxWindow(Openbox &o, Window w, BScreen *s) : openbox(o) { #ifdef SLIT if (client.initial_state == WithdrawnState) { screen->getSlit()->addClient(client.window); - delete this; - openbox.ungrab(); + delete this; return; } #endif // SLIT @@ -1533,29 +1533,123 @@ void OpenboxWindow::maximize(unsigned int button) { return; } - int dx = 0, dy = 0; - unsigned int dw, dh; + // the following code is temporary and will be taken care of by Screen in the + // future (with the NETWM 'strut') + Rect space(0, 0, screen->size().w(), screen->size().h()); + if (! screen->fullMax()) { +#ifdef SLIT + Slit *slit = screen->getSlit(); + int slit_x = slit->autoHide() ? slit->hiddenOrigin().x() : slit->area().x(), + slit_y = slit->autoHide() ? slit->hiddenOrigin().y() : slit->area().y(); + Toolbar *toolbar = screen->getToolbar(); + int tbarh = screen->hideToolbar() ? 0 : + toolbar->getExposedHeight() + screen->getBorderWidth() * 2; + bool tbartop; + switch (toolbar->placement()) { + case Toolbar::TopLeft: + case Toolbar::TopCenter: + case Toolbar::TopRight: + tbartop = true; + break; + case Toolbar::BottomLeft: + case Toolbar::BottomCenter: + case Toolbar::BottomRight: + tbartop = false; + break; + default: + ASSERT(false); // unhandled placement + } + if ((slit->direction() == Slit::Horizontal && + (slit->placement() == Slit::TopLeft || + slit->placement() == Slit::TopRight)) || + slit->placement() == Slit::TopCenter) { + // exclude top + if (tbartop && slit_y + slit->area().h() < tbarh) { + space.setY(space.y() + tbarh); + space.setH(space.h() - tbarh); + } else { + space.setY(space.y() + (slit_y + slit->area().h() + + screen->getBorderWidth() * 2)); + space.setH(space.h() - (slit_y + slit->area().h() + + screen->getBorderWidth() * 2)); + if (!tbartop) + space.setH(space.h() - tbarh); + } + } else if ((slit->direction() == Slit::Vertical && + (slit->placement() == Slit::TopRight || + slit->placement() == Slit::BottomRight)) || + slit->placement() == Slit::CenterRight) { + // exclude right + space.setW(space.w() - (screen->size().w() - slit_x)); + if (tbartop) + space.setY(space.y() + tbarh); + space.setH(space.h() - tbarh); + } else if ((slit->direction() == Slit::Horizontal && + (slit->placement() == Slit::BottomLeft || + slit->placement() == Slit::BottomRight)) || + slit->placement() == Slit::BottomCenter) { + // exclude bottom + if (!tbartop && (screen->size().h() - slit_y) < tbarh) { + space.setH(space.h() - tbarh); + } else { + space.setH(space.h() - (screen->size().h() - slit_y)); + if (tbartop) { + space.setY(space.y() + tbarh); + space.setH(space.h() - tbarh); + } + } + } else {// if ((slit->direction() == Slit::Vertical && + // (slit->placement() == Slit::TopLeft || + // slit->placement() == Slit::BottomLeft)) || + // slit->placement() == Slit::CenterLeft) + // exclude left + space.setX(slit_x + slit->area().w() + + screen->getBorderWidth() * 2); + space.setW(space.w() - (slit_x + slit->area().w() + + screen->getBorderWidth() * 2)); + if (tbartop) + space.setY(space.y() + tbarh); + space.setH(space.h() - tbarh); + } +#else // !SLIT + Toolbar *toolbar = screen->getToolbar(); + int tbarh = screen->hideToolbar() ? 0 : + toolbar->getExposedHeight() + screen->getBorderWidth() * 2; + switch (toolbar->placement()) { + case Toolbar::TopLeft: + case Toolbar::TopCenter: + case Toolbar::TopRight: + space.setY(toolbar->getExposedHeight()); + space.setH(space.h() - toolbar->getExposedHeight()); + break; + case Toolbar::BottomLeft: + case Toolbar::BottomCenter: + case Toolbar::BottomRight: + space.setH(space.h() - tbarh); + break; + default: + ASSERT(false); // unhandled placement + } +#endif // SLIT + } openbox_attrib.premax_x = frame.x; openbox_attrib.premax_y = frame.y; openbox_attrib.premax_w = frame.width; openbox_attrib.premax_h = frame.height; - dw = screen->size().w(); + unsigned int dw = space.w(), + dh = space.h(); dw -= frame.border_w * 2; dw -= frame.mwm_border_w * 2; dw -= client.base_width; - dh = screen->size().h(); dh -= frame.border_w * 2; dh -= frame.mwm_border_w * 2; dh -= ((frame.handle_h + frame.border_w) * decorations.handle); dh -= client.base_height; dh -= frame.y_border; - if (! screen->fullMax()) - dh -= screen->getToolbar()->getExposedHeight() + frame.border_w; - if (dw < client.min_width) dw = client.min_width; if (dh < client.min_height) dh = client.min_height; if (dw > client.max_width) dw = client.max_width; @@ -1571,23 +1665,8 @@ void OpenboxWindow::maximize(unsigned int button) { dh += ((frame.handle_h + frame.border_w) * decorations.handle); dh += frame.mwm_border_w * 2; - dx += ((screen->size().w() - dw) / 2) - frame.border_w; - - if (screen->fullMax()) { - dy += ((screen->size().h() - dh) / 2) - frame.border_w; - } else { - dy += (((screen->size().h() - screen->getToolbar()->getExposedHeight()) - - dh) / 2) - frame.border_w; - - switch (screen->getToolbar()->placement()) { - case Toolbar::TopLeft: - case Toolbar::TopCenter: - case Toolbar::TopRight: - dy += screen->getToolbar()->getExposedHeight() + - frame.border_w; - break; - } - } + int dx = space.x() + ((space.w() - dw) / 2) - frame.border_w, + dy = space.y() + ((space.h() - dh) / 2) - frame.border_w; switch(button) { case 1: @@ -2805,7 +2884,7 @@ void OpenboxWindow::motionNotifyEvent(XMotionEvent *me) { int snap_distance = screen->edgeSnapThreshold(); // width/height of the snapping window unsigned int snap_w = frame.width + (frame.border_w * 2); - unsigned int snap_h = size().h() + (frame.border_w * 2); + unsigned int snap_h = area().h() + (frame.border_w * 2); if (snap_distance) { int drx = screen->size().w() - (dx + snap_w); @@ -2828,7 +2907,7 @@ void OpenboxWindow::motionNotifyEvent(XMotionEvent *me) { default: dtty = 0; - dbby = screen->getToolbar()->getY(); + dbby = screen->getToolbar()->area().y(); break; }