File indexing completed on 2024-04-28 16:49:42
0001 /* 0002 * SPDX-FileCopyrightText: 2012, 2013 Daniel Vrátil <dvratil@redhat.com> 0003 * 0004 * SPDX-License-Identifier: LGPL-2.1-or-later 0005 */ 0006 #pragma once 0007 0008 #include "xrandrmode.h" 0009 0010 #include "../xcbwrapper.h" 0011 0012 #include "output.h" 0013 0014 #include <QMap> 0015 #include <QObject> 0016 #include <QVariant> 0017 #include <cstdint> 0018 #include <limits> 0019 0020 class XRandRConfig; 0021 class XRandRCrtc; 0022 namespace KScreen 0023 { 0024 class Config; 0025 class Output; 0026 } 0027 0028 class XRandROutput : public QObject 0029 { 0030 Q_OBJECT 0031 0032 public: 0033 typedef QMap<xcb_randr_output_t, XRandROutput *> Map; 0034 0035 using Priority = uint32_t; 0036 static constexpr size_t PRIORITY_FORMAT = std::numeric_limits<Priority>::digits; 0037 0038 explicit XRandROutput(xcb_randr_output_t id, XRandRConfig *config); 0039 ~XRandROutput() override; 0040 0041 void disabled(); 0042 void disconnected(); 0043 0044 void update(xcb_randr_crtc_t crtc, xcb_randr_mode_t mode, xcb_randr_connection_t conn); 0045 0046 xcb_randr_output_t id() const; 0047 0048 bool isEnabled() const; 0049 bool isConnected() const; 0050 bool isPrimary() const; 0051 0052 Priority priority() const; 0053 void setPriority(Priority priority); 0054 0055 QPoint position() const; 0056 QSize size() const; 0057 QSizeF logicalSize() const; 0058 0059 QString currentModeId() const; 0060 XRandRMode::Map modes() const; 0061 XRandRMode *currentMode() const; 0062 0063 KScreen::Output::Rotation rotation() const; 0064 bool isHorizontal() const; 0065 0066 QByteArray edid() const; 0067 XRandRCrtc *crtc() const; 0068 0069 KScreen::OutputPtr toKScreenOutput() const; 0070 0071 void updateLogicalSize(const KScreen::OutputPtr &output, XRandRCrtc *crtc = nullptr); 0072 0073 private: 0074 void init(); 0075 void updateModes(const XCB::OutputInfo &outputInfo); 0076 Priority outputPriorityFromProperty() const; 0077 void setOutputPriorityToProperty(Priority priority); 0078 void setAsPrimary(); 0079 0080 static KScreen::Output::Type fetchOutputType(xcb_randr_output_t outputId, const QString &name); 0081 static QByteArray typeFromProperty(xcb_randr_output_t outputId); 0082 0083 xcb_render_transform_t currentTransform() const; 0084 0085 XRandRConfig *m_config; 0086 xcb_randr_output_t m_id; 0087 QString m_name; 0088 QString m_icon; 0089 mutable QByteArray m_edid; 0090 0091 xcb_randr_connection_t m_connected; 0092 KScreen::Output::Type m_type; 0093 0094 XRandRMode::Map m_modes; 0095 QStringList m_preferredModes; 0096 0097 QList<xcb_randr_output_t> m_clones; 0098 0099 unsigned int m_widthMm; 0100 unsigned int m_heightMm; 0101 0102 bool m_hotplugModeUpdate = false; 0103 XRandRCrtc *m_crtc; 0104 }; 0105 0106 Q_DECLARE_METATYPE(XRandROutput::Map)