summaryrefslogtreecommitdiffstats
path: root/src/xx.h
blob: ea1177a7b289d2b7c241777b02a5d6b3a6b6f78f (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
#ifndef XRANDR_H
#define XRANDR_H

#include <QList>
#include <QString>
#include <QSize>

struct ScreenInfo;
class XPrivate;
class QSocketNotifier;
class BackupInternal;

typedef QVector<QSize>                    ResolutionVector;

///////////////////////////////////////////////////////////////////////////

enum class ScreenMode
{
	Single,
	Clone,
	Dual,
	Advanced,
};

struct ScreenInfo
{
    QPoint location;
	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 setResolutionsFromString(const QString &resolutions, const QString &mapping);
	ConfigBackup setDefaultMode(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<QPair<QSize, QList<QString>>> &list);
	ResolutionVector getCommonModes() const;
	int getOutputCount() const;
	int queryCurrentOutputCount() const;
	QMap<QString, ScreenInfo> getScreenPositions() const;
	const ResolutionVector &getVirtualResolutions() const;
	bool runXrandr(QStringList &cmd);

	// 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