14#include "magnifierconfig.h"
17#include <kstandardaction.h>
22#include <KGlobalAccel>
33 , m_lastPresentTime(std::chrono::milliseconds::zero())
39 a = KStandardAction::zoomIn(
this, &MagnifierEffect::zoomIn,
this);
40 KGlobalAccel::self()->setDefaultShortcut(a, QList<QKeySequence>() << (Qt::META | Qt::Key_Plus) << (Qt::META | Qt::Key_Equal));
41 KGlobalAccel::self()->setShortcut(a, QList<QKeySequence>() << (Qt::META | Qt::Key_Plus) << (Qt::META | Qt::Key_Equal));
43 a = KStandardAction::zoomOut(
this, &MagnifierEffect::zoomOut,
this);
44 KGlobalAccel::self()->setDefaultShortcut(a, QList<QKeySequence>() << (Qt::META | Qt::Key_Minus));
45 KGlobalAccel::self()->setShortcut(a, QList<QKeySequence>() << (Qt::META | Qt::Key_Minus));
47 a = KStandardAction::actualSize(
this, &MagnifierEffect::toggle,
this);
48 KGlobalAccel::self()->setDefaultShortcut(a, QList<QKeySequence>() << (Qt::META | Qt::Key_0));
49 KGlobalAccel::self()->setShortcut(a, QList<QKeySequence>() << (Qt::META | Qt::Key_0));
56 slotWindowAdded(window);
65 MagnifierConfig::setInitialZoom(m_targetZoom);
66 MagnifierConfig::self()->save();
76 MagnifierConfig::self()->read();
78 width = MagnifierConfig::width();
79 height = MagnifierConfig::height();
80 m_magnifierSize = QSize(width, height);
82 m_targetZoom = MagnifierConfig::initialZoom();
83 if (m_targetZoom != m_zoom) {
90 const int time = m_lastPresentTime.count() ? (presentTime - m_lastPresentTime).count() : 0;
92 if (m_zoom != m_targetZoom) {
94 if (m_targetZoom > m_zoom) {
95 m_zoom = std::min(m_zoom * std::max(1 + diff, 1.2), m_targetZoom);
97 m_zoom = std::max(m_zoom * std::min(1 - diff, 0.8), m_targetZoom);
106 if (m_zoom != m_targetZoom) {
107 m_lastPresentTime = presentTime;
109 m_lastPresentTime = std::chrono::milliseconds::zero();
123 const QRect area = magnifierArea();
125 const auto scale = viewport.
scale();
127 QRectF srcArea(cursor.x() - (
double)area.width() / (m_zoom * 2),
128 cursor.y() - (
double)area.height() / (m_zoom * 2),
129 (
double)area.width() / m_zoom, (
double)area.height() / m_zoom);
131 m_fbo->blitFromRenderTarget(renderTarget, viewport, srcArea.toRect(), QRect(QPoint(), m_fbo->size()));
135 mvp.translate(area.x() * scale, area.y() * scale);
137 m_texture->render(area.size() * scale);
145 QList<QVector2D> verts;
146 verts.reserve(4 * 6 * 2);
148 verts.push_back(QVector2D(frame.right(), frame.top()));
149 verts.push_back(QVector2D(frame.left(), frame.top()));
150 verts.push_back(QVector2D(frame.left(), areaF.top()));
151 verts.push_back(QVector2D(frame.left(), areaF.top()));
152 verts.push_back(QVector2D(frame.right(), areaF.top()));
153 verts.push_back(QVector2D(frame.right(), frame.top()));
155 verts.push_back(QVector2D(areaF.left(), frame.top()));
156 verts.push_back(QVector2D(frame.left(), frame.top()));
157 verts.push_back(QVector2D(frame.left(), frame.bottom()));
158 verts.push_back(QVector2D(frame.left(), frame.bottom()));
159 verts.push_back(QVector2D(areaF.left(), frame.bottom()));
160 verts.push_back(QVector2D(areaF.left(), frame.top()));
162 verts.push_back(QVector2D(frame.right(), frame.top()));
163 verts.push_back(QVector2D(areaF.right(), frame.top()));
164 verts.push_back(QVector2D(areaF.right(), frame.bottom()));
165 verts.push_back(QVector2D(areaF.right(), frame.bottom()));
166 verts.push_back(QVector2D(frame.right(), frame.bottom()));
167 verts.push_back(QVector2D(frame.right(), frame.top()));
169 verts.push_back(QVector2D(frame.right(), areaF.bottom()));
170 verts.push_back(QVector2D(frame.left(), areaF.bottom()));
171 verts.push_back(QVector2D(frame.left(), frame.bottom()));
172 verts.push_back(QVector2D(frame.left(), frame.bottom()));
173 verts.push_back(QVector2D(frame.right(), frame.bottom()));
174 verts.push_back(QVector2D(frame.right(), areaF.bottom()));
180 vbo->
render(GL_TRIANGLES);
187 if (m_zoom != m_targetZoom) {
194QRect MagnifierEffect::magnifierArea(QPointF pos)
const
196 return QRect(pos.x() - m_magnifierSize.width() / 2, pos.y() - m_magnifierSize.height() / 2,
197 m_magnifierSize.width(), m_magnifierSize.height());
200void MagnifierEffect::zoomIn()
213 m_texture->setContentTransform(OutputTransform());
214 m_fbo = std::make_unique<GLFramebuffer>(m_texture.get());
219void MagnifierEffect::zoomOut()
222 if (m_targetZoom <= 1) {
228 if (m_zoom == m_targetZoom) {
237void MagnifierEffect::toggle()
240 if (m_targetZoom == 1.0) {
253 m_texture->setContentTransform(OutputTransform());
254 m_fbo = std::make_unique<GLFramebuffer>(m_texture.get());
266void MagnifierEffect::slotMouseChanged(
const QPointF &pos,
const QPointF &old,
267 Qt::MouseButtons, Qt::MouseButtons, Qt::KeyboardModifiers, Qt::KeyboardModifiers)
269 if (pos != old && m_zoom != 1) {
276void MagnifierEffect::slotWindowAdded(EffectWindow *w)
281void MagnifierEffect::slotWindowDamaged()
290 return m_zoom != 1.0 || m_zoom != m_targetZoom;
295 return m_magnifierSize;
305#include "moc_magnifier.cpp"
Representation of a window used by/for Effect classes.
void windowDamaged(KWin::EffectWindow *w)
void paintScreen(const RenderTarget &renderTarget, const RenderViewport &viewport, int mask, const QRegion ®ion, Output *screen)
QList< EffectWindow * > stackingOrder
Q_SCRIPTABLE void addRepaint(const QRectF &r)
bool makeOpenGLContextCurrent()
Makes the OpenGL compositing context current.
void prePaintScreen(ScreenPrePaintData &data, std::chrono::milliseconds presentTime)
bool isOpenGLCompositing() const
Whether the Compositor is OpenGL based (either GL 1 or 2).
void mouseChanged(const QPointF &pos, const QPointF &oldpos, Qt::MouseButtons buttons, Qt::MouseButtons oldbuttons, Qt::KeyboardModifiers modifiers, Qt::KeyboardModifiers oldmodifiers)
KSharedConfigPtr config() const
void windowAdded(KWin::EffectWindow *w)
Q_SCRIPTABLE void addRepaintFull()
static bool blitSupported()
@ ModelViewProjectionMatrix
bool setUniform(const char *name, float value)
static std::unique_ptr< GLTexture > allocate(GLenum internalFormat, const QSize &size, int levels=1)
static GLVertexBuffer * streamingBuffer()
void render(GLenum primitiveMode)
void setVertices(const T &range)
bool isActive() const override
void reconfigure(ReconfigureFlags) override
void prePaintScreen(ScreenPrePaintData &data, std::chrono::milliseconds presentTime) override
void postPaintScreen() override
void paintScreen(const RenderTarget &renderTarget, const RenderViewport &viewport, int mask, const QRegion ®ion, Output *screen) override
~MagnifierEffect() override
QMatrix4x4 projectionMatrix() const
static ShaderManager * instance()
GLShader * pushShader(ShaderTraits traits)
static QPointF cursorPos()
static double animationTime(const KConfigGroup &cfg, const QString &key, int defaultTime)
KWIN_EXPORT QRectF scaledRect(const QRectF &rect, qreal scale)