breezy-desktop/kwin/src/breezydesktopeffect.h

219 lines
9.6 KiB
C++

#pragma once
#include "kcm/shortcuts.h"
#include <effect/quickeffect.h>
#include <QAction>
#include <QFileSystemWatcher>
#include <QImage>
#include <QKeySequence>
#include <QQuaternion>
#include <QVariant>
#include <QVariantList>
#include <QHash>
#include <QRect>
#include <atomic>
class QTimer;
namespace KWin
{
class BreezyDesktopEffect : public QuickSceneEffect
{
Q_OBJECT
Q_PROPERTY(bool isEnabled READ isEnabled NOTIFY enabledStateChanged)
Q_PROPERTY(int effectTargetScreenIndex READ effectTargetScreenIndex WRITE setEffectTargetScreenIndex)
Q_PROPERTY(bool zoomOnFocusEnabled READ isZoomOnFocusEnabled WRITE setZoomOnFocusEnabled NOTIFY zoomOnFocusChanged)
Q_PROPERTY(int lookingAtScreenIndex READ lookingAtScreenIndex WRITE setLookingAtScreenIndex)
Q_PROPERTY(bool poseResetState READ poseResetState NOTIFY poseResetStateChanged)
Q_PROPERTY(QList<QQuaternion> poseOrientations READ poseOrientations)
Q_PROPERTY(QVector3D posePosition READ posePosition)
Q_PROPERTY(quint32 poseTimeElapsedMs READ poseTimeElapsedMs)
Q_PROPERTY(quint64 poseTimestamp READ poseTimestamp)
Q_PROPERTY(QString cursorImageSource READ cursorImageSource NOTIFY cursorImageSourceChanged)
Q_PROPERTY(QSize cursorImageSize READ cursorImageSize NOTIFY cursorImageSourceChanged)
Q_PROPERTY(QPointF cursorPos READ cursorPos NOTIFY cursorPosChanged)
Q_PROPERTY(QList<qreal> lookAheadConfig READ lookAheadConfig NOTIFY devicePropertiesChanged)
Q_PROPERTY(qreal lookAheadOverride READ lookAheadOverride WRITE setLookAheadOverride NOTIFY devicePropertiesChanged)
Q_PROPERTY(QList<quint32> displayResolution READ displayResolution NOTIFY devicePropertiesChanged)
Q_PROPERTY(qreal focusedDisplayDistance READ focusedDisplayDistance NOTIFY focusedDisplayDistanceChanged)
Q_PROPERTY(qreal allDisplaysDistance READ allDisplaysDistance NOTIFY allDisplaysDistanceChanged)
Q_PROPERTY(qreal displaySpacing READ displaySpacing NOTIFY displaySpacingChanged)
Q_PROPERTY(qreal displayHorizontalOffset READ displayHorizontalOffset NOTIFY displayOffsetChanged)
Q_PROPERTY(qreal displayVerticalOffset READ displayVerticalOffset NOTIFY displayOffsetChanged)
Q_PROPERTY(int displayWrappingScheme READ displayWrappingScheme NOTIFY displayWrappingSchemeChanged)
Q_PROPERTY(qreal diagonalFOV READ diagonalFOV NOTIFY devicePropertiesChanged)
Q_PROPERTY(qreal lensDistanceRatio READ lensDistanceRatio NOTIFY devicePropertiesChanged)
Q_PROPERTY(bool sbsEnabled READ sbsEnabled NOTIFY sbsEnabledChanged)
Q_PROPERTY(bool smoothFollowEnabled READ smoothFollowEnabled NOTIFY smoothFollowEnabledChanged)
Q_PROPERTY(QList<QQuaternion> smoothFollowOrigin READ smoothFollowOrigin)
Q_PROPERTY(bool customBannerEnabled READ customBannerEnabled NOTIFY devicePropertiesChanged)
Q_PROPERTY(int antialiasingQuality READ antialiasingQuality NOTIFY antialiasingQualityChanged)
Q_PROPERTY(bool removeVirtualDisplaysOnDisable READ removeVirtualDisplaysOnDisable NOTIFY removeVirtualDisplaysOnDisableChanged)
Q_PROPERTY(bool mirrorPhysicalDisplays READ mirrorPhysicalDisplays NOTIFY mirrorPhysicalDisplaysChanged)
Q_PROPERTY(bool curvedDisplay READ curvedDisplay NOTIFY curvedDisplayChanged)
Q_PROPERTY(bool curvedDisplaySupported READ curvedDisplaySupported WRITE setCurvedDisplaySupported NOTIFY curvedDisplaySupportedChanged)
public:
BreezyDesktopEffect();
~BreezyDesktopEffect() override;
void reconfigure(ReconfigureFlags) override;
int requestedEffectChainPosition() const override;
QString cursorImageSource() const;
QSize cursorImageSize() const;
QPointF cursorPos() const;
bool isEnabled() const;
int effectTargetScreenIndex() const { return m_effectTargetScreenIndex; }
void setEffectTargetScreenIndex(int index);
bool isZoomOnFocusEnabled() const;
void setZoomOnFocusEnabled(bool enabled);
int lookingAtScreenIndex() const { return m_lookingAtScreenIndex; }
void setLookingAtScreenIndex(int index);
QList<QQuaternion> poseOrientations() const;
QVector3D posePosition() const;
quint32 poseTimeElapsedMs() const;
quint64 poseTimestamp() const;
bool poseResetState() const;
QList<qreal> lookAheadConfig() const;
qreal lookAheadOverride() const;
void setLookAheadOverride(qreal override);
QList<quint32> displayResolution() const;
qreal focusedDisplayDistance() const;
void setFocusedDisplayDistance(qreal distance);
qreal allDisplaysDistance() const;
void setAllDisplaysDistance(qreal distance);
qreal displaySpacing() const;
void setDisplaySpacing(qreal spacing);
qreal displayHorizontalOffset() const;
qreal displayVerticalOffset() const;
int displayWrappingScheme() const;
qreal diagonalFOV() const;
qreal lensDistanceRatio() const;
bool sbsEnabled() const;
bool smoothFollowEnabled() const;
QList<QQuaternion> smoothFollowOrigin() const;
bool customBannerEnabled() const;
int antialiasingQuality() const;
bool removeVirtualDisplaysOnDisable() const;
bool mirrorPhysicalDisplays() const;
bool curvedDisplay() const;
void setCurvedDisplaySupported(bool supported);
void showCursor();
void hideCursor();
public Q_SLOTS:
void activate();
void deactivate();
void enableDriver();
void disableDriver();
void toggle();
void addVirtualDisplay(QSize size);
void updatePoseOrientation();
void updateCursorImage();
void updateCursorPos();
QVariantList listVirtualDisplays() const;
bool removeVirtualDisplay(const QString &id);
void moveCursorToFocusedDisplay();
bool curvedDisplaySupported() const;
Q_SIGNALS:
void lookAheadOverrideChanged();
void focusedDisplayDistanceChanged();
void allDisplaysDistanceChanged();
void displaySpacingChanged();
void displayOffsetChanged();
void displayWrappingSchemeChanged();
void enabledStateChanged();
void zoomOnFocusChanged();
void poseResetStateChanged();
void sbsEnabledChanged();
void smoothFollowEnabledChanged();
void devicePropertiesChanged();
void antialiasingQualityChanged();
void removeVirtualDisplaysOnDisableChanged();
void mirrorPhysicalDisplaysChanged();
void curvedDisplayChanged();
void curvedDisplaySupportedChanged();
void cursorImageSourceChanged();
void cursorPosChanged();
protected:
QVariantMap initialProperties(Output *screen) override;
private:
void teardown();
bool checkParityByte(const char* data);
void setupGlobalShortcut(const BreezyShortcuts::Shortcut &shortcut,
std::function<void()> triggeredFunc);
void recenter();
void toggleSmoothFollow();
void setSmoothFollowThreshold(float threshold);
void updateDriverSmoothFollowSettings();
void warpPointerToOutputCenter(Output *output);
void evaluateCursorOnScreenState(const QPointF &prevPos, const QPointF &newPos);
void invalidateEffectOnScreenGeometryCache();
bool updateEffectOnScreenGeometryCache();
QString m_cursorImageSource;
QSize m_cursorImageSize;
bool m_enabled = false;
bool m_zoomOnFocusEnabled = false;
int m_lookingAtScreenIndex = -1;
int m_effectTargetScreenIndex = -1;
bool m_poseResetState;
QList<QQuaternion> m_poseOrientations;
QVector3D m_posePosition;
quint32 m_poseTimeElapsedMs;
quint64 m_poseTimestamp = 0;
QList<qreal> m_lookAheadConfig;
qreal m_lookAheadOverride = -1.0; // -1 = use device default
QList<quint32> m_displayResolution;
qreal m_diagonalFOV;
qreal m_lensDistanceRatio;
bool m_sbsEnabled;
bool m_smoothFollowEnabled;
QList<QQuaternion> m_smoothFollowOrigin;
bool m_customBannerEnabled;
QFileSystemWatcher *m_shmFileWatcher = nullptr;
QFileSystemWatcher *m_shmDirectoryWatcher = nullptr;
bool m_cursorHidden = false;
QPointF m_cursorPos;
QTimer *m_cursorUpdateTimer = nullptr;
QTimer *m_watchdogTimer = nullptr;
std::atomic<bool> m_poseUpdateInProgress{false};
qreal m_focusedDisplayDistance = 0.85;
qreal m_allDisplaysDistance = 1.05;
qreal m_displaySpacing = 0.0;
qreal m_displayHorizontalOffset = 0.0;
qreal m_displayVerticalOffset = 0.0;
int m_displayWrappingScheme = 0; // 0=auto,1=horizontal,2=vertical,3=flat
int m_antialiasingQuality = 3; // 0=None, 1=Medium, 2=High, 3=VeryHigh
bool m_removeVirtualDisplaysOnDisable = true;
bool m_mirrorPhysicalDisplays = false;
bool m_curvedDisplay = false;
bool m_curvedDisplaySupported = false;
float m_smoothFollowThreshold = 1.0f;
bool m_allDisplaysFollowMode = false;
bool m_focusedSmoothFollowEnabled = false;
// Cached geometry for on-screen cursor evaluation
QRect m_effectOnScreenExpandedGeometry;
bool m_effectOnScreenGeometryValid = false;
struct VirtualOutputInfo {
Output *output = nullptr;
QString id;
QSize size;
};
QHash<QString, VirtualOutputInfo> m_virtualDisplays;
};
} // namespace KWin