1// Copyright (C) 2016 The Qt Company Ltd.
2// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
3
4#pragma once
5
6#include <qpa/qplatformscreen.h>
7#include <qpa/qplatformscreen_p.h>
8#include <QtCore/QString>
9
10#include <xcb/xcb.h>
11#include <xcb/randr.h>
12#include <xcb/xfixes.h>
13
14#include "qxcbobject.h"
15
16#include <private/qfontengine_p.h>
17
18#include <QtGui/private/qedidparser_p.h>
19
20#include <memory>
21
22QT_BEGIN_NAMESPACE
23
24class QXcbConnection;
25class QXcbCursor;
26class QXcbXSettings;
27#ifndef QT_NO_DEBUG_STREAM
28class QDebug;
29#endif
30
31class QXcbVirtualDesktop : public QXcbObject
32{
33public:
34 QXcbVirtualDesktop(QXcbConnection *connection, xcb_screen_t *screen, int number);
35 ~QXcbVirtualDesktop();
36
37 xcb_screen_t *screen() const { return m_screen; }
38 int number() const { return m_number; }
39 QSize size() const { return QSize(m_screen->width_in_pixels, m_screen->height_in_pixels); }
40 QSize physicalSize() const { return QSize(m_screen->width_in_millimeters, m_screen->height_in_millimeters); }
41 QDpi dpi() const;
42 xcb_window_t root() const { return m_screen->root; }
43 QXcbScreen *screenAt(const QPoint &pos) const;
44
45 QList<QPlatformScreen *> screens() const { return m_screens; }
46 void setScreens(QList<QPlatformScreen *> &&sl) { m_screens = std::move(sl); }
47 void removeScreen(QPlatformScreen *s) { m_screens.removeOne(t: s); }
48 void addScreen(QPlatformScreen *s);
49 void setPrimaryScreen(QPlatformScreen *s);
50
51 QXcbXSettings *xSettings() const;
52
53 bool compositingActive() const;
54
55 void updateWorkArea();
56 QRect availableGeometry(const QRect &screenGeometry) const;
57
58 void handleXFixesSelectionNotify(xcb_xfixes_selection_notify_event_t *notify_event);
59 void subscribeToXFixesSelectionNotify();
60
61 void handleScreenChange(xcb_randr_screen_change_notify_event_t *change_event);
62
63 int forcedDpi() const { return m_forcedDpi; }
64 QFontEngine::HintStyle hintStyle() const { return m_hintStyle; }
65 QFontEngine::SubpixelAntialiasingType subpixelType() const { return m_subpixelType; }
66 int antialiasingEnabled() const { return m_antialiasingEnabled; }
67
68 QString windowManagerName() const { return m_windowManagerName; }
69
70 QSurfaceFormat surfaceFormatFor(const QSurfaceFormat &format) const;
71
72 const xcb_visualtype_t *visualForFormat(const QSurfaceFormat &format) const;
73 const xcb_visualtype_t *visualForId(xcb_visualid_t) const;
74 quint8 depthOfVisual(xcb_visualid_t) const;
75 xcb_colormap_t colormapForVisual(xcb_visualid_t) const;
76
77private:
78 QRect getWorkArea() const;
79
80 static bool xResource(const QByteArray &identifier,
81 const QByteArray &expectedIdentifier,
82 QByteArray &stringValue);
83 void readXResources();
84
85 bool setDpiFromXSettings(const QVariant &property);
86
87 xcb_screen_t *m_screen;
88 const int m_number;
89 QList<QPlatformScreen *> m_screens;
90
91 QXcbXSettings *m_xSettings = nullptr;
92 xcb_atom_t m_net_wm_cm_atom = 0;
93 bool m_compositingActive = false;
94
95 QRect m_workArea;
96
97 int m_forcedDpi = -1;
98 QFontEngine::HintStyle m_hintStyle = QFontEngine::HintStyle(-1);
99 QFontEngine::SubpixelAntialiasingType m_subpixelType = QFontEngine::SubpixelAntialiasingType(-1);
100 int m_antialiasingEnabled = -1;
101 QString m_windowManagerName;
102 QMap<xcb_visualid_t, xcb_visualtype_t> m_visuals;
103 QMap<xcb_visualid_t, quint8> m_visualDepths;
104 mutable QMap<xcb_visualid_t, xcb_colormap_t> m_visualColormaps;
105 uint16_t m_rotation = 0;
106
107 friend class QXcbConnection;
108};
109
110class Q_XCB_EXPORT QXcbScreen : public QXcbObject, public QPlatformScreen
111 , public QNativeInterface::Private::QXcbScreen
112{
113public:
114 QXcbScreen(QXcbConnection *connection, QXcbVirtualDesktop *virtualDesktop,
115 xcb_randr_output_t outputId, xcb_randr_get_output_info_reply_t *outputInfo);
116 QXcbScreen(QXcbConnection *connection, QXcbVirtualDesktop *virtualDesktop,
117 xcb_randr_monitor_info_t *monitorInfo, xcb_timestamp_t timestamp = XCB_NONE);
118 ~QXcbScreen();
119
120 QString getOutputName(xcb_randr_get_output_info_reply_t *outputInfo);
121 QString getName(xcb_randr_monitor_info_t *monitorInfo);
122
123 QPixmap grabWindow(WId window, int x, int y, int width, int height) const override;
124
125 QWindow *topLevelAt(const QPoint &point) const override;
126
127 QString manufacturer() const override;
128 QString model() const override;
129 QString serialNumber() const override;
130
131 QRect geometry() const override { return m_geometry; }
132 QRect availableGeometry() const override;
133 int depth() const override { return screen()->root_depth; }
134 QImage::Format format() const override;
135 QColorSpace colorSpace() const override { return m_colorSpace; }
136 QSizeF physicalSize() const override { return m_sizeMillimeters; }
137 QDpi logicalDpi() const override;
138 QDpi logicalBaseDpi() const override { return QDpi(96, 96); }
139 QPlatformCursor *cursor() const override;
140 qreal refreshRate() const override { return m_refreshRate; }
141 Qt::ScreenOrientation orientation() const override { return m_orientation; }
142 QList<QPlatformScreen *> virtualSiblings() const override { return m_virtualDesktop->screens(); }
143 QXcbVirtualDesktop *virtualDesktop() const { return m_virtualDesktop; }
144
145 void setPrimary(bool primary) { m_primary = primary; }
146 bool isPrimary() const { return m_primary; }
147
148 int screenNumber() const { return m_virtualDesktop->number(); }
149 int virtualDesktopNumber() const override { return screenNumber(); }
150
151 xcb_screen_t *screen() const { return m_virtualDesktop->screen(); }
152 xcb_window_t root() const { return screen()->root; }
153 xcb_randr_output_t output() const { return m_output; }
154 xcb_randr_crtc_t crtc() const { return m_crtc; }
155 xcb_randr_mode_t mode() const { return m_mode; }
156
157 QList<xcb_randr_output_t> outputs() const { return m_outputs; }
158 QList<xcb_randr_crtc_t> crtcs() const { return m_crtcs; }
159
160 void setOutput(xcb_randr_output_t outputId,
161 xcb_randr_get_output_info_reply_t *outputInfo);
162 void setCrtc(xcb_randr_crtc_t crtc) { m_crtc = crtc; }
163 void setMonitor(xcb_randr_monitor_info_t *monitorInfo, xcb_timestamp_t timestamp = XCB_NONE);
164 QString defaultName();
165 bool isPrimaryInXScreen();
166
167 void windowShown(QXcbWindow *window);
168 QString windowManagerName() const { return m_virtualDesktop->windowManagerName(); }
169
170 QSurfaceFormat surfaceFormatFor(const QSurfaceFormat &format) const;
171
172 const xcb_visualtype_t *visualForFormat(const QSurfaceFormat &format) const { return m_virtualDesktop->visualForFormat(format); }
173 const xcb_visualtype_t *visualForId(xcb_visualid_t visualid) const;
174 xcb_colormap_t colormapForVisual(xcb_visualid_t visualid) const { return m_virtualDesktop->colormapForVisual(visualid); }
175 quint8 depthOfVisual(xcb_visualid_t visualid) const { return m_virtualDesktop->depthOfVisual(visualid); }
176
177 QString name() const override { return m_outputName; }
178
179 void updateGeometry(const QRect &geometry, uint8_t rotation);
180 void updateGeometry(xcb_timestamp_t timestamp = XCB_TIME_CURRENT_TIME);
181 void updateAvailableGeometry();
182 void updateRefreshRate(xcb_randr_mode_t mode);
183
184 QFontEngine::HintStyle hintStyle() const { return m_virtualDesktop->hintStyle(); }
185 QFontEngine::SubpixelAntialiasingType subpixelType() const { return m_virtualDesktop->subpixelType(); }
186 int antialiasingEnabled() const { return m_virtualDesktop->antialiasingEnabled(); }
187
188 QXcbXSettings *xSettings() const;
189
190private:
191 void sendStartupMessage(const QByteArray &message) const;
192 int forcedDpi() const;
193
194 void updateColorSpaceAndEdid();
195 QByteArray getOutputProperty(xcb_atom_t atom) const;
196 QByteArray getEdid() const;
197
198 QXcbVirtualDesktop *m_virtualDesktop;
199 xcb_randr_monitor_info_t *m_monitor;
200 xcb_randr_output_t m_output;
201 xcb_randr_crtc_t m_crtc;
202 xcb_randr_mode_t m_mode = XCB_NONE;
203 bool m_primary = false;
204
205 bool m_singlescreen = false;
206
207 QList<xcb_randr_output_t> m_outputs;
208 QList<xcb_randr_crtc_t> m_crtcs;
209
210 QString m_outputName;
211 QSizeF m_outputSizeMillimeters;
212 QSizeF m_sizeMillimeters;
213 QRect m_geometry;
214 QRect m_availableGeometry;
215 QColorSpace m_colorSpace;
216 Qt::ScreenOrientation m_orientation = Qt::PrimaryOrientation;
217 std::unique_ptr<QXcbCursor> m_cursor;
218 qreal m_refreshRate = 60.0;
219 QEdidParser m_edid;
220
221 friend class QXcbConnection;
222 friend class QXcbVirtualDesktop;
223};
224
225#ifndef QT_NO_DEBUG_STREAM
226Q_GUI_EXPORT QDebug operator<<(QDebug, const QXcbScreen *);
227#endif
228
229QT_END_NAMESPACE
230

Provided by KDAB

Privacy Policy
Learn to use CMake with our Intro Training
Find out more

source code of qtbase/src/plugins/platforms/xcb/qxcbscreen.h