diff options
author | Kimmo Hämäläinen <kimmo.hamalainen@nokia.com> | 2010-08-24 16:03:08 +0300 |
---|---|---|
committer | Kimmo Hämäläinen <kimmo.hamalainen@nokia.com> | 2010-08-24 16:03:08 +0300 |
commit | f75999b5bad0d71999183378af50ec7e1bd721fd (patch) | |
tree | 07fc061e685269eaf9f710358bd00103979da591 | |
parent | 25f42b91712092068113025169a95185d09caa1c (diff) |
Fixes: NB#184773 - Application dialog gets stucked when left metakey + backspace buttons are pressed.
- fix several issues in zoom-in animation
-rw-r--r-- | src/mcompositemanager.cpp | 38 | ||||
-rw-r--r-- | src/mcompositewindow.cpp | 20 | ||||
-rw-r--r-- | src/mcompositewindow.h | 5 | ||||
-rw-r--r-- | src/mcompwindowanimator.cpp | 6 | ||||
-rw-r--r-- | src/mcompwindowanimator.h | 1 |
5 files changed, 54 insertions, 16 deletions
diff --git a/src/mcompositemanager.cpp b/src/mcompositemanager.cpp index af1fa05..48cc60f 100644 --- a/src/mcompositemanager.cpp +++ b/src/mcompositemanager.cpp @@ -1810,18 +1810,18 @@ void MCompositeManagerPrivate::checkStacking(bool force_visibility_check, only_mapped.append(stacking_list.at(i)); } static QList<Window> prev_only_mapped; + + // fix Z-values always to make sure we do it after an animation + for (int i = 0; i <= last_i; ++i) { + MCompositeWindow *witem = COMPOSITE_WINDOW(stacking_list.at(i)); + if (witem && witem->hasTransitioningWindow()) + // don't change Z values until animation is over + break; + if (witem) + witem->requestZValue(i); + } bool order_changed = prev_only_mapped != only_mapped; if (order_changed) { - /* fix Z-values */ - for (int i = 0; i <= last_i; ++i) { - MCompositeWindow *witem = COMPOSITE_WINDOW(stacking_list.at(i)); - if (witem && witem->hasTransitioningWindow()) - // don't change Z values until animation is over - break; - if (witem) - witem->requestZValue(i); - } - QList<Window> reverse; for (int i = last_i; i >= 0; --i) reverse.append(stacking_list.at(i)); @@ -2246,7 +2246,12 @@ void MCompositeManagerPrivate::clientMessageEvent(XClientMessageEvent *event) if (w == stack[DESKTOP_LAYER]) break; MCompositeWindow *cw = COMPOSITE_WINDOW(w); - if (cw && cw->isMapped() && cw->isAppWindow(true) && + if (cw && cw->isMapped() && (cw->isAppWindow(true) + // mark transient dialogs Iconic too, so that + // restoreHandler() is called when they are maximised + || (cw->propertyCache()->windowTypeAtom() + == ATOM(_NET_WM_WINDOW_TYPE_DIALOG) + && getLastVisibleParent(cw->propertyCache()))) && // skip devicelock and screenlock windows (cw->propertyCache()->meegoStackingLayer() > 2 || cw->propertyCache()->meegoStackingLayer() == 0)) @@ -2345,9 +2350,14 @@ void MCompositeManagerPrivate::restoreHandler(MCompositeWindow *window) else to_stack = window; setWindowState(to_stack->window(), NormalState); - - if (window->isNewlyMapped()) - window->setNewlyMapped(false); + + // FIXME: call these for the whole transiency chain + window->setNewlyMapped(false); + if (to_stack != window) + to_stack->setNewlyMapped(false); + window->setUntransformed(); + if (window != to_stack) + to_stack->setUntransformed(); positionWindow(to_stack->window(), STACK_TOP); diff --git a/src/mcompositewindow.cpp b/src/mcompositewindow.cpp index 19a4392..a9aa309 100644 --- a/src/mcompositewindow.cpp +++ b/src/mcompositewindow.cpp @@ -91,12 +91,13 @@ MCompositeWindow::MCompositeWindow(Qt::HANDLE window, // We initially prevent item visibility from compositor itself // or it's corresponding thumbnail rendered by the switcher bool is_app = isAppWindow(); + newly_mapped = is_app; if (!pc->isInputOnly()) { // never paint InputOnly windows window_visible = !is_app; - setVisible(window_visible); + setVisible(window_visible); // newly_mapped used here } - newly_mapped = is_app; + origPosition = QPointF(pc->realGeometry().x(), pc->realGeometry().y()); if (fadeRect.isEmpty()) { QRectF d = QApplication::desktop()->availableGeometry(); @@ -197,6 +198,21 @@ void MCompositeWindow::iconify(const QRectF &icongeometry, bool defer) } } +void MCompositeWindow::setUntransformed() +{ + if (is_transitioning) { + --window_transitioning; + is_transitioning = false; + } + anim->stopAnimation(); // stop and restore the matrix + newly_mapped = false; + setVisible(true); + setOpacity(1.0); + setScale(1.0); + setScaled(false); + iconified = false; +} + void MCompositeWindow::setIconified(bool iconified) { iconified_final = iconified; diff --git a/src/mcompositewindow.h b/src/mcompositewindow.h index 5fa3ca2..373dbce 100644 --- a/src/mcompositewindow.h +++ b/src/mcompositewindow.h @@ -165,6 +165,11 @@ public: void setIconified(bool iconified); /*! + * Set scale, opacity etc. to normal values. + */ + void setUntransformed(); + + /*! * Returns how this window was iconified. */ IconifyState iconifyState() const; diff --git a/src/mcompwindowanimator.cpp b/src/mcompwindowanimator.cpp index 5140d98..32d3633 100644 --- a/src/mcompwindowanimator.cpp +++ b/src/mcompwindowanimator.cpp @@ -201,6 +201,12 @@ void MCompWindowAnimator::startAnimation() } } +void MCompWindowAnimator::stopAnimation() +{ + timer.stop(); + item->setTransform(matrix); +} + void MCompWindowAnimator::deferAnimation(bool defer) { deferred_animation = defer; diff --git a/src/mcompwindowanimator.h b/src/mcompwindowanimator.h index d814357..d40cc00 100644 --- a/src/mcompwindowanimator.h +++ b/src/mcompwindowanimator.h @@ -73,6 +73,7 @@ public: bool isActive(); void startAnimation(); + void stopAnimation(); void deferAnimation(bool); //! There is a pending animation to be executed soon |