summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKimmo Hämäläinen <kimmo.hamalainen@nokia.com>2010-08-24 16:03:08 +0300
committerKimmo Hämäläinen <kimmo.hamalainen@nokia.com>2010-08-24 16:03:08 +0300
commitf75999b5bad0d71999183378af50ec7e1bd721fd (patch)
tree07fc061e685269eaf9f710358bd00103979da591
parent25f42b91712092068113025169a95185d09caa1c (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.cpp38
-rw-r--r--src/mcompositewindow.cpp20
-rw-r--r--src/mcompositewindow.h5
-rw-r--r--src/mcompwindowanimator.cpp6
-rw-r--r--src/mcompwindowanimator.h1
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