diff --git a/layers.cpp b/layers.cpp index ed8555c2d..f2dac714d 100644 --- a/layers.cpp +++ b/layers.cpp @@ -115,7 +115,13 @@ void Workspace::updateStackingOrder(bool propagate_new_clients) blocked_propagating_new_clients = true; return; } - ClientList new_stacking_order = constrainedStackingOrder(); + ToplevelList constrainedOrder = constrainedStackingOrder(); + ClientList new_stacking_order; + foreach (Toplevel *t, constrainedOrder) { + if (Client *c = qobject_cast(t)) { + new_stacking_order << c; + } + } bool changed = (new_stacking_order != stacking_order || force_restacking); force_restacking = false; stacking_order = new_stacking_order; @@ -503,9 +509,9 @@ void Workspace::circulateDesktopApplications() /*! Returns a stacking order based upon \a list that fulfills certain contained. */ -ClientList Workspace::constrainedStackingOrder() +ToplevelList Workspace::constrainedStackingOrder() { - ClientList layer[ NumLayers ]; + ToplevelList layer[ NumLayers ]; #if 0 kDebug(1212) << "stacking1:"; @@ -534,7 +540,7 @@ ClientList Workspace::constrainedStackingOrder() } layer[ l ].append(*it); } - ClientList stacking; + ToplevelList stacking; for (Layer lay = FirstLayer; lay < NumLayers; ++lay) @@ -551,13 +557,14 @@ ClientList Workspace::constrainedStackingOrder() for (int i = stacking.size() - 1; i >= 0; ) { - if (!stacking[ i ]->isTransient()) { + Client *current = qobject_cast(stacking[i]); + if (!current || !current->isTransient()) { --i; continue; } int i2 = -1; - if (stacking[ i ]->groupTransient()) { - if (stacking[ i ]->group()->members().count() > 0) { + if (current->groupTransient()) { + if (current->group()->members().count() > 0) { // find topmost client this one is transient for for (i2 = stacking.size() - 1; i2 >= 0; @@ -566,8 +573,12 @@ ClientList Workspace::constrainedStackingOrder() i2 = -1; // don't reorder, already the topmost in the group break; } - if (stacking[ i2 ]->hasTransient(stacking[ i ], true) - && keepTransientAbove(stacking[ i2 ], stacking[ i ])) + Client *c2 = qobject_cast(stacking[ i2 ]); + if (!c2) { + continue; + } + if (c2->hasTransient(current, true) + && keepTransientAbove(c2, current)) break; } } // else i2 remains pointing at -1 @@ -575,12 +586,16 @@ ClientList Workspace::constrainedStackingOrder() for (i2 = stacking.size() - 1; i2 >= 0; --i2) { - if (stacking[ i2 ] == stacking[ i ]) { + Client *c2 = qobject_cast(stacking[ i2 ]); + if (!c2) { + continue; + } + if (c2 == current) { i2 = -1; // don't reorder, already on top of its mainwindow break; } - if (stacking[ i2 ] == stacking[ i ]->transientFor() - && keepTransientAbove(stacking[ i2 ], stacking[ i ])) + if (c2 == current->transientFor() + && keepTransientAbove(c2, current)) break; } } @@ -588,7 +603,6 @@ ClientList Workspace::constrainedStackingOrder() --i; continue; } - Client* current = stacking[ i ]; stacking.removeAt(i); --i; // move onto the next item (for next for () iteration) --i2; // adjust index of the mainwindow after the remove above diff --git a/workspace.h b/workspace.h index 3be2bc523..1d72bce95 100644 --- a/workspace.h +++ b/workspace.h @@ -714,7 +714,7 @@ private: void switchWindow(Direction direction); void propagateClients(bool propagate_new_clients); // Called only from updateStackingOrder - ClientList constrainedStackingOrder(); + ToplevelList constrainedStackingOrder(); void raiseClientWithinApplication(Client* c); void lowerClientWithinApplication(Client* c); bool allowFullClientRaising(const Client* c, Time timestamp);