#ifndef XRANDR_H #define XRANDR_H #include #include #include struct ScreenInfo; class XPrivate; class QSocketNotifier; class BackupInternal; typedef QVector ResolutionVector; /////////////////////////////////////////////////////////////////////////// enum class ScreenMode { Single, Clone, Dual, Advanced, }; struct ScreenInfo { int position; QString name; QString output; QSize currentResolution; QSize preferredResolution; bool isProjector; ResolutionVector modes; }; enum class ConnectionEvent { Connected, Disconnected, Unknown, }; class ConfigBackup { friend class ScreenSetup; protected: explicit ConfigBackup(XPrivate*); explicit ConfigBackup(); private: bool _ok; BackupInternal* a; ConfigBackup& operator=(const ConfigBackup &other); public: ConfigBackup(const ConfigBackup &other); ~ConfigBackup(); bool ok() const { return _ok; } void revert(); }; struct OutputInfo; class ScreenSetup : public QObject { Q_OBJECT public: void addMissingEdidResolutions(); void updateScreenResources(); void initModes(); ScreenMode getCurrentMode(); bool hasScreenWithoutEdid(); ConfigBackup setDefaultMode(bool dryRun, ScreenMode &mode); bool createMode(unsigned int resX, unsigned int resY, float refresh, QString name); ConfigBackup setCenteredClone(); ConfigBackup setClone(const QSize &resolution); ConfigBackup setCustom(const QList>> &list); ResolutionVector getCommonModes() const; int getOutputCount() const; int queryCurrentOutputCount() const; QMap getScreenPositions() const; const ResolutionVector &getVirtualResolutions() const; // Singleton inline static ScreenSetup* inst() { if (_instance == nullptr) _instance = new ScreenSetup(); return _instance; } private: ScreenSetup(); ~ScreenSetup(); ScreenInfo initScreenInfo(const OutputInfo *oi) const; ConfigBackup createCrtcBackup(); static ScreenSetup * _instance; XPrivate *a; QSocketNotifier *_socketNotifier; signals: void outputConfigChanged(ConnectionEvent event); }; /////////////////////////////////////////////////////////////////////////// #endif // XRANDR_H