1 /*
2  *  SPDX-FileCopyrightText: 2012, 2013 Daniel Vrátil <dvratil@redhat.com>
3  *
4  *  SPDX-License-Identifier: LGPL-2.1-or-later
5  */
6 #pragma once
7 
8 #include "output.h"
9 
10 #include "../xcbwrapper.h"
11 #include "xrandrmode.h"
12 
13 #include <QMap>
14 #include <QObject>
15 #include <QVariant>
16 
17 class XRandRConfig;
18 class XRandRCrtc;
19 namespace KScreen
20 {
21 class Config;
22 class Output;
23 }
24 
25 class XRandROutput : public QObject
26 {
27     Q_OBJECT
28 
29 public:
30     typedef QMap<xcb_randr_output_t, XRandROutput *> Map;
31 
32     explicit XRandROutput(xcb_randr_output_t id, XRandRConfig *config);
33     ~XRandROutput() override;
34 
35     void disabled();
36     void disconnected();
37 
38     void update();
39     void update(xcb_randr_crtc_t crtc, xcb_randr_mode_t mode, xcb_randr_connection_t conn, bool primary);
40 
41     void setIsPrimary(bool primary);
42 
43     xcb_randr_output_t id() const;
44 
45     bool isEnabled() const;
46     bool isConnected() const;
47     bool isPrimary() const;
48 
49     QPoint position() const;
50     QSize size() const;
51     QSizeF logicalSize() const;
52 
53     QString currentModeId() const;
54     XRandRMode::Map modes() const;
55     XRandRMode *currentMode() const;
56 
57     KScreen::Output::Rotation rotation() const;
58     bool isHorizontal() const;
59 
60     QByteArray edid() const;
61     XRandRCrtc *crtc() const;
62 
63     KScreen::OutputPtr toKScreenOutput() const;
64 
65     void updateLogicalSize(const KScreen::OutputPtr &output, XRandRCrtc *crtc = nullptr);
66 
67 private:
68     void init();
69     void updateModes(const XCB::OutputInfo &outputInfo);
70 
71     static KScreen::Output::Type fetchOutputType(xcb_randr_output_t outputId, const QString &name);
72     static QByteArray typeFromProperty(xcb_randr_output_t outputId);
73 
74     xcb_render_transform_t currentTransform() const;
75 
76     XRandRConfig *m_config;
77     xcb_randr_output_t m_id;
78     QString m_name;
79     QString m_icon;
80     mutable QByteArray m_edid;
81 
82     xcb_randr_connection_t m_connected;
83     bool m_primary;
84     KScreen::Output::Type m_type;
85 
86     XRandRMode::Map m_modes;
87     QStringList m_preferredModes;
88 
89     QList<xcb_randr_output_t> m_clones;
90 
91     unsigned int m_widthMm;
92     unsigned int m_heightMm;
93 
94     bool m_hotplugModeUpdate = false;
95     XRandRCrtc *m_crtc;
96 };
97 
98 Q_DECLARE_METATYPE(XRandROutput::Map)
99