[plasma/kwin] src/effect: offscreenquickview/quickeffect: Suspend frame updates when view isn't visible

Devin Lin <[email protected]>
Newsgroups gmane.comp.kde.cvs
Message-ID <[email protected]>
Git commit 0df0fa8021cca81b2fa3067b47deb22ad5ef5910 by Devin Lin.
Committed on 31/07/2026 at 02:32.
Pushed by devinlin into branch 'master'.

offscreenquickview/quickeffect: Suspend frame updates when view isn't visible

With effect caching: https://invent.kde.org/plasma/kwin/-/merge_requests/8998, we can have effects that are not visible but still have a QML context active. Suspend frame updates during this state. Also introduce a signal for visibility state changes that can be listened to.

M  +13   -8    src/effect/offscreenquickview.cpp
M  +1    -0    src/effect/offscreenquickview.h
M  +3    -1    src/effect/quickeffect.cpp

https://invent.kde.org/plasma/kwin/-/commit/0df0fa8021cca81b2fa3067b47deb22ad5ef5910

diff --git a/src/effect/offscreenquickview.cpp b/src/effect/offscreenquickview.cpp
index 194a099998a..30b322a859b 100644
--- a/src/effect/offscreenquickview.cpp
+++ b/src/effect/offscreenquickview.cpp
@@ -263,20 +263,24 @@ void OffscreenQuickView::setDevicePixelRatio(qreal dpr)
 
 void OffscreenQuickView::handleSceneChanged()
 {
-    if (d->m_automaticRepaint) {
-        d->m_repaintTimer->start();
-    } else {
-        d->m_item->scheduleFrame();
+    if (d->m_visible) {
+        if (d->m_automaticRepaint) {
+            d->m_repaintTimer->start();
+        } else {
+            d->m_item->scheduleFrame();
+        }
     }
     Q_EMIT sceneChanged();
 }
 
 void OffscreenQuickView::handleRenderRequested()
 {
-    if (d->m_automaticRepaint) {
-        d->m_repaintTimer->start();
-    } else {
-        d->m_item->scheduleFrame();
+    if (d->m_visible) {
+        if (d->m_automaticRepaint) {
+            d->m_repaintTimer->start();
+        } else {
+            d->m_item->scheduleFrame();
+        }
     }
     Q_EMIT renderRequested();
 }
@@ -574,6 +578,7 @@ void OffscreenQuickView::setVisible(bool visible)
     }
     d->m_visible = visible;
     d->m_item->setVisible(visible);
+    Q_EMIT visibleChanged(visible);
 
     if (visible) {
         Q_EMIT d->m_renderControl->renderRequested();
diff --git a/src/effect/offscreenquickview.h b/src/effect/offscreenquickview.h
index 11c0610c5a1..497f512b528 100644
--- a/src/effect/offscreenquickview.h
+++ b/src/effect/offscreenquickview.h
@@ -141,6 +141,7 @@ public:
 
 Q_SIGNALS:
     void geometryChanged(const KWin::Rect &oldGeometry, const KWin::Rect &newGeometry);
+    void visibleChanged(bool visible);
     void renderRequested();
     void sceneChanged();
 
diff --git a/src/effect/quickeffect.cpp b/src/effect/quickeffect.cpp
index 8ce8a772392..b3f8fb3b0d1 100644
--- a/src/effect/quickeffect.cpp
+++ b/src/effect/quickeffect.cpp
@@ -165,7 +165,9 @@ void QuickSceneView::resetDirty()
 void QuickSceneView::scheduleRepaint()
 {
     markDirty();
-    scheduleFrame();
+    if (isVisible()) {
+        scheduleFrame();
+    }
 }
 
 VirtualDesktop *QuickSceneView::currentDesktop() const
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.