File indexing completed on 2025-04-20 10:57:35
0001 /* 0002 KWin - the KDE window manager 0003 This file is part of the KDE project. 0004 0005 SPDX-FileCopyrightText: 2015 Martin Gräßlin <mgraesslin@kde.org> 0006 0007 SPDX-License-Identifier: GPL-2.0-or-later 0008 */ 0009 #pragma once 0010 0011 #include "drm_abstract_output.h" 0012 #include "drm_object.h" 0013 #include "drm_plane.h" 0014 0015 #include <QObject> 0016 #include <QPoint> 0017 #include <QPointer> 0018 #include <QSize> 0019 #include <QTimer> 0020 #include <QVector> 0021 #include <chrono> 0022 #include <xf86drmMode.h> 0023 0024 namespace KWin 0025 { 0026 0027 class DrmConnector; 0028 class DrmGpu; 0029 class DrmPipeline; 0030 class DumbSwapchain; 0031 class DrmLease; 0032 0033 class KWIN_EXPORT DrmOutput : public DrmAbstractOutput 0034 { 0035 Q_OBJECT 0036 public: 0037 DrmOutput(const std::shared_ptr<DrmConnector> &connector); 0038 ~DrmOutput() override; 0039 0040 DrmConnector *connector() const; 0041 DrmPipeline *pipeline() const; 0042 0043 bool present() override; 0044 DrmOutputLayer *primaryLayer() const override; 0045 0046 bool queueChanges(const OutputConfiguration &config); 0047 void applyQueuedChanges(const OutputConfiguration &config); 0048 void revertQueuedChanges(); 0049 void updateModes(); 0050 void updateDpmsMode(DpmsMode dpmsMode); 0051 0052 bool setCursor(CursorSource *source) override; 0053 bool moveCursor(const QPoint &position) override; 0054 0055 DrmLease *lease() const; 0056 bool addLeaseObjects(QVector<uint32_t> &objectList); 0057 void leased(DrmLease *lease); 0058 void leaseEnded(); 0059 0060 bool setGammaRamp(const std::shared_ptr<ColorTransformation> &transformation) override; 0061 bool setCTM(const QMatrix3x3 &ctm) override; 0062 0063 private: 0064 bool setDrmDpmsMode(DpmsMode mode); 0065 void setDpmsMode(DpmsMode mode) override; 0066 0067 QList<std::shared_ptr<OutputMode>> getModes() const; 0068 0069 DrmPipeline *m_pipeline; 0070 const std::shared_ptr<DrmConnector> m_connector; 0071 0072 bool m_setCursorSuccessful = false; 0073 bool m_moveCursorSuccessful = false; 0074 QTimer m_turnOffTimer; 0075 DrmLease *m_lease = nullptr; 0076 0077 struct { 0078 QPointer<CursorSource> source; 0079 QPoint position; 0080 } m_cursor; 0081 }; 0082 0083 } 0084 0085 Q_DECLARE_METATYPE(KWin::DrmOutput *)