KWin
Loading...
Searching...
No Matches
effect.h
Go to the documentation of this file.
1/*
2 SPDX-FileCopyrightText: 2006 Lubos Lunak <l.lunak@kde.org>
3 SPDX-FileCopyrightText: 2009 Lucas Murray <lmurray@undefinedfire.com>
4 SPDX-FileCopyrightText: 2010, 2011 Martin Gräßlin <mgraesslin@kde.org>
5 SPDX-FileCopyrightText: 2018 Vlad Zahorodnii <vlad.zahorodnii@kde.org>
6
7 SPDX-License-Identifier: GPL-2.0-or-later
8*/
9
10#pragma once
11
12#include "effect/globals.h"
13
14#include <QRegion>
15
16#include <KPluginFactory>
17#include <KSharedConfig>
18
19class QKeyEvent;
20class QTabletEvent;
21
22namespace KWin
23{
24
25class EffectWindow;
26class Output;
27class PaintDataPrivate;
28class RenderTarget;
29class RenderViewport;
30class WindowPaintDataPrivate;
31
100#define KWIN_EFFECT_API_MAKE_VERSION(major, minor) ((major) << 8 | (minor))
101#define KWIN_EFFECT_API_VERSION_MAJOR 0
102#define KWIN_EFFECT_API_VERSION_MINOR 236
103#define KWIN_EFFECT_API_VERSION KWIN_EFFECT_API_MAKE_VERSION( \
104 KWIN_EFFECT_API_VERSION_MAJOR, KWIN_EFFECT_API_VERSION_MINOR)
105
106class KWIN_EXPORT PaintData
107{
108public:
109 virtual ~PaintData();
114 qreal xScale() const;
119 qreal yScale() const;
124 qreal zScale() const;
130 void setXScale(qreal scale);
136 void setYScale(qreal scale);
142 void setZScale(qreal scale);
148 void setScale(const QVector2D &scale);
154 void setScale(const QVector3D &scale);
155 const QVector3D &scale() const;
156 const QVector3D &translation() const;
161 qreal xTranslation() const;
166 qreal yTranslation() const;
171 qreal zTranslation() const;
176 void setXTranslation(qreal translate);
181 void setYTranslation(qreal translate);
186 void setZTranslation(qreal translate);
194 void translate(qreal x, qreal y = 0.0, qreal z = 0.0);
201 void translate(const QVector3D &translate);
202
209 void setRotationAngle(qreal angle);
217 qreal rotationAngle() const;
224 void setRotationOrigin(const QVector3D &origin);
232 QVector3D rotationOrigin() const;
241 void setRotationAxis(const QVector3D &axis);
249 void setRotationAxis(Qt::Axis axis);
257 QVector3D rotationAxis() const;
258
265 QMatrix4x4 toMatrix(qreal deviceScale) const;
266
267protected:
268 PaintData();
269 PaintData(const PaintData &other);
270
271private:
272 const std::unique_ptr<PaintDataPrivate> d;
273};
274
275class KWIN_EXPORT WindowPrePaintData
276{
277public:
278 int mask;
282 QRegion paint;
287 QRegion opaque;
292 void setTranslucent();
296 void setTransformed();
297};
298
299class KWIN_EXPORT WindowPaintData : public PaintData
300{
301public:
303 explicit WindowPaintData(const QMatrix4x4 &projectionMatrix);
304 WindowPaintData(const WindowPaintData &other);
311 WindowPaintData &operator*=(qreal scale);
317 WindowPaintData &operator*=(const QVector2D &scale);
323 WindowPaintData &operator*=(const QVector3D &scale);
328 WindowPaintData &operator+=(const QPointF &translation);
334 WindowPaintData &operator+=(const QPoint &translation);
340 WindowPaintData &operator+=(const QVector2D &translation);
346 WindowPaintData &operator+=(const QVector3D &translation);
352 qreal opacity() const;
359 void setOpacity(qreal opacity);
366 qreal multiplyOpacity(qreal factor);
378 qreal saturation() const;
385 void setSaturation(qreal saturation) const;
392 qreal multiplySaturation(qreal factor);
398 qreal brightness() const;
404 void setBrightness(qreal brightness);
411 qreal multiplyBrightness(qreal factor);
418 int screen() const;
423 void setScreen(int screen) const;
434 void setCrossFadeProgress(qreal factor);
438 qreal crossFadeProgress() const;
439
445 void setProjectionMatrix(const QMatrix4x4 &matrix);
446
450 QMatrix4x4 projectionMatrix() const;
451
455 QMatrix4x4 &rprojectionMatrix();
456
457private:
458 const std::unique_ptr<WindowPaintDataPrivate> d;
459};
460
461class KWIN_EXPORT ScreenPrePaintData
462{
463public:
464 int mask;
465 QRegion paint;
466 Output *screen = nullptr;
467};
468
534class KWIN_EXPORT Effect : public QObject
535{
536 Q_OBJECT
537public:
539 // TODO: is that ok here?
540 enum {
544 PAINT_WINDOW_OPAQUE = 1 << 0,
548 PAINT_WINDOW_TRANSLUCENT = 1 << 1,
552 PAINT_WINDOW_TRANSFORMED = 1 << 2,
557 PAINT_SCREEN_REGION = 1 << 3,
562 PAINT_SCREEN_TRANSFORMED = 1 << 4,
567 PAINT_SCREEN_WITH_TRANSFORMED_WINDOWS = 1 << 5,
571 PAINT_SCREEN_BACKGROUND_FIRST = 1 << 6,
572 };
573
574 enum Feature {
575 Nothing = 0,
579 HighlightWindows
580 };
581
588 Effect(QObject *parent = nullptr);
595 ~Effect() override;
596
601 ReconfigureAll = 1 << 0
602 };
603 Q_DECLARE_FLAGS(ReconfigureFlags, ReconfigureFlag)
604
605
612 virtual void reconfigure(ReconfigureFlags flags);
613
625 virtual void prePaintScreen(ScreenPrePaintData &data,
626 std::chrono::milliseconds presentTime);
637 virtual void paintScreen(const RenderTarget &renderTarget, const RenderViewport &viewport, int mask, const QRegion &region, Output *screen);
647 virtual void postPaintScreen();
648
663 virtual void prePaintWindow(EffectWindow *w, WindowPrePaintData &data,
664 std::chrono::milliseconds presentTime);
675 virtual void paintWindow(const RenderTarget &renderTarget, const RenderViewport &viewport, EffectWindow *w, int mask, QRegion region, WindowPaintData &data);
685 virtual void postPaintWindow(EffectWindow *w);
686
691 virtual bool provides(Feature);
692
704 virtual bool perform(Feature feature, const QVariantList &arguments);
705
714 virtual void drawWindow(const RenderTarget &renderTarget, const RenderViewport &viewport, EffectWindow *w, int mask, const QRegion &region, WindowPaintData &data);
715
716 virtual void windowInputMouseEvent(QEvent *e);
717 virtual void grabbedKeyboardEvent(QKeyEvent *e);
718
734 virtual bool isActive() const;
735
747 virtual QString debug(const QString &parameter) const;
748
761 virtual int requestedEffectChainPosition() const;
762
782 virtual bool touchDown(qint32 id, const QPointF &pos, std::chrono::microseconds time);
802 virtual bool touchMotion(qint32 id, const QPointF &pos, std::chrono::microseconds time);
821 virtual bool touchUp(qint32 id, std::chrono::microseconds time);
822
833 virtual bool tabletToolEvent(QTabletEvent *event);
834
844 virtual bool tabletToolButtonEvent(uint button, bool pressed, quint64 tabletToolId);
845
855 virtual bool tabletPadButtonEvent(uint button, bool pressed, void *tabletPadId);
856
867 virtual bool tabletPadStripEvent(int number, int position, bool isFinger, void *tabletPadId);
868
879 virtual bool tabletPadRingEvent(int number, int position, bool isFinger, void *tabletPadId);
880
881 static QPointF cursorPos();
882
892 // return type is intentionally double so that one can divide using it without losing data
893 static double animationTime(const KConfigGroup &cfg, const QString &key, int defaultTime);
898 static double animationTime(int defaultTime);
903 template<typename T>
904 int animationTime(int defaultDuration);
910 static double interpolate(double x, double y, double a)
911 {
912 return x * (1 - a) + y * a;
913 }
917 static void setPositionTransformations(WindowPaintData &data, QRect &region, EffectWindow *w,
918 const QRect &r, Qt::AspectRatioMode aspect);
919
923 virtual bool blocksDirectScanout() const;
924
925public Q_SLOTS:
926 virtual bool borderActivated(ElectricBorder border);
927};
928
929template<typename T>
930int Effect::animationTime(int defaultDuration)
931{
932 return animationTime(T::duration() != 0 ? T::duration() : defaultDuration);
933}
934
938class KWIN_EXPORT EffectPluginFactory : public KPluginFactory
939{
940 Q_OBJECT
941public:
943 ~EffectPluginFactory() override;
953 virtual bool isSupported() const;
967 virtual bool enabledByDefault() const;
971 virtual KWin::Effect *createEffect() const = 0;
972};
973
974#define EffectPluginFactory_iid "org.kde.kwin.EffectPluginFactory" KWIN_PLUGIN_VERSION_STRING
975#define KWIN_PLUGIN_FACTORY_NAME KPLUGINFACTORY_PLUGIN_CLASS_INTERNAL_NAME
976
993#define KWIN_EFFECT_FACTORY_SUPPORTED_ENABLED(className, jsonFile, supported, enabled) \
994 class KWIN_PLUGIN_FACTORY_NAME : public KWin::EffectPluginFactory \
995 { \
996 Q_OBJECT \
997 Q_PLUGIN_METADATA(IID EffectPluginFactory_iid FILE jsonFile) \
998 Q_INTERFACES(KPluginFactory) \
999 public: \
1000 explicit KWIN_PLUGIN_FACTORY_NAME() \
1001 { \
1002 } \
1003 ~KWIN_PLUGIN_FACTORY_NAME() \
1004 { \
1005 } \
1006 bool isSupported() const override \
1007 { \
1008 supported \
1009 } \
1010 bool enabledByDefault() const override{ \
1011 enabled} KWin::Effect *createEffect() const override \
1012 { \
1013 return new className(); \
1014 } \
1015 };
1016
1017#define KWIN_EFFECT_FACTORY_ENABLED(className, jsonFile, enabled) \
1018 KWIN_EFFECT_FACTORY_SUPPORTED_ENABLED(className, jsonFile, return true;, enabled)
1019
1020#define KWIN_EFFECT_FACTORY_SUPPORTED(className, jsonFile, supported) \
1021 KWIN_EFFECT_FACTORY_SUPPORTED_ENABLED(className, jsonFile, supported, return true;)
1022
1023#define KWIN_EFFECT_FACTORY(className, jsonFile) \
1024 KWIN_EFFECT_FACTORY_SUPPORTED_ENABLED(className, jsonFile, return true;, return true;)
1025
1026} // namespace KWin
Base class for all KWin effects.
Definition effect.h:535
Representation of a window used by/for Effect classes.
virtual ~PaintData()
static double interpolate(double x, double y, double a)
Definition effect.h:910
static double animationTime(const KConfigGroup &cfg, const QString &key, int defaultTime)
Definition effect.cpp:483
PaintData(const PaintData &other)
~WindowPaintData() override
virtual KWin::Effect * createEffect() const =0
@ ScreenInversion
Definition effect.h:576
ElectricBorder
Definition globals.h:60