| 345 | } |
| 346 | |
| 347 | void Workspace::lowerWindow(Window *window, bool nogroup) |
| 348 | { |
| 349 | if (window->isDeleted()) { |
| 350 | qCWarning(KWIN_CORE) << "Workspace::lowerWindow: closed window" << window << "cannot be restacked"; |
| 351 | return; |
| 352 | } |
| 353 | |
| 354 | window->cancelAutoRaise(); |
| 355 | |
| 356 | StackingUpdatesBlocker blocker(this); |
| 357 | |
| 358 | if (nogroup || (!window->isTransient() && window->transients().isEmpty())) { |
| 359 | unconstrained_stacking_order.removeAll(window); |
| 360 | unconstrained_stacking_order.prepend(window); |
| 361 | } else { |
| 362 | auto mainWindows = window->allMainWindows(); |
| 363 | Window *parent; |
| 364 | if (mainWindows.isEmpty()) { |
| 365 | parent = window; |
| 366 | } else { |
| 367 | parent = ensureStackingOrder(mainWindows).front(); |
| 368 | } |
| 369 | QList<Window *> windows{parent}; |
| 370 | for (int i = 0; i < windows.size(); ++i) { |
| 371 | if (!windows[i]->transients().isEmpty()) { |
| 372 | windows << windows[i]->transients(); |
| 373 | } |
| 374 | } |
| 375 | windows = ensureStackingOrder(windows); |
| 376 | for (int i = windows.size() - 1; i >= 0; --i) { |
| 377 | lowerWindow(windows[i], true); |
| 378 | } |
| 379 | } |
| 380 | } |
| 381 | |
| 382 | void Workspace::lowerWindowWithinApplication(Window *window) |
| 383 | { |