KWin
Loading...
Searching...
No Matches
effecthandler.h
Go to the documentation of this file.
1/*
2 KWin - the KDE window manager
3 This file is part of the KDE project.
4
5 SPDX-FileCopyrightText: 2006 Lubos Lunak <l.lunak@kde.org>
6 SPDX-FileCopyrightText: 2009 Lucas Murray <lmurray@undefinedfire.com>
7 SPDX-FileCopyrightText: 2010, 2011 Martin Gräßlin <mgraesslin@kde.org>
8 SPDX-FileCopyrightText: 2018 Vlad Zahorodnii <vlad.zahorodnii@kde.org>
9
10 SPDX-License-Identifier: GPL-2.0-or-later
11*/
12
13#pragma once
14
15#include "effect/effect.h"
16#include "effect/effectwindow.h"
17
18#include <QEasingCurve>
19#include <QIcon>
20#include <QPair>
21#include <QRect>
22#include <QRegion>
23#include <QSet>
24
25#include <QHash>
26#include <QList>
27#include <QLoggingCategory>
28#include <QStack>
29
30#include <netwm.h>
31
32#include <functional>
33
34class KConfigGroup;
35class QFont;
36class QKeyEvent;
37class QMatrix4x4;
38class QMouseEvent;
39class QWheelEvent;
40class QAction;
41class QTabletEvent;
42class QQmlEngine;
43
48Q_DECLARE_LOGGING_CATEGORY(KWINEFFECTS)
49
50namespace KDecoration2
51{
52class Decoration;
53}
54
55namespace KWin
56{
57
58class SurfaceInterface;
59class Display;
60class PaintDataPrivate;
61class WindowPaintDataPrivate;
62
63class Compositor;
64class EffectLoader;
65class EffectWindow;
66class EffectWindowGroup;
67class OffscreenQuickView;
68class Group;
69class Output;
70class Effect;
71class TabletEvent;
72class TabletPadId;
73class TabletToolId;
74class Window;
75class WindowItem;
76class WindowPropertyNotifyX11Filter;
77class WorkspaceScene;
78class VirtualDesktop;
79
80typedef QPair<QString, Effect *> EffectPair;
81
87 // Grab roles are used to force all other animations to ignore the window.
88 // The value of the data is set to the Effect's `this` value.
95};
96
107class KWIN_EXPORT EffectsHandler : public QObject
108{
109 Q_OBJECT
110 Q_CLASSINFO("D-Bus Interface", "org.kde.kwin.Effects")
111
112 Q_PROPERTY(QStringList activeEffects READ activeEffects)
113 Q_PROPERTY(QStringList loadedEffects READ loadedEffects)
114 Q_PROPERTY(QStringList listOfEffects READ listOfEffects)
115
116 Q_PROPERTY(KWin::VirtualDesktop *currentDesktop READ currentDesktop WRITE setCurrentDesktop NOTIFY desktopChanged)
117 Q_PROPERTY(QString currentActivity READ currentActivity NOTIFY currentActivityChanged)
118 Q_PROPERTY(KWin::EffectWindow *activeWindow READ activeWindow WRITE activateWindow NOTIFY windowActivated)
119 Q_PROPERTY(QSize desktopGridSize READ desktopGridSize NOTIFY desktopGridSizeChanged)
120 Q_PROPERTY(int desktopGridWidth READ desktopGridWidth NOTIFY desktopGridWidthChanged)
121 Q_PROPERTY(int desktopGridHeight READ desktopGridHeight NOTIFY desktopGridHeightChanged)
122 Q_PROPERTY(int workspaceWidth READ workspaceWidth)
123 Q_PROPERTY(int workspaceHeight READ workspaceHeight)
124 Q_PROPERTY(QList<KWin::VirtualDesktop *> desktops READ desktops)
125 Q_PROPERTY(bool optionRollOverDesktops READ optionRollOverDesktops)
126 Q_PROPERTY(KWin::Output *activeScreen READ activeScreen)
134 Q_PROPERTY(qreal animationTimeFactor READ animationTimeFactor)
135 Q_PROPERTY(QList<EffectWindow *> stackingOrder READ stackingOrder)
139 Q_PROPERTY(bool decorationsHaveAlpha READ decorationsHaveAlpha)
140 Q_PROPERTY(CompositingType compositingType READ compositingType CONSTANT)
141 Q_PROPERTY(QPointF cursorPos READ cursorPos)
142 Q_PROPERTY(QSize virtualScreenSize READ virtualScreenSize NOTIFY virtualScreenSizeChanged)
143 Q_PROPERTY(QRect virtualScreenGeometry READ virtualScreenGeometry NOTIFY virtualScreenGeometryChanged)
144 Q_PROPERTY(bool hasActiveFullScreenEffect READ hasActiveFullScreenEffect NOTIFY hasActiveFullScreenEffectChanged)
145
150 Q_PROPERTY(KWin::SessionState sessionState READ sessionState NOTIFY sessionStateChanged)
151
152 Q_PROPERTY(KWin::EffectWindow *inputPanel READ inputPanel NOTIFY inputPanelChanged)
153
154 friend class Effect;
155
156public:
157 using TouchBorderCallback = std::function<void(ElectricBorder border, const QPointF &, Output *screen)>;
158
159 EffectsHandler(Compositor *compositor, WorkspaceScene *scene);
160 ~EffectsHandler() override;
161
162 // internal (used by kwin core or compositing code)
163 void startPaint();
164
165 // for use by effects
166 void prePaintScreen(ScreenPrePaintData &data, std::chrono::milliseconds presentTime);
167 void paintScreen(const RenderTarget &renderTarget, const RenderViewport &viewport, int mask, const QRegion &region, Output *screen);
168 void postPaintScreen();
169 void prePaintWindow(EffectWindow *w, WindowPrePaintData &data, std::chrono::milliseconds presentTime);
170 void paintWindow(const RenderTarget &renderTarget, const RenderViewport &viewport, EffectWindow *w, int mask, const QRegion &region, WindowPaintData &data);
171 void postPaintWindow(EffectWindow *w);
172 void drawWindow(const RenderTarget &renderTarget, const RenderViewport &viewport, EffectWindow *w, int mask, const QRegion &region, WindowPaintData &data);
173 void renderWindow(const RenderTarget &renderTarget, const RenderViewport &viewport, EffectWindow *w, int mask, const QRegion &region, WindowPaintData &data);
174 QVariant kwinOption(KWinOption kwopt);
180 virtual void defineCursor(Qt::CursorShape shape);
181 QPointF cursorPos() const;
182 bool grabKeyboard(Effect *effect);
183 void ungrabKeyboard();
198 void startMouseInterception(Effect *effect, Qt::CursorShape shape);
204 void stopMouseInterception(Effect *effect);
205 bool isMouseInterception() const;
206
207 bool checkInputWindowEvent(QMouseEvent *e);
208 bool checkInputWindowEvent(QWheelEvent *e);
209 void checkInputWindowStacking();
210
211 void grabbedKeyboardEvent(QKeyEvent *e);
212 bool hasKeyboardGrab() const;
213
221 void registerPointerShortcut(Qt::KeyboardModifiers modifiers, Qt::MouseButton pointerButtons, QAction *action);
229 void registerAxisShortcut(Qt::KeyboardModifiers modifiers, PointerAxisDirection axis, QAction *action);
230
238 void registerTouchpadSwipeShortcut(SwipeDirection dir, uint fingerCount, QAction *onUp, std::function<void(qreal)> progressCallback = {});
239
240 void registerTouchpadPinchShortcut(PinchDirection dir, uint fingerCount, QAction *onUp, std::function<void(qreal)> progressCallback = {});
241
249 void registerTouchscreenSwipeShortcut(SwipeDirection direction, uint fingerCount, QAction *action, std::function<void(qreal)> progressCallback);
250
251 // Mouse polling
252 void startMousePolling();
253 void stopMousePolling();
254
255 void reserveElectricBorder(ElectricBorder border, Effect *effect);
256 void unreserveElectricBorder(ElectricBorder border, Effect *effect);
257
271 void registerTouchBorder(ElectricBorder border, QAction *action);
272
289 void registerRealtimeTouchBorder(ElectricBorder border, QAction *action, TouchBorderCallback progressCallback);
290
297 void unregisterTouchBorder(ElectricBorder border, QAction *action);
298
299 // functions that allow controlling windows/desktop
300 void activateWindow(KWin::EffectWindow *c);
301 KWin::EffectWindow *activeWindow() const;
302 Q_SCRIPTABLE void moveWindow(KWin::EffectWindow *w, const QPoint &pos, bool snap = false, double snapAdjust = 1.0);
303
309 Q_SCRIPTABLE void windowToDesktops(KWin::EffectWindow *w, const QList<KWin::VirtualDesktop *> &desktops);
310
311 Q_SCRIPTABLE void windowToScreen(KWin::EffectWindow *w, Output *screen);
312 void setShowingDesktop(bool showing);
313
314 // Activities
318 QString currentActivity() const;
319 // Desktops
323 VirtualDesktop *currentDesktop() const;
327 QList<VirtualDesktop *> desktops() const;
331 void setCurrentDesktop(KWin::VirtualDesktop *desktop);
335 QSize desktopGridSize() const;
339 int desktopGridWidth() const;
343 int desktopGridHeight() const;
347 int workspaceWidth() const;
351 int workspaceHeight() const;
356 VirtualDesktop *desktopAtCoords(QPoint coords) const;
360 QPoint desktopGridCoords(VirtualDesktop *desktop) const;
364 QPoint desktopCoords(VirtualDesktop *desktop) const;
369 Q_SCRIPTABLE KWin::VirtualDesktop *desktopAbove(KWin::VirtualDesktop *desktop = nullptr, bool wrap = true) const;
374 Q_SCRIPTABLE KWin::VirtualDesktop *desktopToRight(KWin::VirtualDesktop *desktop = nullptr, bool wrap = true) const;
379 Q_SCRIPTABLE KWin::VirtualDesktop *desktopBelow(KWin::VirtualDesktop *desktop = nullptr, bool wrap = true) const;
384 Q_SCRIPTABLE KWin::VirtualDesktop *desktopToLeft(KWin::VirtualDesktop *desktop = nullptr, bool wrap = true) const;
385 Q_SCRIPTABLE QString desktopName(KWin::VirtualDesktop *desktop) const;
386 bool optionRollOverDesktops() const;
387
388 Output *activeScreen() const; // Xinerama
389 QRectF clientArea(clientAreaOption, const Output *screen, const VirtualDesktop *desktop) const;
390 QRectF clientArea(clientAreaOption, const EffectWindow *c) const;
391 QRectF clientArea(clientAreaOption, const QPoint &p, const VirtualDesktop *desktop) const;
392
401 QSize virtualScreenSize() const;
410 QRect virtualScreenGeometry() const;
418 double animationTimeFactor() const;
419
420 Q_SCRIPTABLE KWin::EffectWindow *findWindow(WId id) const;
421 Q_SCRIPTABLE KWin::EffectWindow *findWindow(SurfaceInterface *surf) const;
431 Q_SCRIPTABLE KWin::EffectWindow *findWindow(QWindow *w) const;
438 Q_SCRIPTABLE KWin::EffectWindow *findWindow(const QUuid &id) const;
439 QList<EffectWindow *> stackingOrder() const;
440 // window will be temporarily painted as if being at the top of the stack
441 Q_SCRIPTABLE void setElevatedWindow(KWin::EffectWindow *w, bool set);
442
443 void setTabBoxWindow(EffectWindow *);
444 QList<EffectWindow *> currentTabBoxWindowList() const;
445 void refTabBox();
446 void unrefTabBox();
447 void closeTabBox();
448 EffectWindow *currentTabBoxWindow() const;
449
450 void setActiveFullScreenEffect(Effect *e);
451 Effect *activeFullScreenEffect() const;
452
458 Q_SCRIPTABLE void addRepaintFull();
459 Q_SCRIPTABLE void addRepaint(const QRectF &r);
460 Q_SCRIPTABLE void addRepaint(const QRect &r);
461 Q_SCRIPTABLE void addRepaint(const QRegion &r);
462 Q_SCRIPTABLE void addRepaint(int x, int y, int w, int h);
463
464 CompositingType compositingType() const;
470 bool isOpenGLCompositing() const;
479 QPainter *scenePainter();
480 void reconfigure();
481
482 QByteArray readRootProperty(long atom, long type, int format) const;
500 xcb_atom_t announceSupportProperty(const QByteArray &propertyName, Effect *effect);
513 void removeSupportProperty(const QByteArray &propertyName, Effect *effect);
514
518 bool hasDecorationShadows() const;
519
524 bool decorationsHaveAlpha() const;
525
534 void reloadEffect(Effect *effect);
535 Effect *provides(Effect::Feature ef);
536 Effect *findEffect(const QString &name) const;
537 QStringList loadedEffects() const;
538 QStringList listOfEffects() const;
539 void unloadAllEffects();
540 QStringList activeEffects() const;
541 bool isEffectActive(const QString &pluginId) const;
542
553 bool isScreenLocked() const;
554
562 bool makeOpenGLContextCurrent();
571 void doneOpenGLContextCurrent();
572
573 xcb_connection_t *xcbConnection() const;
574 xcb_window_t x11RootWindow() const;
575
581 Display *waylandDisplay() const;
582
591 bool animationsSupported() const;
592
598 PlatformCursorImage cursorImage() const;
599
605 void hideCursor();
606
612 void showCursor();
613
617 bool isCursorHidden() const;
618
631 void startInteractiveWindowSelection(std::function<void(KWin::EffectWindow *)> callback);
632
646 void startInteractivePositionSelection(std::function<void(const QPointF &)> callback);
647
656 void showOnScreenMessage(const QString &message, const QString &iconName = QString());
657
668 SkipsCloseAnimation = 1
669 };
670 Q_DECLARE_FLAGS(OnScreenMessageHideFlags, OnScreenMessageHideFlag)
677 void hideOnScreenMessage(OnScreenMessageHideFlags flags = OnScreenMessageHideFlags());
678
679 /*
680 * @returns The configuration used by the EffectsHandler.
681 * @since 5.10
682 */
683 KSharedConfigPtr config() const;
684
689 KSharedConfigPtr inputConfig() const;
690
694 bool hasActiveFullScreenEffect() const;
695
701 void renderOffscreenQuickView(const RenderTarget &renderTarget, const RenderViewport &viewport, OffscreenQuickView *effectQuickView) const;
702
707 SessionState sessionState() const;
708
712 QList<Output *> screens() const;
713 Output *screenAt(const QPoint &point) const;
714 Output *findScreen(const QString &name) const;
715 Output *findScreen(int screenId) const;
716
717 KWin::EffectWindow *inputPanel() const;
718 bool isInputPanelOverlay() const;
719
720 QQmlEngine *qmlEngine() const;
721
725 bool blocksDirectScanout() const;
726
728 {
729 return m_scene;
730 }
731
732 bool touchDown(qint32 id, const QPointF &pos, std::chrono::microseconds time);
733 bool touchMotion(qint32 id, const QPointF &pos, std::chrono::microseconds time);
734 bool touchUp(qint32 id, std::chrono::microseconds time);
735
736 bool tabletToolEvent(KWin::TabletEvent *event);
737 bool tabletToolButtonEvent(uint button, bool pressed, const KWin::TabletToolId &tabletToolId, std::chrono::microseconds time);
738 bool tabletPadButtonEvent(uint button, bool pressed, const KWin::TabletPadId &tabletPadId, std::chrono::microseconds time);
739 bool tabletPadStripEvent(int number, int position, bool isFinger, const KWin::TabletPadId &tabletPadId, std::chrono::microseconds time);
740 bool tabletPadRingEvent(int number, int position, bool isFinger, const KWin::TabletPadId &tabletPadId, std::chrono::microseconds time);
741
742 void highlightWindows(const QList<EffectWindow *> &windows);
743
744 bool isPropertyTypeRegistered(xcb_atom_t atom) const
745 {
746 return registered_atoms.contains(atom);
747 }
748
749Q_SIGNALS:
766
774 void desktopChanging(KWin::VirtualDesktop *currentDesktop, QPointF offset, KWin::EffectWindow *with);
778
784 void desktopGridSizeChanged(const QSize &size);
790 void desktopGridWidthChanged(int width);
796 void desktopGridHeightChanged(int height);
847 void tabBoxAdded(int mode);
875 void tabBoxKeyEvent(QKeyEvent *event);
889 void mouseChanged(const QPointF &pos, const QPointF &oldpos,
890 Qt::MouseButtons buttons, Qt::MouseButtons oldbuttons,
891 Qt::KeyboardModifiers modifiers, Qt::KeyboardModifiers oldmodifiers);
909
916 void currentActivityChanged(const QString &id);
922 void activityAdded(const QString &id);
929 void activityRemoved(const QString &id);
935 void screenLockingChanged(bool locked);
936
943
961 void screenEdgeApproaching(ElectricBorder border, qreal factor, const QRect &geometry);
974
989
1001
1010
1020
1026
1027 void startupAdded(const QString &id, const QIcon &icon);
1028 void startupChanged(const QString &id, const QIcon &icon);
1029 void startupRemoved(const QString &id);
1030
1032
1033public Q_SLOTS:
1034 // slots for D-Bus interface
1035 Q_SCRIPTABLE void reconfigureEffect(const QString &name);
1036 Q_SCRIPTABLE bool loadEffect(const QString &name);
1037 Q_SCRIPTABLE void toggleEffect(const QString &name);
1038 Q_SCRIPTABLE void unloadEffect(const QString &name);
1039 Q_SCRIPTABLE bool isEffectLoaded(const QString &name) const;
1040 Q_SCRIPTABLE bool isEffectSupported(const QString &name);
1041 Q_SCRIPTABLE QList<bool> areEffectsSupported(const QStringList &names);
1042 Q_SCRIPTABLE QString supportInformation(const QString &name) const;
1043 Q_SCRIPTABLE QString debug(const QString &name, const QString &parameter = QString()) const;
1044
1045protected:
1046 void connectNotify(const QMetaMethod &signal) override;
1047 void disconnectNotify(const QMetaMethod &signal) override;
1048 void effectsChanged();
1049 void setupWindowConnections(KWin::Window *window);
1050
1054 virtual bool doGrabKeyboard();
1058 virtual void doUngrabKeyboard();
1059
1063 virtual void doStartMouseInterception(Qt::CursorShape shape);
1064
1068 virtual void doStopMouseInterception();
1069
1073 virtual void doCheckInputWindowStacking();
1074
1075 void registerPropertyType(long atom, bool reg);
1076 void destroyEffect(Effect *effect);
1077 void reconfigureEffects();
1078
1079 typedef QList<Effect *> EffectsList;
1080 typedef EffectsList::const_iterator EffectsIterator;
1081
1084 QMultiMap<int, EffectPair> effect_order;
1085 QHash<long, int> registered_atoms;
1086 QList<EffectPair> loaded_effects;
1092 typedef QHash<QByteArray, QList<Effect *>> PropertyEffectMap;
1094 QHash<QByteArray, qulonglong> m_managedProperties;
1097 QList<Effect *> m_grabbedMouseEffects;
1100 std::unique_ptr<WindowPropertyNotifyX11Filter> m_x11WindowPropertyNotify;
1101};
1102
1106extern KWIN_EXPORT EffectsHandler *effects;
1107
1108} // namespace
1109
Wrapper round Qt::CursorShape with extensions enums into a single entity.
Definition cursor.h:50
Base class for all KWin effects.
Definition effect.h:535
Representation of a window used by/for Effect classes.
Manager class that handles all the effects.
void showingDesktopChanged(bool)
std::unique_ptr< WindowPropertyNotifyX11Filter > m_x11WindowPropertyNotify
void screenAdded(KWin::Output *screen)
void desktopGridSizeChanged(const QSize &size)
EffectsIterator m_currentPaintWindowIterator
void propertyNotify(KWin::EffectWindow *w, long atom)
void screenLockingChanged(bool locked)
void windowDeleted(KWin::EffectWindow *w)
CompositingType compositing_type
void startupRemoved(const QString &id)
EffectsList::const_iterator EffectsIterator
QHash< QByteArray, QList< Effect * > > PropertyEffectMap
void windowClosed(KWin::EffectWindow *w)
void currentActivityChanged(const QString &id)
void screenRemoved(KWin::Output *screen)
void desktopChanging(KWin::VirtualDesktop *currentDesktop, QPointF offset, KWin::EffectWindow *with)
QList< Effect * > m_grabbedMouseEffects
void startupAdded(const QString &id, const QIcon &icon)
EffectsIterator m_currentPaintScreenIterator
void windowActivated(KWin::EffectWindow *w)
EffectLoader * m_effectLoader
Compositor * m_compositor
PropertyEffectMap m_propertiesForEffects
QHash< long, int > registered_atoms
void tabBoxKeyEvent(QKeyEvent *event)
void desktopRemoved(KWin::VirtualDesktop *desktop)
void desktopAdded(KWin::VirtualDesktop *desktop)
void virtualScreenGeometryChanged()
QHash< QByteArray, qulonglong > m_managedProperties
QList< EffectPair > loaded_effects
EffectsIterator m_currentDrawWindowIterator
EffectsList m_activeEffects
void desktopGridWidthChanged(int width)
QList< Effect * > EffectsList
WorkspaceScene * m_scene
void activityRemoved(const QString &id)
QMultiMap< int, EffectPair > effect_order
void desktopChanged(KWin::VirtualDesktop *oldDesktop, KWin::VirtualDesktop *newDesktop, KWin::EffectWindow *with)
void screenEdgeApproaching(ElectricBorder border, qreal factor, const QRect &geometry)
void desktopGridHeightChanged(int height)
void mouseChanged(const QPointF &pos, const QPointF &oldpos, Qt::MouseButtons buttons, Qt::MouseButtons oldbuttons, Qt::KeyboardModifiers modifiers, Qt::KeyboardModifiers oldmodifiers)
std::function< void(ElectricBorder border, const QPointF &, Output *screen)> TouchBorderCallback
void desktopChangingCancelled()
void hasActiveFullScreenEffectChanged()
WorkspaceScene * scene() const
bool isPropertyTypeRegistered(xcb_atom_t atom) const
void startupChanged(const QString &id, const QIcon &icon)
void windowAdded(KWin::EffectWindow *w)
void windowDataChanged(KWin::EffectWindow *w, int role)
void activeFullScreenEffectChanged()
void activityAdded(const QString &id)
void tabBoxAdded(int mode)
void virtualScreenSizeChanged()
The KwinQuickView class provides a convenient API for exporting QtQuick scenes as buffers that can be...
PointerAxisDirection
The direction in which a pointer axis is moved.
Definition globals.h:104
@ WindowAddedGrabRole
@ WindowForceBackgroundContrastRole
For fullscreen effects to enforce the background contrast,.
@ WindowClosedGrabRole
@ WindowForceBlurRole
For fullscreen effects to enforce blurring of windows,.
@ WindowUnminimizedGrabRole
@ WindowMinimizedGrabRole
SessionState
Definition globals.h:132
KWinOption
Definition globals.h:95
ElectricBorder
Definition globals.h:60
PinchDirection
Definition globals.h:123
CompositingType
Definition globals.h:28
SwipeDirection
Directions for swipe gestures.
Definition globals.h:115
QPair< QString, Effect * > EffectPair
EffectsHandler * effects
struct _XDisplay Display