summaryrefslogtreecommitdiffstats
path: root/src/xprivate.h
blob: 0152fb15fd0d9812d04da551b4b464e9bf78f573 (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
#ifndef XPRIVATE_H
#define XPRIVATE_H

#include "xx.h"

#include <QHash>
#include <QSize>
#include <QTextStream>

#include <X11/Xlib.h>
#include <X11/extensions/Xrandr.h>

enum class Projector {
    No,
    Yes,
    Maybe
};

struct OutputInfo {
    OutputInfo(RROutput id, XRROutputInfo *output, XRRCrtcInfo *crtc, XRRModeInfo *mode)
        : output(output), crtc(crtc), mode(mode), id(id), position(-1), outputType(Projector::No) {}
    ~OutputInfo() {
        XRRFreeOutputInfo(output);
    }
    XRROutputInfo* output;
    XRRCrtcInfo* crtc;
    XRRModeInfo* mode;
    RROutput id;
    QString modelName;
    QString outputName;
    int position;
    Projector outputType;
};

typedef QHash<RRMode, XRRModeInfo*>       ModeMap;
typedef QHash<RRCrtc, XRRCrtcInfo*>       CrtcMap;
typedef QHash<RROutput, OutputInfo*>      OutputMap;

class XPrivate
{
public:
    explicit XPrivate();
    virtual ~XPrivate();

    void         freeResources();
    void         updateScreenResources();
	void         addMissingEdidResolutions();
	bool         getEdid(RROutput outputId, unsigned char *buffer, unsigned long *size);
	bool         readEdid(OutputInfo* output);
	void         addMissingModesFromExtBlock(XRRScreenResources *res, RROutput outputId, unsigned char *data);
	void         addMissingModesFromDtd(XRRScreenResources *res, RROutput outputId, unsigned char *data);
	XRRModeInfo* getPreferredMode(const OutputInfo *oi, XRRModeInfo *fallback = nullptr) const;
    QList<RRMode> getOutputModeForResolution(const XRROutputInfo *output, unsigned int width, unsigned int height) const;
    QList<RRMode> getOutputModeForResolution(const XRROutputInfo *output, const QSize &resolution) const;
    RRCrtc       getFreeCrtc(const XRROutputInfo* output) const;
	XRRModeInfo* setOutputResolution(QStringList &args, OutputInfo *oi, int x, int y, const QSize &size);
    QList<QSize> getTotalSize(const QList<OutputInfo*> &projectors, const QList<OutputInfo*> &screens) const;
    void         copyModesToAll(RROutput id, int num);

    Display*            _display;
    Atom                _EDID_ATOM;
    XRRScreenResources* _screenResources;
    ModeMap             _modeMap;
    CrtcMap             _crtcMap;
    OutputMap           _outputMap;
    QStringList         _allOutputs;
    ResolutionVector    _resolutions;
};

static double toVertRefresh(const XRRModeInfo *mode)
{
    if (mode->hTotal > 0 && mode->vTotal > 0)
        return (double(mode->dotClock) /	(double(mode->hTotal) * double(mode->vTotal)));
    return 0;
}

#endif // XPRIVATE_H