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
|
#ifndef XRANDR_H
#define XRANDR_H
#include <QDebug>
#include <QList>
#include <QHash>
#include <QString>
#include <QRect>
#include <QSet>
#include <QSize>
#include <X11/Xlib.h>
#include <X11/extensions/Xrandr.h>
struct OutputInfo;
typedef QHash<RRMode, XRRModeInfo*> ModeMap;
typedef QHash<RRCrtc, XRRCrtcInfo*> CrtcMap;
typedef QHash<RROutput, OutputInfo*> OutputMap;
typedef QVector<QSize> ResolutionVector;
///////////////////////////////////////////////////////////////////////////
enum class ScreenMode
{
Single,
Clone,
Dual,
Advanced,
};
class ScreenInfo
{
public:
ScreenInfo(const OutputInfo *oi, const ModeMap &om);
int position;
QString name;
QString output;
QSize currentResolution;
QSize preferredResolution;
bool isProjector;
ResolutionVector modes;
};
class ScreenSetup
{
public:
void updateScreenResources();
void initModes();
XRRModeInfo* getPreferredMode(OutputInfo *oi) const;
QList<QSize> getTotalSize(const QList<OutputInfo*> &projectors, const QList<OutputInfo*> &screens) const;
ScreenMode getCurrentMode();
ScreenMode setDefaultMode(bool dryRun = false);
void copyModesToAll(RROutput id, int num);
bool createMode(unsigned int resX, unsigned int resY, float refresh, QString name);
void revertChanges();
bool setClone(const QSize &resolution);
bool setCustom(const QList<QPair<QSize, QList<QString>>> &list);
ResolutionVector getCommonModes() const;
int getOutputCount() const { return _outputMap.size(); }
QMap<QString, ScreenInfo> getScreenPositions() const;
const ResolutionVector &getVirtualResolutions() const { return _resolutions; }
// Singleton
inline static ScreenSetup* inst() {
if (_instance == nullptr) _instance = new ScreenSetup();
return _instance;
}
private:
ScreenSetup();
~ScreenSetup();
void freeResources();
bool readEdid(OutputInfo* output);
void createCrtcBackup();
void freeCrtcBackup();
void disconnectAllCrtcs();
void setScreenSize(const QSize &size);
RRMode getOutputModeForResolution(const XRROutputInfo *output, unsigned int width, unsigned int height) const;
RRMode getOutputModeForResolution(const XRROutputInfo *output, const QSize &resolution) const;
RRCrtc getFreeCrtc(const XRROutputInfo* output) const;
bool setOutputResolution(OutputInfo *oi, int x, int y, const QSize &size, bool dryRun = false);
static ScreenSetup * _instance;
Display* _display;
Atom _EDID_ATOM;
XRRScreenResources* _screenResources;
ModeMap _modeMap;
CrtcMap _crtcMap;
CrtcMap _crtcBackup;
OutputMap _outputMap;
ResolutionVector _resolutions;
};
///////////////////////////////////////////////////////////////////////////
#endif // XRANDR_H
|