diff options
author | Abdiel Janulgue <abdiel.janulgue@nokia.com> | 2010-07-23 16:26:52 +0300 |
---|---|---|
committer | Abdiel Janulgue <abdiel.janulgue@nokia.com> | 2010-07-23 16:26:52 +0300 |
commit | 23c9285aab8b72d6c36474067aae267699bceb17 (patch) | |
tree | 431570b297e1c67cf0771da36e47ffff69100f69 /src | |
parent | 1782ac74c69903222ffd5f526b8c720b605d60e5 (diff) |
Fixes: NB#180870 - COREWEB: /usr/bin/mcompositor 'MCompositeManagerPrivate::getTopmostApp MCompositeManagerPrivate::checkStacking MCompositeManagerPrivate::enableRedirection MCompositeManagerPrivate::mapEvent MCompositeManagerPrivate::x11EventFilter'
Details: Windows in the list might have been removed. Return a default value if it does not exist anymore
Diffstat (limited to 'src')
-rw-r--r-- | src/mcompositemanager.cpp | 40 |
1 files changed, 25 insertions, 15 deletions
diff --git a/src/mcompositemanager.cpp b/src/mcompositemanager.cpp index f24671f..1248d83 100644 --- a/src/mcompositemanager.cpp +++ b/src/mcompositemanager.cpp @@ -798,8 +798,11 @@ Window MCompositeManagerPrivate::getTopmostApp(int *index_in_stacking_list, Window ignore_window) { for (int i = stacking_list.size() - 1; i >= 0; --i) { - Window w = stacking_list.at(i); - if (w == ignore_window) continue; + + // return default value in case window got internally removed + Window w = stacking_list.value(i, 0); + + if (w == ignore_window || !w) continue; if (w == stack[DESKTOP_LAYER]) /* desktop is above all applications */ return 0; @@ -2058,19 +2061,26 @@ void MCompositeManagerPrivate::clientMessageEvent(XClientMessageEvent *event) // the desktop int wi, lower_i = -1; for (wi = stacking_list.size() - 1; wi >= 0; --wi) { - Window w = stacking_list.at(wi); - if (w == lower) { - lower_i = wi; - continue; - } - if (w == stack[DESKTOP_LAYER]) - break; - MCompositeWindow *cw = COMPOSITE_WINDOW(w); - if (cw && cw->isMapped() && cw->isAppWindow(true) && - // skip devicelock and screenlock windows - (cw->propertyCache()->meegoStackingLayer() > 2 || - cw->propertyCache()->meegoStackingLayer() == 0)) - setWindowState(cw->window(), IconicState); + + // return default value in case window got internally + // removed + Window w = stacking_list.value(wi, 0); + + if (!w) + continue; + + if (w == lower) { + lower_i = wi; + continue; + } + if (w == stack[DESKTOP_LAYER]) + break; + MCompositeWindow *cw = COMPOSITE_WINDOW(w); + if (cw && cw->isMapped() && cw->isAppWindow(true) && + // skip devicelock and screenlock windows + (cw->propertyCache()->meegoStackingLayer() > 2 || + cw->propertyCache()->meegoStackingLayer() == 0)) + setWindowState(cw->window(), IconicState); } Q_ASSERT(lower_i > 0); stacking_list.move(stacking_list.indexOf(stack[DESKTOP_LAYER]), |