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 *)