summaryrefslogblamecommitdiffstats
path: root/src/xprivate.h
blob: c10832e8a660215103f1a7469e15d44250da3a81 (plain) (tree)













































                                                                                                    


                                                                                            


                                                                                                                                            
                                                                                                   

                                                                                                                         
                                                                
                                                                                                             

                                                                                                             
                                                                         





                                         
                                   
                                    


                                     






                                                                                               
                    
#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);
	int          getMaxTmdsClockMhz(unsigned char *data);
	void         addMissingModesFromExtBlock(XRRScreenResources *res, RROutput outputId, unsigned char *data,unsigned  int maxClockMhz);
	void         addMissingModesFromDtd(XRRScreenResources *res, RROutput outputId, unsigned char *data, unsigned int maxClockMhz);
	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);
    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