--- compiz-plugins-main-0.9.7.0~bzr19.orig/grid/src/grid.cpp +++ compiz-plugins-main-0.9.7.0~bzr19/grid/src/grid.cpp @@ -27,6 +27,8 @@ using namespace GridWindowType; +#define IS_MAXIMIZED(x) (((x) & MAXIMIZE_STATE) == MAXIMIZE_STATE ) + static std::map gridProps; void @@ -135,7 +137,7 @@ GridScreen::initiateCommon (CompAction { XWindowChanges xwc; bool maximizeH = where & (GridBottom | GridTop | GridMaximize); - bool maximizeV = where & (GridLeft | GridRight | GridMaximize); + bool maximizeV = where & GridMaximize; if (!(cw->actions () & CompWindowActionResizeMask)) return false; @@ -174,11 +176,17 @@ GridScreen::initiateCommon (CompAction gw->originalSize = slotToRect(cw, cw->serverBorderRect ()); } - if ((cw->state () & MAXIMIZE_STATE) && + if (IS_MAXIMIZED(cw->state ()) && (resize || optionGetSnapoffMaximized ())) { /* maximized state interferes with us, clear it */ cw->maximize (0); + + /* FIXME: and don't do anything more, or somthing gets + * confused. Are we allowed to change maximized state and call + * configureXWindow without waiting for a notify? */ + return true; + } if ((where & GridMaximize) && resize) @@ -215,7 +223,7 @@ GridScreen::initiateCommon (CompAction desiredSlot.setWidth (workarea.width () / props.numCellsX); /* Adjust for constraints and decorations */ - if (where & ~(GridMaximize | GridLeft | GridRight)) + if (where & ~GridMaximize) { desiredRect = constrainSize (cw, desiredSlot); } @@ -229,7 +237,7 @@ GridScreen::initiateCommon (CompAction if (desiredRect.y () == currentRect.y () && desiredRect.height () == currentRect.height () && - where & ~(GridMaximize | GridLeft | GridRight) && gw->lastTarget & where) + where & ~GridMaximize && gw->lastTarget & where) { int slotWidth25 = workarea.width () / 4; int slotWidth33 = (workarea.width () / 3) + cw->border ().left; @@ -349,38 +357,8 @@ GridScreen::initiateCommon (CompAction gw->sizeHintsFlags = 0; - /* Special case for left and right, actually vertically maximize - * the window */ - if (where & GridLeft || where & GridRight) - { - /* First restore the window to its original size */ - XWindowChanges rwc; - - rwc.x = gw->originalSize.x (); - rwc.y = gw->originalSize.y (); - rwc.width = gw->originalSize.width (); - rwc.height = gw->originalSize.height (); - - cw->configureXWindow (CWX | CWY | CWWidth | CWHeight, &rwc); - - gw->isGridMaximized = true; - gw->isGridResized = false; - - /* Maximize the window */ - cw->maximize (CompWindowStateMaximizedVertMask); - - /* Be evil */ - if (cw->sizeHints ().flags & PResizeInc) - { - gw->sizeHintsFlags |= PResizeInc; - gw->window->sizeHints ().flags &= ~(PResizeInc); - } - } - else - { - gw->isGridResized = true; - gw->isGridMaximized = false; - } + gw->isGridResized = true; + gw->isGridMaximized = false; int dw = (lastBorder.left + lastBorder.right) - (gw->window->border ().left + @@ -839,11 +817,11 @@ GridWindow::moveNotify (int dx, int dy, void GridWindow::stateChangeNotify (unsigned int lastState) { - if (lastState & MAXIMIZE_STATE && - !(window->state () & MAXIMIZE_STATE)) + if (IS_MAXIMIZED(lastState) && + !(IS_MAXIMIZED(window->state ()))) lastTarget = GridUnknown; - else if (!(lastState & MAXIMIZE_STATE) && - window->state () & MAXIMIZE_STATE) + else if (!(IS_MAXIMIZED(lastState)) && + IS_MAXIMIZED(window->state ())) { lastTarget = GridMaximize; if (window->grabbed ()) @@ -872,7 +850,7 @@ GridScreen::restoreWindow (CompAction if (!gw->isGridResized) return false; - if (gw->isGridMaximized & !(cw->state () & MAXIMIZE_STATE)) + if (gw->isGridMaximized & !(cw->state () & !(IS_MAXIMIZED(cw->state ())))) { gw->window->sizeHints ().flags |= gw->sizeHintsFlags; gw->isGridMaximized = false;