#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;
void 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