plugins/startupfeedback: Add hidpi support on wayland

wilder/Plasma/6.2
Vlad Zahorodnii 2 years ago
parent 7233616c2c
commit 5696081cf7
  1. 27
      src/plugins/startupfeedback/startupfeedback.cpp
  2. 5
      src/plugins/startupfeedback/startupfeedback.h

@ -24,6 +24,7 @@
#include <KSharedConfig>
#include <KWindowSystem>
// 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;
}

@ -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;

Loading…
Cancel
Save