diff --git a/autotests/mock_effectshandler.h b/autotests/mock_effectshandler.h index 28f30ce3a8..391fa07542 100644 --- a/autotests/mock_effectshandler.h +++ b/autotests/mock_effectshandler.h @@ -273,6 +273,21 @@ public: KWin::SessionState sessionState() const override { return KWin::SessionState::Normal; } + QList screens() const override { + return {}; + } + KWin::EffectScreen *screenAt(const QPoint &point) const override { + Q_UNUSED(point) + return nullptr; + } + KWin::EffectScreen *findScreen(const QString &name) const override { + Q_UNUSED(name) + return nullptr; + } + KWin::EffectScreen *findScreen(int screenId) const override { + Q_UNUSED(screenId) + return nullptr; + } private: bool m_animationsSuported = true; diff --git a/autotests/test_screen_paint_data.cpp b/autotests/test_screen_paint_data.cpp index 017950186b..4bf401af87 100644 --- a/autotests/test_screen_paint_data.cpp +++ b/autotests/test_screen_paint_data.cpp @@ -47,12 +47,12 @@ void TestScreenPaintData::testCtor() QCOMPARE(data.rotationAngle(), 0.0); QCOMPARE(data.rotationOrigin(), QVector3D()); QCOMPARE(data.rotationAxis(), QVector3D(0.0, 0.0, 1.0)); - QCOMPARE(data.outputGeometry(), QRect()); + QCOMPARE(data.screen(), nullptr); } void TestScreenPaintData::testCopyCtor() { - ScreenPaintData data(QMatrix4x4(), QRect(10, 20, 30, 40)); + ScreenPaintData data; ScreenPaintData data2(data); // no value had been changed QCOMPARE(data2.xScale(), 1.0); @@ -65,7 +65,6 @@ void TestScreenPaintData::testCopyCtor() QCOMPARE(data2.rotationAngle(), 0.0); QCOMPARE(data2.rotationOrigin(), QVector3D()); QCOMPARE(data2.rotationAxis(), QVector3D(0.0, 0.0, 1.0)); - QCOMPARE(data2.outputGeometry(), QRect(10, 20, 30, 40)); data2.setScale(QVector3D(0.5, 2.0, 3.0)); data2.translate(0.5, 2.0, 3.0); @@ -89,14 +88,13 @@ void TestScreenPaintData::testCopyCtor() void TestScreenPaintData::testAssignmentOperator() { ScreenPaintData data; - ScreenPaintData data2(QMatrix4x4(), QRect(10, 20, 30, 40)); + ScreenPaintData data2; data2.setScale(QVector3D(0.5, 2.0, 3.0)); data2.translate(0.5, 2.0, 3.0); data2.setRotationAngle(45.0); data2.setRotationOrigin(QVector3D(1.0, 2.0, 3.0)); data2.setRotationAxis(QVector3D(1.0, 1.0, 0.0)); - QCOMPARE(data2.outputGeometry(), QRect(10, 20, 30, 40)); data = data2; // data and data2 should be the same @@ -110,7 +108,6 @@ void TestScreenPaintData::testAssignmentOperator() QCOMPARE(data.rotationAngle(), 45.0); QCOMPARE(data.rotationOrigin(), QVector3D(1.0, 2.0, 3.0)); QCOMPARE(data.rotationAxis(), QVector3D(1.0, 1.0, 0.0)); - QCOMPARE(data.outputGeometry(), QRect(10, 20, 30, 40)); // data 2 QCOMPARE(data2.xScale(), 0.5); QCOMPARE(data2.yScale(), 2.0); diff --git a/src/effects.cpp b/src/effects.cpp index a75a568cc7..db6344aa37 100644 --- a/src/effects.cpp +++ b/src/effects.cpp @@ -10,6 +10,7 @@ #include "effects.h" +#include "abstract_output.h" #include "effectsadaptor.h" #include "effectloader.h" #ifdef KWIN_BUILD_ACTIVITIES @@ -189,9 +190,9 @@ EffectsHandlerImpl::EffectsHandlerImpl(Compositor *compositor, Scene *scene) &KWin::EffectsHandler::sessionStateChanged); connect(vds, &VirtualDesktopManager::countChanged, this, &EffectsHandler::numberDesktopsChanged); connect(Cursors::self()->mouse(), &Cursor::mouseChanged, this, &EffectsHandler::mouseChanged); - connect(screens(), &Screens::countChanged, this, &EffectsHandler::numberScreensChanged); - connect(screens(), &Screens::sizeChanged, this, &EffectsHandler::virtualScreenSizeChanged); - connect(screens(), &Screens::geometryChanged, this, &EffectsHandler::virtualScreenGeometryChanged); + connect(Screens::self(), &Screens::countChanged, this, &EffectsHandler::numberScreensChanged); + connect(Screens::self(), &Screens::sizeChanged, this, &EffectsHandler::virtualScreenSizeChanged); + connect(Screens::self(), &Screens::geometryChanged, this, &EffectsHandler::virtualScreenGeometryChanged); #ifdef KWIN_BUILD_ACTIVITIES if (Activities *activities = Activities::self()) { connect(activities, &Activities::added, this, &EffectsHandler::activityAdded); @@ -251,6 +252,14 @@ EffectsHandlerImpl::EffectsHandlerImpl(Compositor *compositor, Scene *scene) setupClientConnections(client); } + connect(kwinApp()->platform(), &Platform::outputEnabled, this, &EffectsHandlerImpl::slotOutputEnabled); + connect(kwinApp()->platform(), &Platform::outputDisabled, this, &EffectsHandlerImpl::slotOutputDisabled); + + const QVector outputs = kwinApp()->platform()->enabledOutputs(); + for (AbstractOutput *output : outputs) { + slotOutputEnabled(output); + } + reconfigure(); } @@ -977,12 +986,12 @@ int EffectsHandlerImpl::desktopGridHeight() const int EffectsHandlerImpl::workspaceWidth() const { - return desktopGridWidth() * screens()->size().width(); + return desktopGridWidth() * Screens::self()->size().width(); } int EffectsHandlerImpl::workspaceHeight() const { - return desktopGridHeight() * screens()->size().height(); + return desktopGridHeight() * Screens::self()->size().height(); } int EffectsHandlerImpl::desktopAtCoords(QPoint coords) const @@ -1003,7 +1012,7 @@ QPoint EffectsHandlerImpl::desktopCoords(int id) const QPoint coords = VirtualDesktopManager::self()->grid().gridCoords(id); if (coords.x() == -1) return QPoint(-1, -1); - const QSize displaySize = screens()->size(); + const QSize displaySize = Screens::self()->size(); return QPoint(coords.x() * displaySize.width(), coords.y() * displaySize.height()); } @@ -1208,17 +1217,17 @@ void EffectsHandlerImpl::addRepaint(int x, int y, int w, int h) int EffectsHandlerImpl::activeScreen() const { - return screens()->current(); + return Screens::self()->current(); } int EffectsHandlerImpl::numScreens() const { - return screens()->count(); + return Screens::self()->count(); } int EffectsHandlerImpl::screenNumber(const QPoint& pos) const { - return screens()->number(pos); + return Screens::self()->number(pos); } QRect EffectsHandlerImpl::clientArea(clientAreaOption opt, int screen, int desktop) const @@ -1243,12 +1252,12 @@ QRect EffectsHandlerImpl::clientArea(clientAreaOption opt, const QPoint& p, int QRect EffectsHandlerImpl::virtualScreenGeometry() const { - return screens()->geometry(); + return Screens::self()->geometry(); } QSize EffectsHandlerImpl::virtualScreenSize() const { - return screens()->size(); + return Screens::self()->size(); } void EffectsHandlerImpl::defineCursor(Qt::CursorShape shape) @@ -1697,6 +1706,81 @@ SessionState EffectsHandlerImpl::sessionState() const return Workspace::self()->sessionManager()->state(); } +QList EffectsHandlerImpl::screens() const +{ + return m_effectScreens; +} + +EffectScreen *EffectsHandlerImpl::screenAt(const QPoint &point) const +{ + return m_effectScreens.value(screenNumber(point)); +} + +EffectScreen *EffectsHandlerImpl::findScreen(const QString &name) const +{ + for (EffectScreen *screen : qAsConst(m_effectScreens)) { + if (screen->name() == name) { + return screen; + } + } + return nullptr; +} + +EffectScreen *EffectsHandlerImpl::findScreen(int screenId) const +{ + return m_effectScreens.value(screenId); +} + +void EffectsHandlerImpl::slotOutputEnabled(AbstractOutput *output) +{ + EffectScreen *screen = new EffectScreenImpl(output, this); + m_effectScreens.append(screen); + emit screenAdded(screen); +} + +void EffectsHandlerImpl::slotOutputDisabled(AbstractOutput *output) +{ + auto it = std::find_if(m_effectScreens.begin(), m_effectScreens.end(), [&output](EffectScreen *screen) { + return static_cast(screen)->platformOutput() == output; + }); + if (it != m_effectScreens.end()) { + EffectScreen *screen = *it; + m_effectScreens.erase(it); + emit screenRemoved(screen); + delete screen; + } +} + +//**************************************** +// EffectScreenImpl +//**************************************** + +EffectScreenImpl::EffectScreenImpl(AbstractOutput *output, QObject *parent) + : EffectScreen(parent) + , m_platformOutput(output) +{ +} + +AbstractOutput *EffectScreenImpl::platformOutput() const +{ + return m_platformOutput; +} + +QString EffectScreenImpl::name() const +{ + return m_platformOutput->name(); +} + +qreal EffectScreenImpl::devicePixelRatio() const +{ + return m_platformOutput->scale(); +} + +QRect EffectScreenImpl::geometry() const +{ + return m_platformOutput->geometry(); +} + //**************************************** // EffectWindowImpl //**************************************** diff --git a/src/effects.h b/src/effects.h index 48eaf00d57..d3d095dbbb 100644 --- a/src/effects.h +++ b/src/effects.h @@ -267,6 +267,10 @@ public: void renderEffectQuickView(EffectQuickView *effectQuickView) const override; SessionState sessionState() const override; + QList screens() const override; + EffectScreen *screenAt(const QPoint &point) const override; + EffectScreen *findScreen(const QString &name) const override; + EffectScreen *findScreen(int screenId) const override; public Q_SLOTS: void slotCurrentTabAboutToChange(EffectWindow* from, EffectWindow* to); @@ -295,6 +299,8 @@ protected Q_SLOTS: void slotFrameGeometryChanged(Toplevel *toplevel, const QRect &oldGeometry); void slotPaddingChanged(KWin::Toplevel *t, const QRect &old); void slotWindowDamaged(KWin::Toplevel *t, const QRegion& r); + void slotOutputEnabled(AbstractOutput *output); + void slotOutputDisabled(AbstractOutput *output); protected: void connectNotify(const QMetaMethod &signal) override; @@ -357,6 +363,24 @@ private: EffectLoader *m_effectLoader; int m_trackingCursorChanges; std::unique_ptr m_x11WindowPropertyNotify; + QList m_effectScreens; +}; + +class EffectScreenImpl : public EffectScreen +{ + Q_OBJECT + +public: + explicit EffectScreenImpl(AbstractOutput *output, QObject *parent = nullptr); + + AbstractOutput *platformOutput() const; + + QString name() const override; + qreal devicePixelRatio() const override; + QRect geometry() const override; + +private: + AbstractOutput *m_platformOutput; }; class EffectWindowImpl : public EffectWindow diff --git a/src/effects/colorpicker/colorpicker.cpp b/src/effects/colorpicker/colorpicker.cpp index 2a2f10a3f7..bc60225838 100644 --- a/src/effects/colorpicker/colorpicker.cpp +++ b/src/effects/colorpicker/colorpicker.cpp @@ -52,7 +52,7 @@ ColorPickerEffect::~ColorPickerEffect() = default; void ColorPickerEffect::paintScreen(int mask, const QRegion ®ion, ScreenPaintData &data) { - m_cachedOutputGeometry = data.outputGeometry(); + m_paintedScreen = data.screen(); effects->paintScreen(mask, region, data); } @@ -60,7 +60,7 @@ void ColorPickerEffect::postPaintScreen() { effects->postPaintScreen(); - if (m_scheduledPosition != QPoint(-1, -1) && (m_cachedOutputGeometry.isEmpty() || m_cachedOutputGeometry.contains(m_scheduledPosition))) { + if (m_scheduledPosition != QPoint(-1, -1) && (!m_paintedScreen || m_paintedScreen->geometry().contains(m_scheduledPosition))) { uint8_t data[3]; const QRect geo = GLRenderTarget::virtualScreenGeometry(); const QPoint screenPosition(m_scheduledPosition.x() - geo.x(), m_scheduledPosition.y() - geo.y()); diff --git a/src/effects/colorpicker/colorpicker.h b/src/effects/colorpicker/colorpicker.h index 88ccd7b8c8..1be048d74b 100644 --- a/src/effects/colorpicker/colorpicker.h +++ b/src/effects/colorpicker/colorpicker.h @@ -44,7 +44,7 @@ private: void hideInfoMessage(); QDBusMessage m_replyMessage; - QRect m_cachedOutputGeometry; + EffectScreen *m_paintedScreen = nullptr; QPoint m_scheduledPosition; bool m_picking = false; }; diff --git a/src/effects/screenshot/screenshot.cpp b/src/effects/screenshot/screenshot.cpp index eb715f8dcf..ddd1d9e2c1 100644 --- a/src/effects/screenshot/screenshot.cpp +++ b/src/effects/screenshot/screenshot.cpp @@ -179,10 +179,7 @@ static xcb_pixmap_t xpixmapFromImage(const QImage &image) void ScreenShotEffect::paintScreen(int mask, const QRegion ®ion, ScreenPaintData &data) { - m_cachedOutputGeometry = data.outputGeometry(); - // When taking a non-nativeSize fullscreenshot, pretend we have a uniform 1.0 ratio - // so the screenshot size will match the virtualGeometry - m_cachedScale = m_nativeSize ? data.screenScale() : 1.0; + m_paintedScreen = data.screen(); effects->paintScreen(mask, region, data); } @@ -340,22 +337,23 @@ void ScreenShotEffect::postPaintScreen() } if (!m_scheduledGeometry.isNull()) { - if (!m_cachedOutputGeometry.isNull()) { + if (m_paintedScreen) { // special handling for per-output geometry rendering - const QRect intersection = m_scheduledGeometry.intersected(m_cachedOutputGeometry); + const QRect intersection = m_scheduledGeometry.intersected(m_paintedScreen->geometry()); if (intersection.isEmpty()) { // doesn't intersect, not going onto this screenshot return; } - QImage img = blitScreenshot(intersection, m_cachedScale); - if (img.size() == (m_scheduledGeometry.size() * m_cachedScale)) { + const qreal devicePixelRatio = m_nativeSize ? m_paintedScreen->devicePixelRatio() : 1.0; + QImage img = blitScreenshot(intersection, devicePixelRatio); + if (img.size() == (m_scheduledGeometry.size() * devicePixelRatio)) { // we are done sendReplyImage(img); return; } - img.setDevicePixelRatio(m_cachedScale); + img.setDevicePixelRatio(devicePixelRatio); - m_cacheOutputsImages.insert(ComparableQPoint(m_cachedOutputGeometry.topLeft()), img); + m_cacheOutputsImages.insert(ComparableQPoint(m_paintedScreen->geometry().topLeft()), img); m_multipleOutputsRendered = m_multipleOutputsRendered.united(intersection); if (m_multipleOutputsRendered.boundingRect() == m_scheduledGeometry) { @@ -460,7 +458,6 @@ void ScreenShotEffect::clearState() m_captureCursor = false; m_windowMode = WindowMode::NoCapture; m_cacheOutputsImages.clear(); - m_cachedOutputGeometry = QRect(); m_nativeSize = false; m_orderImg.clear(); } diff --git a/src/effects/screenshot/screenshot.h b/src/effects/screenshot/screenshot.h index 7d210ba550..93a9d04f8b 100644 --- a/src/effects/screenshot/screenshot.h +++ b/src/effects/screenshot/screenshot.h @@ -164,7 +164,6 @@ private: ScreenShotType m_type; QRect m_scheduledGeometry; QDBusMessage m_replyMessage; - QRect m_cachedOutputGeometry; QRegion m_multipleOutputsRendered; QMap m_cacheOutputsImages; QList m_orderImg; @@ -178,7 +177,7 @@ private: }; WindowMode m_windowMode = WindowMode::NoCapture; int m_fd = -1; - qreal m_cachedScale; + EffectScreen *m_paintedScreen = nullptr; }; } // namespace diff --git a/src/libkwineffects/kwineffects.cpp b/src/libkwineffects/kwineffects.cpp index e55aa9872a..9680fbd34a 100644 --- a/src/libkwineffects/kwineffects.cpp +++ b/src/libkwineffects/kwineffects.cpp @@ -422,8 +422,7 @@ class ScreenPaintData::Private { public: QMatrix4x4 projectionMatrix; - QRect outputGeometry; - qreal screenScale; + EffectScreen *screen = nullptr; }; ScreenPaintData::ScreenPaintData() @@ -432,13 +431,12 @@ ScreenPaintData::ScreenPaintData() { } -ScreenPaintData::ScreenPaintData(const QMatrix4x4 &projectionMatrix, const QRect &outputGeometry, const qreal screenScale) +ScreenPaintData::ScreenPaintData(const QMatrix4x4 &projectionMatrix, EffectScreen *screen) : PaintData() , d(new Private()) { d->projectionMatrix = projectionMatrix; - d->outputGeometry = outputGeometry; - d->screenScale = screenScale; + d->screen = screen; } ScreenPaintData::~ScreenPaintData() = default; @@ -455,7 +453,7 @@ ScreenPaintData::ScreenPaintData(const ScreenPaintData &other) setRotationAxis(other.rotationAxis()); setRotationAngle(other.rotationAngle()); d->projectionMatrix = other.d->projectionMatrix; - d->outputGeometry = other.d->outputGeometry; + d->screen = other.d->screen; } ScreenPaintData &ScreenPaintData::operator=(const ScreenPaintData &rhs) @@ -470,7 +468,7 @@ ScreenPaintData &ScreenPaintData::operator=(const ScreenPaintData &rhs) setRotationAxis(rhs.rotationAxis()); setRotationAngle(rhs.rotationAngle()); d->projectionMatrix = rhs.d->projectionMatrix; - d->outputGeometry = rhs.d->outputGeometry; + d->screen = rhs.d->screen; return *this; } @@ -523,14 +521,9 @@ QMatrix4x4 ScreenPaintData::projectionMatrix() const return d->projectionMatrix; } -QRect ScreenPaintData::outputGeometry() const +EffectScreen *ScreenPaintData::screen() const { - return d->outputGeometry; -} - -qreal ScreenPaintData::screenScale() const -{ - return d->screenScale; + return d->screen; } //**************************************** @@ -763,6 +756,10 @@ bool EffectsHandler::isOpenGLCompositing() const EffectsHandler* effects = nullptr; +EffectScreen::EffectScreen(QObject *parent) + : QObject(parent) +{ +} //**************************************** // EffectWindow diff --git a/src/libkwineffects/kwineffects.h b/src/libkwineffects/kwineffects.h index 5bc6e401d7..3d841bd849 100644 --- a/src/libkwineffects/kwineffects.h +++ b/src/libkwineffects/kwineffects.h @@ -69,6 +69,7 @@ class EffectWindowGroup; class EffectFrame; class EffectFramePrivate; class EffectQuickView; +class EffectScreen; class Effect; class WindowQuad; class GLShader; @@ -174,7 +175,7 @@ X-KDE-Library=kwin4_effect_cooleffect #define KWIN_EFFECT_API_MAKE_VERSION( major, minor ) (( major ) << 8 | ( minor )) #define KWIN_EFFECT_API_VERSION_MAJOR 0 -#define KWIN_EFFECT_API_VERSION_MINOR 232 +#define KWIN_EFFECT_API_VERSION_MINOR 233 #define KWIN_EFFECT_API_VERSION KWIN_EFFECT_API_MAKE_VERSION( \ KWIN_EFFECT_API_VERSION_MAJOR, KWIN_EFFECT_API_VERSION_MINOR ) @@ -1378,7 +1379,24 @@ public: * @since 5.18 */ virtual SessionState sessionState() const = 0; + + /** + * Returns the list of all the screens connected to the system. + */ + virtual QList screens() const = 0; + virtual EffectScreen *screenAt(const QPoint &point) const = 0; + virtual EffectScreen *findScreen(const QString &name) const = 0; + virtual EffectScreen *findScreen(int screenId) const = 0; + Q_SIGNALS: + /** + * This signal is emitted whenever a new @a screen is added to the system. + */ + void screenAdded(KWin::EffectScreen *screen); + /** + * This signal is emitted whenever a @a screen is removed from the system. + */ + void screenRemoved(KWin::EffectScreen *screen); /** * Signal emitted when the current desktop changed. * @param oldDesktop The previously current desktop @@ -1833,6 +1851,31 @@ protected: CompositingType compositing_type; }; +/** + * The EffectScreen class represents a screen used by/for Effect classes. + */ +class KWINEFFECTS_EXPORT EffectScreen : public QObject +{ + Q_OBJECT + +public: + explicit EffectScreen(QObject *parent = nullptr); + + /** + * Returns the name of the screen, e.g. "DP-1". + */ + virtual QString name() const = 0; + + /** + * Returns the screen's ratio between physical pixels and device-independent pixels. + */ + virtual qreal devicePixelRatio() const = 0; + + /** + * Returns the screen's geometry in the device-independent pixels. + */ + virtual QRect geometry() const = 0; +}; /** * @short Representation of a window used by/for Effect classes. @@ -3000,7 +3043,7 @@ class KWINEFFECTS_EXPORT ScreenPaintData : public PaintData { public: ScreenPaintData(); - ScreenPaintData(const QMatrix4x4 &projectionMatrix, const QRect &outputGeometry = QRect(), const qreal screenScale = 1.0); + ScreenPaintData(const QMatrix4x4 &projectionMatrix, EffectScreen *screen = nullptr); ScreenPaintData(const ScreenPaintData &other); ~ScreenPaintData() override; /** @@ -3054,21 +3097,10 @@ public: QMatrix4x4 projectionMatrix() const; /** - * The geometry of the currently rendered output. - * Only set for per-output rendering (e.g. Wayland). - * - * This geometry can be used as a hint about the native window the OpenGL context - * is bound. OpenGL calls need to be translated to this geometry. - * @since 5.9 + * Returns the currently rendered screen. Only set for per-screen rendering, e.g. Wayland. */ - QRect outputGeometry() const; + EffectScreen *screen() const; - /** - * The scale factor for the output - * - * @since 5.19 - */ - qreal screenScale() const; private: class Private; QScopedPointer d; diff --git a/src/plugins/platforms/x11/standalone/effects_x11.cpp b/src/plugins/platforms/x11/standalone/effects_x11.cpp index fb15823b5d..7e0d9aa0fc 100644 --- a/src/plugins/platforms/x11/standalone/effects_x11.cpp +++ b/src/plugins/platforms/x11/standalone/effects_x11.cpp @@ -67,7 +67,7 @@ void EffectsHandlerImplX11::doStartMouseInterception(Qt::CursorShape shape) // NOTE: it is intended to not perform an XPointerGrab on X11. See documentation in kwineffects.h // The mouse grab is implemented by using a full screen input only window if (!m_mouseInterceptionWindow.isValid()) { - const QSize &s = screens()->size(); + const QSize &s = Screens::self()->size(); const QRect geo(0, 0, s.width(), s.height()); const uint32_t mask = XCB_CW_OVERRIDE_REDIRECT | XCB_CW_EVENT_MASK; const uint32_t values[] = { diff --git a/src/plugins/scenes/opengl/scene_opengl.cpp b/src/plugins/scenes/opengl/scene_opengl.cpp index bc4f5c1bac..0e0d78b638 100644 --- a/src/plugins/scenes/opengl/scene_opengl.cpp +++ b/src/plugins/scenes/opengl/scene_opengl.cpp @@ -675,7 +675,7 @@ void SceneOpenGL::paint(int screenId, const QRegion &damage, const QListisGLES() && screenId == -1) { diff --git a/src/scene.cpp b/src/scene.cpp index 84c0d51bf7..9ef761ffcb 100644 --- a/src/scene.cpp +++ b/src/scene.cpp @@ -147,8 +147,7 @@ void Scene::reallocRepaints() // returns mask and possibly modified region void Scene::paintScreen(int* mask, const QRegion &damage, const QRegion &repaint, QRegion *updateRegion, QRegion *validRegion, RenderLoop *renderLoop, - const QMatrix4x4 &projection, const QRect &outputGeometry, - qreal screenScale) + const QMatrix4x4 &projection) { const QSize &screenSize = screens()->size(); const QRegion displayRegion(0, 0, screenSize.width(), screenSize.height()); @@ -193,7 +192,7 @@ void Scene::paintScreen(int* mask, const QRegion &damage, const QRegion &repaint painted_region = region; repaint_region = repaint; - ScreenPaintData data(projection, outputGeometry, screenScale); + ScreenPaintData data(projection, effects->findScreen(painted_screen)); effects->paintScreen(*mask, region, data); foreach (Window *w, stacking_order) { diff --git a/src/scene.h b/src/scene.h index 7adceac619..4f59b149df 100644 --- a/src/scene.h +++ b/src/scene.h @@ -210,8 +210,7 @@ protected: // shared implementation, starts painting the screen void paintScreen(int *mask, const QRegion &damage, const QRegion &repaint, QRegion *updateRegion, QRegion *validRegion, RenderLoop *renderLoop, - const QMatrix4x4 &projection = QMatrix4x4(), - const QRect &outputGeometry = QRect(), qreal screenScale = 1.0); + const QMatrix4x4 &projection = QMatrix4x4()); // Render cursor texture in case hardware cursor is disabled/non-applicable virtual void paintCursor(const QRegion ®ion) = 0; friend class EffectsHandlerImpl;