layers.cpp | layers.cpp | |||
---|---|---|---|---|
skipping to change at line 87 | skipping to change at line 87 | |||
#include "unmanaged.h" | #include "unmanaged.h" | |||
#include "utils/common.h" | #include "utils/common.h" | |||
#include "virtualdesktops.h" | #include "virtualdesktops.h" | |||
#include "wayland_server.h" | #include "wayland_server.h" | |||
#include "workspace.h" | #include "workspace.h" | |||
#include "x11window.h" | #include "x11window.h" | |||
#include <array> | #include <array> | |||
#include <QDebug> | #include <QDebug> | |||
#include <QQueue> | ||||
namespace KWin | namespace KWin | |||
{ | { | |||
//******************************* | //******************************* | |||
// Workspace | // Workspace | |||
//******************************* | //******************************* | |||
void Workspace::updateStackingOrder(bool propagate_new_windows) | void Workspace::updateStackingOrder(bool propagate_new_windows) | |||
{ | { | |||
skipping to change at line 555 | skipping to change at line 554 | |||
} | } | |||
QList<Window *> stacking; | QList<Window *> stacking; | |||
stacking.reserve(unconstrained_stacking_order.count()); | stacking.reserve(unconstrained_stacking_order.count()); | |||
for (uint layer = FirstLayer; layer < NumLayers; ++layer) { | for (uint layer = FirstLayer; layer < NumLayers; ++layer) { | |||
stacking += windows[layer]; | stacking += windows[layer]; | |||
} | } | |||
// Apply the stacking order constraints. First, we enqueue the root con straints, i.e. | // Apply the stacking order constraints. First, we enqueue the root con straints, i.e. | |||
// the ones that are not affected by other constraints. | // the ones that are not affected by other constraints. | |||
QQueue<Constraint *> constraints; | QList<Constraint *> constraints; | |||
constraints.reserve(m_constraints.count()); | constraints.reserve(m_constraints.count()); | |||
for (Constraint *constraint : std::as_const(m_constraints)) { | for (Constraint *constraint : std::as_const(m_constraints)) { | |||
if (constraint->parents.isEmpty()) { | if (constraint->parents.isEmpty()) { | |||
constraint->enqueued = true; | constraint->enqueued = true; | |||
constraints.enqueue(constraint); | constraints.append(constraint); | |||
} else { | } else { | |||
constraint->enqueued = false; | constraint->enqueued = false; | |||
} | } | |||
} | } | |||
// Preserve the relative order of transient siblings in the unconstrain | ||||
ed stacking order. | ||||
auto constraintComparator = [&stacking](Constraint *a, Constraint *b) { | ||||
return stacking.indexOf(a->above) > stacking.indexOf(b->above); | ||||
}; | ||||
std::sort(constraints.begin(), constraints.end(), constraintComparator) | ||||
; | ||||
// Once we've enqueued all the root constraints, we traverse the constr aints tree in | // Once we've enqueued all the root constraints, we traverse the constr aints tree in | |||
// the breadth-first search fashion. A constraint is applied only if it s condition is | // the reverse breadth-first search fashion. A constraint is applied on ly if its condition is | |||
// not met. | // not met. | |||
while (!constraints.isEmpty()) { | while (!constraints.isEmpty()) { | |||
Constraint *constraint = constraints.dequeue(); | Constraint *constraint = constraints.takeFirst(); | |||
const int belowIndex = stacking.indexOf(constraint->below); | const int belowIndex = stacking.indexOf(constraint->below); | |||
const int aboveIndex = stacking.indexOf(constraint->above); | const int aboveIndex = stacking.indexOf(constraint->above); | |||
if (belowIndex == -1 || aboveIndex == -1) { | if (belowIndex == -1 || aboveIndex == -1) { | |||
continue; | continue; | |||
} else if (aboveIndex < belowIndex) { | } else if (aboveIndex < belowIndex) { | |||
stacking.removeAt(aboveIndex); | stacking.removeAt(aboveIndex); | |||
stacking.insert(belowIndex, constraint->above); | stacking.insert(belowIndex, constraint->above); | |||
} | } | |||
for (Constraint *child : std::as_const(constraint->children)) { | // Preserve the relative order of transient siblings in the unconst | |||
rained stacking order. | ||||
QList<Constraint *> children = constraint->children; | ||||
std::sort(children.begin(), children.end(), constraintComparator); | ||||
for (Constraint *child : std::as_const(children)) { | ||||
if (!child->enqueued) { | if (!child->enqueued) { | |||
child->enqueued = true; | child->enqueued = true; | |||
constraints.enqueue(child); | constraints.append(child); | |||
} | } | |||
} | } | |||
} | } | |||
return stacking; | return stacking; | |||
} | } | |||
void Workspace::blockStackingUpdates(bool block) | void Workspace::blockStackingUpdates(bool block) | |||
{ | { | |||
if (block) { | if (block) { | |||
End of changes. 8 change blocks. | ||||
7 lines changed or deleted | 19 lines changed or added | |||
This html diff was produced by rfcdiff 1.41. The latest version is available from http://tools.ietf.org/tools/rfcdiff/ |