1 /*
2  *  SPDX-FileCopyrightText: 2012 Alejandro Fiestas Olivares <afiestas@kde.org>
3  *  SPDX-FileCopyrightText: 2012, 2013 Daniel Vrátil <dvratil@redhat.com>
4  *
5  *  SPDX-License-Identifier: LGPL-2.1-or-later
6  */
7 #pragma once
8 
9 #include "abstractbackend.h"
10 
11 #include <QLoggingCategory>
12 #include <QSize>
13 
14 #include "../xcbwrapper.h"
15 
16 class QRect;
17 class QTimer;
18 
19 class XCBEventListener;
20 class XRandRConfig;
21 
22 class XRandR : public KScreen::AbstractBackend
23 {
24     Q_OBJECT
25     Q_PLUGIN_METADATA(IID "org.kf5.kscreen.backends.xrandr")
26 
27 public:
28     explicit XRandR();
29     ~XRandR() override;
30 
31     QString name() const override;
32     QString serviceName() const override;
33     KScreen::ConfigPtr config() const override;
34     void setConfig(const KScreen::ConfigPtr &config) override;
35     bool isValid() const override;
36     QByteArray edid(int outputId) const override;
37 
38     static QByteArray outputEdid(xcb_randr_output_t outputId);
39     static xcb_randr_get_screen_resources_reply_t *screenResources();
40     static xcb_screen_t *screen();
41     static xcb_window_t rootWindow();
42 
43     static bool hasProperty(xcb_randr_output_t outputId, const QByteArray &name);
44 
45 private:
46     void outputChanged(xcb_randr_output_t output, xcb_randr_crtc_t crtc, xcb_randr_mode_t mode, xcb_randr_connection_t connection);
47     void crtcChanged(xcb_randr_crtc_t crtc, xcb_randr_mode_t mode, xcb_randr_rotation_t rotation, const QRect &geom);
48     void screenChanged(xcb_randr_rotation_t rotation, const QSize &sizePx, const QSize &sizeMm);
49 
50     static quint8 *getXProperty(xcb_randr_output_t output, xcb_atom_t atom, size_t &len);
51 
52     static xcb_screen_t *s_screen;
53     static xcb_window_t s_rootWindow;
54     static XRandRConfig *s_internalConfig;
55 
56     static int s_randrBase;
57     static int s_randrError;
58     static bool s_monitorInitialized;
59     static bool s_has_1_3;
60     static bool s_xorgCacheInitialized;
61 
62     XCBEventListener *m_x11Helper;
63     bool m_isValid;
64 
65     QTimer *m_configChangeCompressor;
66 };
67 
68 Q_DECLARE_LOGGING_CATEGORY(KSCREEN_XRANDR)
69