#ifndef XPRIVATE_H #define XPRIVATE_H #include "xx.h" #include #include #include #include #include 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 ModeMap; typedef QHash CrtcMap; typedef QHash 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 getOutputModeForResolution(const XRROutputInfo *output, unsigned int width, unsigned int height) const; QList 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 getTotalSize(const QList &projectors, const QList &screens) const; void copyModesToAll(RROutput id, int num); bool addResolutionToOutput(OutputInfo *oi, const QSize &res); 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