diff --git a/layers.cpp b/layers.cpp --- a/layers.cpp +++ b/layers.cpp @@ -693,7 +693,7 @@ // Returns all windows in their stacking order on the root window. ToplevelList Workspace::xStackingOrder() const { - if (m_xStackingQueryTree) { + if (m_xStackingDirty) { const_cast(this)->updateXStackingOrder(); } return x_stacking; @@ -707,7 +707,7 @@ foreach (Toplevel * c, stacking_order) x_stacking.append(c); - if (!tree->isNull()) { + if (tree && !tree->isNull()) { xcb_window_t *windows = tree->children(); const auto count = tree->data()->children_len; int foundUnmanagedCount = unmanaged.count(); @@ -735,6 +735,7 @@ } } } + m_xStackingDirty = false; } //******************************* diff --git a/workspace.h b/workspace.h --- a/workspace.h +++ b/workspace.h @@ -565,6 +565,7 @@ bool force_restacking; ToplevelList x_stacking; // From XQueryTree() std::unique_ptr m_xStackingQueryTree; + bool m_xStackingDirty = false; QList should_get_focus; // Last is most recent QList attention_chain; diff --git a/workspace.cpp b/workspace.cpp --- a/workspace.cpp +++ b/workspace.cpp @@ -1696,7 +1696,10 @@ void Workspace::markXStackingOrderAsDirty() { - m_xStackingQueryTree.reset(new Xcb::Tree(rootWindow())); + m_xStackingDirty = true; + if (kwinApp()->x11Connection()) { + m_xStackingQueryTree.reset(new Xcb::Tree(kwinApp()->x11RootWindow())); + } } void Workspace::setWasUserInteraction()