#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();
bool readEdid(OutputInfo* output);
void createCrtcBackup();
void freeCrtcBackup();
void disconnectAllCrtcs();
XRRModeInfo* getPreferredMode(OutputInfo *oi, XRRModeInfo *fallback = nullptr) const;
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);
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;
CrtcMap _crtcBackup;
OutputMap _outputMap;
ResolutionVector _resolutions;
};
#endif // XPRIVATE_H