1 /* 2 SPDX-FileCopyrightText: 2018 David Edmundson <kde@davidedmundson.co.uk> 3 4 SPDX-License-Identifier: LGPL-2.1-only OR LGPL-3.0-only OR LicenseRef-KDE-Accepted-LGPL 5 */ 6 #ifndef KWAYLAND_CLIENT_XDGOUTPUT_H 7 #define KWAYLAND_CLIENT_XDGOUTPUT_H 8 9 #include <QObject> 10 #include <QPoint> 11 #include <QSize> 12 13 #include <KWayland/Client/kwaylandclient_export.h> 14 15 struct zxdg_output_manager_v1; 16 struct zxdg_output_v1; 17 18 namespace KWayland 19 { 20 namespace Client 21 { 22 class EventQueue; 23 class XdgOutput; 24 class Output; 25 26 /** 27 * @short Wrapper for the zxdg_output_manager_v1 interface. 28 * 29 * This class provides a convenient wrapper for the zxdg_output_manager_v1 interface. 30 * 31 * This provides the logical size of the output. This is useful in case it doesn't match the 32 * pixelSize / outputScale. 33 * 34 * To use this class one needs to interact with the Registry. There are two 35 * possible ways to create the XdgOutputManager interface: 36 * @code 37 * XdgOutputManager *c = registry->createXdgOutputManager(name, version); 38 * @endcode 39 * 40 * This creates the XdgOutputManager and sets it up directly. As an alternative this 41 * can also be done in a more low level way: 42 * @code 43 * XdgOutputManager *c = new XdgOutputManager; 44 * c->setup(registry->bindXdgOutputManager(name, version)); 45 * @endcode 46 * 47 * The XdgOutputManager can be used as a drop-in replacement for any zxdg_output_manager_v1 48 * pointer as it provides matching cast operators. 49 * 50 * @since 5.47 51 * 52 * @see Registry 53 **/ 54 class KWAYLANDCLIENT_EXPORT XdgOutputManager : public QObject 55 { 56 Q_OBJECT 57 public: 58 /** 59 * Creates a new XdgOutputManager. 60 * Note: after constructing the XdgOutputManager it is not yet valid and one needs 61 * to call setup. In order to get a ready to use XdgOutputManager prefer using 62 * Registry::createXdgOutputManager. 63 **/ 64 explicit XdgOutputManager(QObject *parent = nullptr); 65 ~XdgOutputManager() override; 66 67 /** 68 * Setup this XdgOutputManager to manage the @p xdgoutputmanager. 69 * When using Registry::createXdgOutputManager there is no need to call this 70 * method. 71 **/ 72 void setup(zxdg_output_manager_v1 *xdgoutputmanager); 73 /** 74 * @returns @c true if managing a zxdg_output_manager_v1. 75 **/ 76 bool isValid() const; 77 /** 78 * Releases the zxdg_output_manager_v1 interface. 79 * After the interface has been released the XdgOutputManager instance is no 80 * longer valid and can be setup with another zxdg_output_manager_v1 interface. 81 **/ 82 void release(); 83 /** 84 * Destroys the data held by this XdgOutputManager. 85 * This method is supposed to be used when the connection to the Wayland 86 * server goes away. If the connection is not valid anymore, it's not 87 * possible to call release anymore as that calls into the Wayland 88 * connection and the call would fail. This method cleans up the data, so 89 * that the instance can be deleted or set up to a new zxdg_output_manager_v1 interface 90 * once there is a new connection available. 91 * 92 * It is suggested to connect this method to ConnectionThread::connectionDied: 93 * @code 94 * connect(connection, &ConnectionThread::connectionDied, xdgoutputmanager, &XdgOutputManager::destroy); 95 * @endcode 96 * 97 * @see release 98 **/ 99 void destroy(); 100 101 /** 102 * Sets the @p queue to use for creating objects with this XdgOutputManager. 103 **/ 104 void setEventQueue(EventQueue *queue); 105 /** 106 * @returns The event queue to use for creating objects with this XdgOutputManager. 107 **/ 108 EventQueue *eventQueue(); 109 110 XdgOutput *getXdgOutput(Output *output, QObject *parent = nullptr); 111 112 operator zxdg_output_manager_v1 *(); 113 operator zxdg_output_manager_v1 *() const; 114 115 Q_SIGNALS: 116 /** 117 * The corresponding global for this interface on the Registry got removed. 118 * 119 * This signal gets only emitted if the XdgOutputManager got created by 120 * Registry::createXdgOutputManager 121 **/ 122 void removed(); 123 124 private: 125 class Private; 126 QScopedPointer<Private> d; 127 }; 128 129 /** 130 * @short Wrapper for the zxdg_output_v1 interface. 131 * 132 * This class provides a convenient wrapper for the zxdg_output_v1 interface. 133 * 134 * The XdgOutputManager can be used as a drop-in replacement for any zxdg_output_v1 135 * pointer as it provides matching cast operators. 136 * 137 * This protocol provides a potentially more correct size and position of the screen 138 * than Output with respect to scaling. 139 * 140 * @see Registry 141 **/ 142 143 class KWAYLANDCLIENT_EXPORT XdgOutput : public QObject 144 { 145 Q_OBJECT 146 public: 147 ~XdgOutput() override; 148 149 /** 150 * Setup this XdgOutput to manage the @p xdgoutput. 151 * When using XdgOutputManager::createXdgOutput there is no need to call this 152 * method. 153 **/ 154 void setup(zxdg_output_v1 *xdgoutput); 155 /** 156 * @returns @c true if managing a zxdg_output_v1. 157 **/ 158 bool isValid() const; 159 /** 160 * Releases the zxdg_output_v1 interface. 161 * After the interface has been released the XdgOutput instance is no 162 * longer valid and can be setup with another zxdg_output_v1 interface. 163 **/ 164 void release(); 165 /** 166 * Destroys the data held by this XdgOutput. 167 * This method is supposed to be used when the connection to the Wayland 168 * server goes away. If the connection is not valid anymore, it's not 169 * possible to call release anymore as that calls into the Wayland 170 * connection and the call would fail. This method cleans up the data, so 171 * that the instance can be deleted or set up to a new zxdg_output_v1 interface 172 * once there is a new connection available. 173 * 174 * It is suggested to connect this method to ConnectionThread::connectionDied: 175 * @code 176 * connect(connection, &ConnectionThread::connectionDied, xdgoutput, &XdgOutput::destroy); 177 * @endcode 178 * 179 * @see release 180 **/ 181 void destroy(); 182 183 operator zxdg_output_v1 *(); 184 operator zxdg_output_v1 *() const; 185 186 /** 187 * The top left position of the output in compositor coordinates 188 */ 189 QPoint logicalPosition() const; 190 191 /** 192 * The size of the output in compositor coordinates 193 * (i.e pixel size / output scale) 194 */ 195 QSize logicalSize() const; 196 197 /** 198 * A consistent unique name for this monitor 199 * @since 5.XDGOUTPUT 200 */ 201 QString name() const; 202 203 /** 204 * A longer human readable description 205 * @since 5.XDGOUTPUT 206 */ 207 QString description() const; 208 209 Q_SIGNALS: 210 /** 211 * Emitted when any of the attributes have changed 212 */ 213 void changed(); 214 215 private: 216 friend class XdgOutputManager; 217 explicit XdgOutput(QObject *parent = nullptr); 218 class Private; 219 QScopedPointer<Private> d; 220 }; 221 222 } 223 } 224 225 #endif 226