File indexing completed on 2024-04-28 16:49:41

0001 /*
0002  *  SPDX-FileCopyrightText: 2012 Alejandro Fiestas Olivares <afiestas@kde.org>
0003  *  SPDX-FileCopyrightText: 2012, 2013 Daniel Vrátil <dvratil@redhat.com>
0004  *
0005  *  SPDX-License-Identifier: LGPL-2.1-or-later
0006  */
0007 #pragma once
0008 
0009 #include "abstractbackend.h"
0010 
0011 #include <QLoggingCategory>
0012 #include <QSize>
0013 
0014 #include <xcb/randr.h>
0015 #include <xcb/xcb.h>
0016 
0017 class QRect;
0018 class QTimer;
0019 
0020 class XCBEventListener;
0021 class XRandRConfig;
0022 
0023 class XRandR : public KScreen::AbstractBackend
0024 {
0025     Q_OBJECT
0026     Q_PLUGIN_METADATA(IID "org.kf5.kscreen.backends.xrandr")
0027 
0028 public:
0029     explicit XRandR();
0030     ~XRandR() override;
0031 
0032     QString name() const override;
0033     QString serviceName() const override;
0034     KScreen::ConfigPtr config() const override;
0035     void setConfig(const KScreen::ConfigPtr &config) override;
0036     bool isValid() const override;
0037     QByteArray edid(int outputId) const override;
0038 
0039     static QByteArray outputEdid(xcb_randr_output_t outputId);
0040     static xcb_randr_get_screen_resources_reply_t *screenResources();
0041     static xcb_screen_t *screen();
0042     static xcb_window_t rootWindow();
0043 
0044     static bool hasProperty(xcb_randr_output_t outputId, const QByteArray &name);
0045 
0046 private:
0047     void outputChanged(xcb_randr_output_t output, xcb_randr_crtc_t crtc, xcb_randr_mode_t mode, xcb_randr_connection_t connection);
0048     void crtcChanged(xcb_randr_crtc_t crtc, xcb_randr_mode_t mode, xcb_randr_rotation_t rotation, const QRect &geom, xcb_timestamp_t timestamp);
0049     void screenChanged(xcb_randr_rotation_t rotation, const QSize &sizePx, const QSize &sizeMm);
0050 
0051     static quint8 *getXProperty(xcb_randr_output_t output, xcb_atom_t atom, size_t &len);
0052 
0053     static xcb_screen_t *s_screen;
0054     static xcb_window_t s_rootWindow;
0055     static XRandRConfig *s_internalConfig;
0056 
0057     static int s_randrBase;
0058     static int s_randrError;
0059     static bool s_monitorInitialized;
0060     static bool s_has_1_3;
0061     static bool s_xorgCacheInitialized;
0062 
0063     XCBEventListener *m_x11Helper;
0064     bool m_isValid;
0065 
0066     QTimer *m_configChangeCompressor;
0067 };
0068 
0069 Q_DECLARE_LOGGING_CATEGORY(KSCREEN_XRANDR)