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)