From 5696081cf7cd679b785b6bb61f6ed9962565af23 Mon Sep 17 00:00:00 2001 From: Vlad Zahorodnii Date: Tue, 28 Nov 2023 12:28:00 +0200 Subject: [PATCH] plugins/startupfeedback: Add hidpi support on wayland --- .../startupfeedback/startupfeedback.cpp | 27 ++++++++++++++----- src/plugins/startupfeedback/startupfeedback.h | 5 ++-- 2 files changed, 24 insertions(+), 8 deletions(-) diff --git a/src/plugins/startupfeedback/startupfeedback.cpp b/src/plugins/startupfeedback/startupfeedback.cpp index 8f1f71a173..c3bb9c8d60 100644 --- a/src/plugins/startupfeedback/startupfeedback.cpp +++ b/src/plugins/startupfeedback/startupfeedback.cpp @@ -24,6 +24,7 @@ #include #include // KWin +#include "core/output.h" #include "core/rendertarget.h" #include "core/renderviewport.h" #include "effect/effecthandler.h" @@ -305,6 +306,12 @@ void StartupFeedbackEffect::start(const Startup &startup) if (m_type == NoFeedback || m_splashVisible || effects->isCursorHidden()) { return; } + + const Output *output = effects->screenAt(effects->cursorPos().toPoint()); + if (!output) { + return; + } + if (!m_active) { effects->startMousePolling(); } @@ -322,8 +329,9 @@ void StartupFeedbackEffect::start(const Startup &startup) if (m_type == BouncingFeedback) { m_bounceSizesRatio = iconSize / 16.0; } + const QPixmap iconPixmap = startup.icon.pixmap(iconSize); - prepareTextures(iconPixmap); + prepareTextures(iconPixmap, output->scale()); m_dirtyRect = m_currentGeometry = feedbackRect(); effects->addRepaint(m_dirtyRect); } @@ -354,13 +362,13 @@ void StartupFeedbackEffect::stop() effects->addRepaintFull(); } -void StartupFeedbackEffect::prepareTextures(const QPixmap &pix) +void StartupFeedbackEffect::prepareTextures(const QPixmap &pix, qreal devicePixelRatio) { effects->makeOpenGLContextCurrent(); switch (m_type) { case BouncingFeedback: for (int i = 0; i < 5; ++i) { - m_bouncingTextures[i] = GLTexture::upload(scalePixmap(pix, BOUNCE_SIZES[i])); + m_bouncingTextures[i] = GLTexture::upload(scalePixmap(pix, BOUNCE_SIZES[i], devicePixelRatio)); if (!m_bouncingTextures[i]) { return; } @@ -385,7 +393,7 @@ void StartupFeedbackEffect::prepareTextures(const QPixmap &pix) } } -QImage StartupFeedbackEffect::scalePixmap(const QPixmap &pm, const QSize &size) const +QImage StartupFeedbackEffect::scalePixmap(const QPixmap &pm, const QSize &size, qreal devicePixelRatio) const { const QSize &adjustedSize = size * m_bounceSizesRatio; QImage scaled = pm.toImage().scaled(adjustedSize, Qt::IgnoreAspectRatio, Qt::SmoothTransformation); @@ -393,7 +401,9 @@ QImage StartupFeedbackEffect::scalePixmap(const QPixmap &pm, const QSize &size) scaled.convertTo(QImage::Format_ARGB32); } - QImage result(20 * m_bounceSizesRatio, 20 * m_bounceSizesRatio, QImage::Format_ARGB32); + QImage result(feedbackIconSize() * devicePixelRatio, QImage::Format_ARGB32); + result.setDevicePixelRatio(devicePixelRatio); + QPainter p(&result); p.setCompositionMode(QPainter::CompositionMode_Source); p.fillRect(result.rect(), Qt::transparent); @@ -405,6 +415,11 @@ QImage StartupFeedbackEffect::scalePixmap(const QPixmap &pm, const QSize &size) return result; } +QSize StartupFeedbackEffect::feedbackIconSize() const +{ + return QSize(20, 20) * m_bounceSizesRatio; +} + QRect StartupFeedbackEffect::feedbackRect() const { int xDiff; @@ -436,7 +451,7 @@ QRect StartupFeedbackEffect::feedbackRect() const const QPoint cursorPos = effects->cursorPos().toPoint() + QPoint(xDiff, yDiff + yOffset); QRect rect; if (texture) { - rect = QRect(cursorPos, texture->size()); + rect = QRect(cursorPos, feedbackIconSize()); } return rect; } diff --git a/src/plugins/startupfeedback/startupfeedback.h b/src/plugins/startupfeedback/startupfeedback.h index c2ee4e8b1d..1a5399c4e7 100644 --- a/src/plugins/startupfeedback/startupfeedback.h +++ b/src/plugins/startupfeedback/startupfeedback.h @@ -71,9 +71,10 @@ private: void start(const Startup &startup); void stop(); - QImage scalePixmap(const QPixmap &pm, const QSize &size) const; - void prepareTextures(const QPixmap &pix); + QImage scalePixmap(const QPixmap &pm, const QSize &size, qreal devicePixelRatio) const; + void prepareTextures(const QPixmap &pix, qreal devicePixelRatio); QRect feedbackRect() const; + QSize feedbackIconSize() const; qreal m_bounceSizesRatio; KStartupInfo *m_startupInfo;