19 m_justMapped = m_upmostWindow =
nullptr;
36 usableOldStackingOrder = usableWindows(oldStackingOrder);
41 usableNewStackingOrder = usableWindows(newStackingOrder);
42 if (usableNewStackingOrder == usableOldStackingOrder || usableNewStackingOrder.isEmpty()) {
43 oldStackingOrder = newStackingOrder;
44 usableOldStackingOrder = usableNewStackingOrder;
48 m_upmostWindow = usableNewStackingOrder.last();
50 if (m_upmostWindow == m_justMapped) {
51 m_justMapped =
nullptr;
52 }
else if (!usableOldStackingOrder.isEmpty() && m_upmostWindow != usableOldStackingOrder.last()) {
53 windowRaised(m_upmostWindow);
56 oldStackingOrder = newStackingOrder;
57 usableOldStackingOrder = usableNewStackingOrder;
63 bool currentFound =
false;
64 for (
EffectWindow *tmp : std::as_const(oldStackingOrder)) {
72 if (intersects(w, tmp->frameGeometry().toRect())) {
74 slideRect = getSlideDestination(getModalGroupGeometry(w), tmp->frameGeometry().toRect());
76 elevatedList.append(tmp);
79 destinationList.insert(tmp, slideRect);
80 coveringWindows.append(tmp);
83 for (EffectWindow *elevatedWindow : std::as_const(elevatedList)) {
84 if (tmp->frameGeometry().intersects(elevatedWindow->frameGeometry())) {
86 elevatedList.append(tmp);
92 if (tmp->isDock() || tmp->keepAbove()) {
94 elevatedList.append(tmp);
101 for (EffectWindow *tmp : std::as_const(elevatedList)) {
107QRect SlideBackEffect::getSlideDestination(
const QRect &windowUnderGeometry,
const QRect &windowOverGeometry)
110 int leftSlide = windowUnderGeometry.left() - windowOverGeometry.right() - 20;
111 int rightSlide = windowUnderGeometry.right() - windowOverGeometry.left() + 20;
112 int upSlide = windowUnderGeometry.top() - windowOverGeometry.bottom() - 20;
113 int downSlide = windowUnderGeometry.bottom() - windowOverGeometry.top() + 20;
115 int horizSlide = leftSlide;
116 if (std::abs(horizSlide) > std::abs(rightSlide)) {
117 horizSlide = rightSlide;
119 int vertSlide = upSlide;
120 if (std::abs(vertSlide) > std::abs(downSlide)) {
121 vertSlide = downSlide;
124 QRect slideRect = windowOverGeometry;
125 if (std::abs(horizSlide) < std::abs(vertSlide)) {
126 slideRect.moveLeft(slideRect.x() + horizSlide);
128 slideRect.moveTop(slideRect.y() + vertSlide);
136 if (m_lastPresentTime.count()) {
137 time = (presentTime - m_lastPresentTime).count();
139 m_lastPresentTime = presentTime;
147 for (
auto *w : windows) {
179 motionManager.
apply(w, data);
181 for (
const QRegion &r : std::as_const(clippedRegions)) {
182 region = region.intersected(r);
185 clippedRegions.clear();
191 if (destinationList.contains(w)) {
195 if (coveringWindows.contains(w)) {
196 QList<EffectWindow *> tmpList;
198 QRect elevatedGeometry = tmp->frameGeometry().toRect();
202 if (m_upmostWindow && !tmp->
isDock() && !tmp->keepAbove() && m_upmostWindow->
frameGeometry().intersects(elevatedGeometry)) {
203 QRect newDestination;
204 newDestination = getSlideDestination(getModalGroupGeometry(m_upmostWindow), elevatedGeometry);
206 motionManager.
manage(tmp);
208 motionManager.
moveWindow(tmp, newDestination);
209 destinationList[tmp] = newDestination;
211 if (!tmp->isDock()) {
212 bool keepElevated =
false;
213 for (
EffectWindow *elevatedWindow : std::as_const(tmpList)) {
214 if (tmp->frameGeometry().intersects(elevatedWindow->frameGeometry())) {
220 elevatedList.removeAll(tmp);
229 destinationList.remove(w);
239 if (coveringWindows.contains(w)) {
242 if (m_upmostWindow && !intersects(m_upmostWindow, motionManager.
transformedGeometry(w).toAlignedRect())) {
243 coveringWindows.removeAll(w);
244 if (coveringWindows.isEmpty()) {
249 elevatedList.clear();
255 m_lastPresentTime = std::chrono::milliseconds::zero();
262 if (w == m_upmostWindow) {
263 m_upmostWindow =
nullptr;
265 if (w == m_justMapped) {
266 m_justMapped =
nullptr;
268 usableOldStackingOrder.removeAll(w);
269 oldStackingOrder.removeAll(w);
270 coveringWindows.removeAll(w);
271 elevatedList.removeAll(w);
283 slotWindowUnminimized(w);
305 m_tabboxActive = std::max(m_tabboxActive - 1, 0);
313bool SlideBackEffect::intersects(EffectWindow *windowUnder,
const QRect &windowOverGeometry)
315 QRect windowUnderGeometry = getModalGroupGeometry(windowUnder);
316 return windowUnderGeometry.intersects(windowOverGeometry);
319QList<EffectWindow *> SlideBackEffect::usableWindows(
const QList<EffectWindow *> &allWindows)
321 QList<EffectWindow *> retList;
322 auto isWindowVisible = [](
const EffectWindow *window) {
325 for (EffectWindow *tmp : std::as_const(allWindows)) {
326 if (isWindowUsable(tmp) && isWindowVisible(tmp)) {
333QRect SlideBackEffect::getModalGroupGeometry(EffectWindow *w)
335 QRect modalGroupGeometry = w->frameGeometry().toRect();
337 const auto mainWindows = w->mainWindows();
338 for (EffectWindow *modalWindow : mainWindows) {
339 modalGroupGeometry = modalGroupGeometry.united(getModalGroupGeometry(modalWindow));
342 return modalGroupGeometry;
352#include "moc_slideback.cpp"
Representation of a window used by/for Effect classes.
void minimizedChanged(KWin::EffectWindow *w)
bool isNormalWindow() const
bool isOnCurrentDesktop() const
Q_SCRIPTABLE void setData(int role, const QVariant &data)
QRectF frameGeometry() const
void windowDeleted(KWin::EffectWindow *w)
QList< EffectWindow * > stackingOrder
Q_SCRIPTABLE void setElevatedWindow(KWin::EffectWindow *w, bool set)
void stackingOrderChanged()
void paintWindow(const RenderTarget &renderTarget, const RenderViewport &viewport, EffectWindow *w, int mask, const QRegion ®ion, WindowPaintData &data)
QRect virtualScreenGeometry
void prePaintScreen(ScreenPrePaintData &data, std::chrono::milliseconds presentTime)
void prePaintWindow(EffectWindow *w, WindowPrePaintData &data, std::chrono::milliseconds presentTime)
void windowAdded(KWin::EffectWindow *w)
Q_SCRIPTABLE void addRepaintFull()
Effect * activeFullScreenEffect() const
void postPaintWindow(EffectWindow *w)
void tabBoxAdded(int mode)
void postPaintScreen() override
void prePaintWindow(EffectWindow *w, WindowPrePaintData &data, std::chrono::milliseconds presentTime) override
bool isActive() const override
void postPaintWindow(EffectWindow *w) override
void slotStackingOrderChanged()
void slotWindowUnminimized(KWin::EffectWindow *w)
void slotWindowAdded(KWin::EffectWindow *w)
void prePaintScreen(ScreenPrePaintData &data, std::chrono::milliseconds presentTime) override
void paintWindow(const RenderTarget &renderTarget, const RenderViewport &viewport, EffectWindow *w, int mask, QRegion region, WindowPaintData &data) override
void slotWindowDeleted(KWin::EffectWindow *w)
bool managingWindows() const
void unmanage(EffectWindow *w)
bool isWindowMoving(EffectWindow *w) const
void manage(EffectWindow *w)
void apply(EffectWindow *w, WindowPaintData &data)
bool areWindowsMoving() const
void moveWindow(EffectWindow *w, QPoint target, double scale=1.0, double yScale=0.0)
QRectF transformedGeometry(EffectWindow *w) const
bool isManaging(EffectWindow *w) const
@ PAINT_SCREEN_WITH_TRANSFORMED_WINDOWS
@ WindowForceBlurRole
For fullscreen effects to enforce blurring of windows,.