diff --git a/effects/desktopgrid/desktopgrid.cpp b/effects/desktopgrid/desktopgrid.cpp index 02255ea1bd..7364fb4728 100644 --- a/effects/desktopgrid/desktopgrid.cpp +++ b/effects/desktopgrid/desktopgrid.cpp @@ -913,7 +913,12 @@ void DesktopGridEffect::setHighlightedDesktop(int d) { if (d == highlightedDesktop || d <= 0 || d > effects->numberOfDesktops()) return; + if (highlightedDesktop > 0 && highlightedDesktop <= hoverTimeline.count()) + hoverTimeline[highlightedDesktop-1]->setCurrentTime(qMin(hoverTimeline[highlightedDesktop-1]->currentTime(), + hoverTimeline[highlightedDesktop-1]->duration())); highlightedDesktop = d; + if (highlightedDesktop <= hoverTimeline.count()) + hoverTimeline[highlightedDesktop-1]->setCurrentTime(qMax(hoverTimeline[highlightedDesktop-1]->currentTime(), 0)); effects->addRepaintFull(); } diff --git a/libkwineffects/kwineffects.cpp b/libkwineffects/kwineffects.cpp index 4cc0978333..ca0b41dfea 100644 --- a/libkwineffects/kwineffects.cpp +++ b/libkwineffects/kwineffects.cpp @@ -987,41 +987,54 @@ WindowQuadList WindowQuadList::splitAtY(double y) const return ret; } -WindowQuadList WindowQuadList::makeGrid(int maxquadsize) const +WindowQuadList WindowQuadList::makeGrid(int maxQuadSize) const { if (empty()) return *this; - // find the bounding rectangle - double left = first().left(); - double right = first().right(); - double top = first().top(); + + // Find the bounding rectangle + double left = first().left(); + double right = first().right(); + double top = first().top(); double bottom = first().bottom(); - foreach (const WindowQuad & quad, *this) { + + foreach (const WindowQuad &quad, *this) { #ifndef NDEBUG if (quad.isTransformed()) qFatal("Splitting quads is allowed only in pre-paint calls!"); #endif - left = qMin(left, quad.left()); - right = qMax(right, quad.right()); - top = qMin(top, quad.top()); + left = qMin(left, quad.left()); + right = qMax(right, quad.right()); + top = qMin(top, quad.top()); bottom = qMax(bottom, quad.bottom()); } + WindowQuadList ret; - for (double x = left; - x < right; - x += maxquadsize) { - for (double y = top; - y < bottom; - y += maxquadsize) { - foreach (const WindowQuad & quad, *this) { - if (QRectF(QPointF(quad.left(), quad.top()), QPointF(quad.right(), quad.bottom())) - .intersects(QRectF(x, y, maxquadsize, maxquadsize))) { - ret.append(quad.makeSubQuad(qMax(x, quad.left()), qMax(y, quad.top()), - qMin(quad.right(), x + maxquadsize), qMin(quad.bottom(), y + maxquadsize))); - } + + foreach (const WindowQuad &quad, *this) { + const double quadLeft = quad.left(); + const double quadRight = quad.right(); + const double quadTop = quad.top(); + const double quadBottom = quad.bottom(); + + // Compute the top-left corner of the first intersecting grid cell + const double xBegin = left + qFloor((quadLeft - left) / maxQuadSize) * maxQuadSize; + const double yBegin = top + qFloor((quadTop - top) / maxQuadSize) * maxQuadSize; + + // Loop over all intersecting cells and add sub-quads + for (double y = yBegin; y < quadBottom; y += maxQuadSize) { + const double y0 = qMax(y, quadTop); + const double y1 = qMin(quadBottom, y + maxQuadSize); + + for (double x = xBegin; x < quadRight; x += maxQuadSize) { + const double x0 = qMax(x, quadLeft); + const double x1 = qMin(quadRight, x + maxQuadSize); + + ret.append(quad.makeSubQuad(x0, y0, x1, y1)); } } } + return ret; } @@ -1029,40 +1042,53 @@ WindowQuadList WindowQuadList::makeRegularGrid(int xSubdivisions, int ySubdivisi { if (empty()) return *this; - // find the bounding rectangle - double left = first().left(); - double right = first().right(); - double top = first().top(); + + // Find the bounding rectangle + double left = first().left(); + double right = first().right(); + double top = first().top(); double bottom = first().bottom(); - foreach (const WindowQuad & quad, *this) { + + foreach (const WindowQuad &quad, *this) { #ifndef NDEBUG if (quad.isTransformed()) qFatal("Splitting quads is allowed only in pre-paint calls!"); #endif - left = qMin(left, quad.left()); - right = qMax(right, quad.right()); - top = qMin(top, quad.top()); + left = qMin(left, quad.left()); + right = qMax(right, quad.right()); + top = qMin(top, quad.top()); bottom = qMax(bottom, quad.bottom()); } - double xincrement = (right - left) / xSubdivisions; - double yincrement = (bottom - top) / ySubdivisions; + double xIncrement = (right - left) / xSubdivisions; + double yIncrement = (bottom - top) / ySubdivisions; + WindowQuadList ret; - for (double y = top; - y < bottom; - y += yincrement) { - for (double x = left; - x < right; - x += xincrement) { - foreach (const WindowQuad & quad, *this) { - if (QRectF(QPointF(quad.left(), quad.top()), QPointF(quad.right(), quad.bottom())) - .intersects(QRectF(x, y, xincrement, yincrement))) { - ret.append(quad.makeSubQuad(qMax(x, quad.left()), qMax(y, quad.top()), - qMin(quad.right(), x + xincrement), qMin(quad.bottom(), y + yincrement))); - } + + foreach (const WindowQuad &quad, *this) { + const double quadLeft = quad.left(); + const double quadRight = quad.right(); + const double quadTop = quad.top(); + const double quadBottom = quad.bottom(); + + // Compute the top-left corner of the first intersecting grid cell + const double xBegin = left + qFloor((quadLeft - left) / xIncrement) * xIncrement; + const double yBegin = top + qFloor((quadTop - top) / yIncrement) * yIncrement; + + // Loop over all intersecting cells and add sub-quads + for (double y = yBegin; y < quadBottom; y += yIncrement) { + const double y0 = qMax(y, quadTop); + const double y1 = qMin(quadBottom, y + yIncrement); + + for (double x = xBegin; x < quadRight; x += xIncrement) { + const double x0 = qMax(x, quadLeft); + const double x1 = qMin(quadRight, x + xIncrement); + + ret.append(quad.makeSubQuad(x0, y0, x1, y1)); } } } + return ret; } diff --git a/placement.cpp b/placement.cpp index c5ba79cf94..8534f81ad4 100644 --- a/placement.cpp +++ b/placement.cpp @@ -668,7 +668,6 @@ void Client::packTo(int left, int top) void Workspace::slotWindowPackLeft() { if (active_client && active_client->isMovable()) - active_client->screen(); active_client->packTo(packPositionLeft(active_client, active_client->geometry().left(), true), active_client->y()); } diff --git a/useractions.cpp b/useractions.cpp index ea7314cb27..51b597b756 100755 --- a/useractions.cpp +++ b/useractions.cpp @@ -1907,6 +1907,9 @@ void Client::setShortcut(const QString& _cut) QString cut = rules()->checkShortcut(_cut); if (cut.isEmpty()) return setShortcutInternal(); + if (cut == shortcut().toString()) { + return; // no change + } // Format: // base+(abcdef)base+(abcdef) // E.g. Alt+Ctrl+(ABCDEF);Meta+X,Meta+(ABCDEF) @@ -1981,6 +1984,8 @@ void Client::delayedSetShortcut() bool Workspace::shortcutAvailable(const QKeySequence &cut, Client* ignore) const { + if (ignore && cut == ignore->shortcut()) + return true; if (!KGlobalAccel::getGlobalShortcutsByKey(cut).isEmpty()) { return false;