1 /**************************************************************************** 2 ** 3 ** Copyright (C) 2016 The Qt Company Ltd. 4 ** Contact: https://www.qt.io/licensing/ 5 ** 6 ** This file is part of the plugins of the Qt Toolkit. 7 ** 8 ** $QT_BEGIN_LICENSE:LGPL$ 9 ** Commercial License Usage 10 ** Licensees holding valid commercial Qt licenses may use this file in 11 ** accordance with the commercial license agreement provided with the 12 ** Software or, alternatively, in accordance with the terms contained in 13 ** a written agreement between you and The Qt Company. For licensing terms 14 ** and conditions see https://www.qt.io/terms-conditions. For further 15 ** information use the contact form at https://www.qt.io/contact-us. 16 ** 17 ** GNU Lesser General Public License Usage 18 ** Alternatively, this file may be used under the terms of the GNU Lesser 19 ** General Public License version 3 as published by the Free Software 20 ** Foundation and appearing in the file LICENSE.LGPL3 included in the 21 ** packaging of this file. Please review the following information to 22 ** ensure the GNU Lesser General Public License version 3 requirements 23 ** will be met: https://www.gnu.org/licenses/lgpl-3.0.html. 24 ** 25 ** GNU General Public License Usage 26 ** Alternatively, this file may be used under the terms of the GNU 27 ** General Public License version 2.0 or (at your option) the GNU General 28 ** Public license version 3 or any later version approved by the KDE Free 29 ** Qt Foundation. The licenses are as published by the Free Software 30 ** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3 31 ** included in the packaging of this file. Please review the following 32 ** information to ensure the GNU General Public License requirements will 33 ** be met: https://www.gnu.org/licenses/gpl-2.0.html and 34 ** https://www.gnu.org/licenses/gpl-3.0.html. 35 ** 36 ** $QT_END_LICENSE$ 37 ** 38 ****************************************************************************/ 39 40 #ifndef QXCBSCREEN_H 41 #define QXCBSCREEN_H 42 43 #include <qpa/qplatformscreen.h> 44 #include <QtCore/QString> 45 46 #include <xcb/xcb.h> 47 #include <xcb/randr.h> 48 #include <xcb/xfixes.h> 49 #include <xcb/xinerama.h> 50 51 #include "qxcbobject.h" 52 #include "qxcbscreen.h" 53 54 #include <private/qfontengine_p.h> 55 56 #include <QtEdidSupport/private/qedidparser_p.h> 57 58 QT_BEGIN_NAMESPACE 59 60 class QXcbConnection; 61 class QXcbCursor; 62 class QXcbXSettings; 63 #ifndef QT_NO_DEBUG_STREAM 64 class QDebug; 65 #endif 66 67 class QXcbVirtualDesktop : public QXcbObject 68 { 69 public: 70 QXcbVirtualDesktop(QXcbConnection *connection, xcb_screen_t *screen, int number); 71 ~QXcbVirtualDesktop(); 72 screen()73 xcb_screen_t *screen() const { return m_screen; } number()74 int number() const { return m_number; } size()75 QSize size() const { return QSize(m_screen->width_in_pixels, m_screen->height_in_pixels); } physicalSize()76 QSize physicalSize() const { return QSize(m_screen->width_in_millimeters, m_screen->height_in_millimeters); } 77 QDpi dpi() const; root()78 xcb_window_t root() const { return m_screen->root; } 79 QXcbScreen *screenAt(const QPoint &pos) const; 80 screens()81 QList<QPlatformScreen *> screens() const { return m_screens; } setScreens(QList<QPlatformScreen * > && sl)82 void setScreens(QList<QPlatformScreen *> &&sl) { m_screens = std::move(sl); } removeScreen(QPlatformScreen * s)83 void removeScreen(QPlatformScreen *s) { m_screens.removeOne(s); } 84 void addScreen(QPlatformScreen *s); 85 void setPrimaryScreen(QPlatformScreen *s); 86 87 QXcbXSettings *xSettings() const; 88 89 bool compositingActive() const; 90 workArea()91 QRect workArea() const { return m_workArea; } 92 void updateWorkArea(); 93 94 void handleXFixesSelectionNotify(xcb_xfixes_selection_notify_event_t *notify_event); 95 void subscribeToXFixesSelectionNotify(); 96 97 void handleScreenChange(xcb_randr_screen_change_notify_event_t *change_event); 98 forcedDpi()99 int forcedDpi() const { return m_forcedDpi; } hintStyle()100 QFontEngine::HintStyle hintStyle() const { return m_hintStyle; } subpixelType()101 QFontEngine::SubpixelAntialiasingType subpixelType() const { return m_subpixelType; } antialiasingEnabled()102 int antialiasingEnabled() const { return m_antialiasingEnabled; } 103 windowManagerName()104 QString windowManagerName() const { return m_windowManagerName; } 105 106 QSurfaceFormat surfaceFormatFor(const QSurfaceFormat &format) const; 107 108 const xcb_visualtype_t *visualForFormat(const QSurfaceFormat &format) const; 109 const xcb_visualtype_t *visualForId(xcb_visualid_t) const; 110 quint8 depthOfVisual(xcb_visualid_t) const; 111 xcb_colormap_t colormapForVisual(xcb_visualid_t) const; 112 113 private: 114 QRect getWorkArea() const; 115 116 static bool xResource(const QByteArray &identifier, 117 const QByteArray &expectedIdentifier, 118 QByteArray &stringValue); 119 void readXResources(); 120 121 xcb_screen_t *m_screen; 122 const int m_number; 123 QList<QPlatformScreen *> m_screens; 124 125 QXcbXSettings *m_xSettings = nullptr; 126 xcb_atom_t m_net_wm_cm_atom = 0; 127 bool m_compositingActive = false; 128 129 QRect m_workArea; 130 131 int m_forcedDpi = -1; 132 QFontEngine::HintStyle m_hintStyle = QFontEngine::HintStyle(-1); 133 QFontEngine::SubpixelAntialiasingType m_subpixelType = QFontEngine::SubpixelAntialiasingType(-1); 134 int m_antialiasingEnabled = -1; 135 QString m_windowManagerName; 136 QMap<xcb_visualid_t, xcb_visualtype_t> m_visuals; 137 QMap<xcb_visualid_t, quint8> m_visualDepths; 138 mutable QMap<xcb_visualid_t, xcb_colormap_t> m_visualColormaps; 139 uint16_t m_rotation = 0; 140 }; 141 142 class Q_XCB_EXPORT QXcbScreen : public QXcbObject, public QPlatformScreen 143 { 144 public: 145 QXcbScreen(QXcbConnection *connection, QXcbVirtualDesktop *virtualDesktop, 146 xcb_randr_output_t outputId, xcb_randr_get_output_info_reply_t *outputInfo, 147 const xcb_xinerama_screen_info_t *xineramaScreenInfo = nullptr, int xineramaScreenIdx = -1); 148 ~QXcbScreen(); 149 150 QString getOutputName(xcb_randr_get_output_info_reply_t *outputInfo); 151 152 QPixmap grabWindow(WId window, int x, int y, int width, int height) const override; 153 154 QWindow *topLevelAt(const QPoint &point) const override; 155 156 QString manufacturer() const override; 157 QString model() const override; 158 QString serialNumber() const override; 159 geometry()160 QRect geometry() const override { return m_geometry; } 161 QRect availableGeometry() const override; depth()162 int depth() const override { return screen()->root_depth; } 163 QImage::Format format() const override; physicalSize()164 QSizeF physicalSize() const override { return m_sizeMillimeters; } 165 QDpi logicalDpi() const override; logicalBaseDpi()166 QDpi logicalBaseDpi() const override { return QDpi(96, 96); }; 167 QPlatformCursor *cursor() const override; refreshRate()168 qreal refreshRate() const override { return m_refreshRate; } orientation()169 Qt::ScreenOrientation orientation() const override { return m_orientation; } virtualSiblings()170 QList<QPlatformScreen *> virtualSiblings() const override { return m_virtualDesktop->screens(); } virtualDesktop()171 QXcbVirtualDesktop *virtualDesktop() const { return m_virtualDesktop; } 172 setPrimary(bool primary)173 void setPrimary(bool primary) { m_primary = primary; } isPrimary()174 bool isPrimary() const { return m_primary; } 175 screenNumber()176 int screenNumber() const { return m_virtualDesktop->number(); } 177 static int virtualDesktopNumberStatic(const QScreen *screen); 178 screen()179 xcb_screen_t *screen() const { return m_virtualDesktop->screen(); } root()180 xcb_window_t root() const { return screen()->root; } output()181 xcb_randr_output_t output() const { return m_output; } crtc()182 xcb_randr_crtc_t crtc() const { return m_crtc; } mode()183 xcb_randr_mode_t mode() const { return m_mode; } 184 185 void setOutput(xcb_randr_output_t outputId, 186 xcb_randr_get_output_info_reply_t *outputInfo); setCrtc(xcb_randr_crtc_t crtc)187 void setCrtc(xcb_randr_crtc_t crtc) { m_crtc = crtc; } 188 189 void windowShown(QXcbWindow *window); windowManagerName()190 QString windowManagerName() const { return m_virtualDesktop->windowManagerName(); } 191 192 QSurfaceFormat surfaceFormatFor(const QSurfaceFormat &format) const; 193 visualForFormat(const QSurfaceFormat & format)194 const xcb_visualtype_t *visualForFormat(const QSurfaceFormat &format) const { return m_virtualDesktop->visualForFormat(format); } 195 const xcb_visualtype_t *visualForId(xcb_visualid_t visualid) const; colormapForVisual(xcb_visualid_t visualid)196 xcb_colormap_t colormapForVisual(xcb_visualid_t visualid) const { return m_virtualDesktop->colormapForVisual(visualid); } depthOfVisual(xcb_visualid_t visualid)197 quint8 depthOfVisual(xcb_visualid_t visualid) const { return m_virtualDesktop->depthOfVisual(visualid); } 198 name()199 QString name() const override { return m_outputName; } 200 201 void updateGeometry(const QRect &geometry, uint8_t rotation); 202 void updateGeometry(xcb_timestamp_t timestamp = XCB_TIME_CURRENT_TIME); 203 void updateAvailableGeometry(); 204 void updateRefreshRate(xcb_randr_mode_t mode); 205 hintStyle()206 QFontEngine::HintStyle hintStyle() const { return m_virtualDesktop->hintStyle(); } subpixelType()207 QFontEngine::SubpixelAntialiasingType subpixelType() const { return m_virtualDesktop->subpixelType(); } antialiasingEnabled()208 int antialiasingEnabled() const { return m_virtualDesktop->antialiasingEnabled(); } 209 210 QXcbXSettings *xSettings() const; 211 212 private: 213 void sendStartupMessage(const QByteArray &message) const; 214 int forcedDpi() const; 215 216 QByteArray getOutputProperty(xcb_atom_t atom) const; 217 QByteArray getEdid() const; 218 219 QXcbVirtualDesktop *m_virtualDesktop; 220 xcb_randr_output_t m_output; 221 xcb_randr_crtc_t m_crtc; 222 xcb_randr_mode_t m_mode = XCB_NONE; 223 bool m_primary = false; 224 225 QString m_outputName; 226 QSizeF m_outputSizeMillimeters; 227 QSizeF m_sizeMillimeters; 228 QRect m_geometry; 229 QRect m_availableGeometry; 230 Qt::ScreenOrientation m_orientation = Qt::PrimaryOrientation; 231 QXcbCursor *m_cursor; 232 qreal m_refreshRate = 60.0; 233 QEdidParser m_edid; 234 }; 235 236 #ifndef QT_NO_DEBUG_STREAM 237 Q_GUI_EXPORT QDebug operator<<(QDebug, const QXcbScreen *); 238 #endif 239 240 QT_END_NAMESPACE 241 242 #endif 243