Changeset View
Changeset View
Standalone View
Standalone View
xdgshellclient.h
Show All 19 Lines | |||||
20 | along with this program. If not, see <http://www.gnu.org/licenses/>. | 20 | along with this program. If not, see <http://www.gnu.org/licenses/>. | ||
21 | *********************************************************************/ | 21 | *********************************************************************/ | ||
22 | 22 | | |||
23 | #pragma once | 23 | #pragma once | ||
24 | 24 | | |||
25 | #include "abstract_client.h" | 25 | #include "abstract_client.h" | ||
26 | 26 | | |||
27 | #include <KWayland/Server/xdgshell_interface.h> | 27 | #include <KWayland/Server/xdgshell_interface.h> | ||
28 | #include <KWayland/Server/inputmethod_interface.h> | ||||
28 | 29 | | |||
29 | namespace KWayland | 30 | namespace KWayland | ||
30 | { | 31 | { | ||
31 | namespace Server | 32 | namespace Server | ||
32 | { | 33 | { | ||
33 | class ServerSideDecorationInterface; | 34 | class ServerSideDecorationInterface; | ||
34 | class ServerSideDecorationPaletteInterface; | 35 | class ServerSideDecorationPaletteInterface; | ||
35 | class AppMenuInterface; | 36 | class AppMenuInterface; | ||
36 | class PlasmaShellSurfaceInterface; | 37 | class PlasmaShellSurfaceInterface; | ||
37 | class XdgDecorationInterface; | 38 | class XdgDecorationInterface; | ||
38 | } | 39 | } | ||
39 | } | 40 | } | ||
40 | 41 | | |||
41 | namespace KWin | 42 | namespace KWin | ||
42 | { | 43 | { | ||
43 | 44 | | |||
44 | /** | 45 | /** | ||
45 | * @brief The reason for which the server pinged a client surface | 46 | * @brief The reason for which the server pinged a client surface | ||
46 | */ | 47 | */ | ||
47 | enum class PingReason { | 48 | enum class PingReason { | ||
48 | CloseWindow = 0, | 49 | CloseWindow = 0, | ||
49 | FocusWindow | 50 | FocusWindow | ||
50 | }; | 51 | }; | ||
51 | 52 | | |||
52 | class KWIN_EXPORT XdgShellClient : public AbstractClient | 53 | class KWIN_EXPORT WaylandClient : public AbstractClient | ||
53 | { | 54 | { | ||
54 | Q_OBJECT | 55 | Q_OBJECT | ||
55 | | ||||
56 | public: | 56 | public: | ||
57 | XdgShellClient(KWayland::Server::XdgShellSurfaceInterface *surface); | 57 | explicit WaylandClient(KWayland::Server::SurfaceInterface *surface); | ||
58 | XdgShellClient(KWayland::Server::XdgShellPopupInterface *surface); | | |||
59 | ~XdgShellClient() override; | | |||
60 | 58 | | |||
61 | QRect inputGeometry() const override; | 59 | QRect inputGeometry() const override; | ||
62 | QRect bufferGeometry() const override; | 60 | QRect bufferGeometry() const override; | ||
63 | QStringList activities() const override; | 61 | QStringList activities() const override; | ||
64 | QPoint clientContentPos() const override; | 62 | QPoint clientContentPos() const override; | ||
65 | QSize clientSize() const override; | 63 | QSize clientSize() const override; | ||
66 | QSize minSize() const override; | | |||
67 | QSize maxSize() const override; | | |||
68 | QRect transparentRect() const override; | 64 | QRect transparentRect() const override; | ||
69 | NET::WindowType windowType(bool direct = false, int supported_types = 0) const override; | 65 | NET::WindowType windowType(bool direct = false, int supported_types = 0) const override; | ||
70 | void debug(QDebug &stream) const override; | 66 | void debug(QDebug &stream) const override; | ||
71 | double opacity() const override; | 67 | double opacity() const override; | ||
72 | void setOpacity(double opacity) override; | 68 | void setOpacity(double opacity) override; | ||
73 | QByteArray windowRole() const override; | 69 | QByteArray windowRole() const override; | ||
74 | void blockActivityUpdates(bool b = true) override; | 70 | void blockActivityUpdates(bool b = true) override; | ||
75 | QString captionNormal() const override; | 71 | QString captionNormal() const override; | ||
76 | QString captionSuffix() const override; | 72 | QString captionSuffix() const override; | ||
77 | void closeWindow() override; | | |||
78 | AbstractClient *findModal(bool allow_itself = false) override; | 73 | AbstractClient *findModal(bool allow_itself = false) override; | ||
79 | bool isCloseable() const override; | | |||
80 | bool isFullScreenable() const override; | 74 | bool isFullScreenable() const override; | ||
81 | bool isFullScreen() const override; | | |||
82 | bool isMaximizable() const override; | 75 | bool isMaximizable() const override; | ||
83 | bool isMinimizable() const override; | 76 | bool isFullScreen() const override; | ||
84 | bool isMovable() const override; | | |||
85 | bool isMovableAcrossScreens() const override; | | |||
86 | bool isResizable() const override; | | |||
87 | bool isShown(bool shaded_is_shown) const override; | 77 | bool isShown(bool shaded_is_shown) const override; | ||
88 | bool isHiddenInternal() const override; | 78 | bool isHiddenInternal() const override; | ||
89 | void hideClient(bool hide) override; | 79 | void hideClient(bool hide) override; | ||
90 | MaximizeMode maximizeMode() const override; | 80 | MaximizeMode maximizeMode() const override; | ||
91 | MaximizeMode requestedMaximizeMode() const override; | 81 | MaximizeMode requestedMaximizeMode() const override; | ||
92 | bool noBorder() const override; | | |||
93 | void setFullScreen(bool set, bool user = true) override; | 82 | void setFullScreen(bool set, bool user = true) override; | ||
94 | void setNoBorder(bool set) override; | 83 | void setNoBorder(bool set) override; | ||
95 | void updateDecoration(bool check_workspace_pos, bool force = false) override; | 84 | void updateDecoration(bool check_workspace_pos, bool force = false) override; | ||
96 | void setOnAllActivities(bool set) override; | 85 | void setOnAllActivities(bool set) override; | ||
97 | void takeFocus() override; | 86 | void takeFocus() override; | ||
98 | bool userCanSetFullScreen() const override; | | |||
99 | bool userCanSetNoBorder() const override; | | |||
100 | bool wantsInput() const override; | 87 | bool wantsInput() const override; | ||
101 | bool dockWantsInput() const override; | | |||
102 | using AbstractClient::resizeWithChecks; | 88 | using AbstractClient::resizeWithChecks; | ||
103 | void resizeWithChecks(int w, int h, ForceGeometry_t force = NormalGeometrySet) override; | 89 | void resizeWithChecks(int w, int h, ForceGeometry_t force = NormalGeometrySet) override; | ||
104 | using AbstractClient::setFrameGeometry; | 90 | using AbstractClient::setFrameGeometry; | ||
105 | void setFrameGeometry(int x, int y, int w, int h, ForceGeometry_t force = NormalGeometrySet) override; | 91 | void setFrameGeometry(int x, int y, int w, int h, ForceGeometry_t force = NormalGeometrySet) override; | ||
106 | bool hasStrut() const override; | | |||
107 | quint32 windowId() const override; | 92 | quint32 windowId() const override; | ||
108 | pid_t pid() const override; | 93 | pid_t pid() const override; | ||
109 | bool isLockScreen() const override; | 94 | bool isLockScreen() const override; | ||
110 | bool isInputMethod() const override; | 95 | bool isInputMethod() const override; | ||
111 | bool isInitialPositionSet() const override; | | |||
112 | bool isTransient() const override; | 96 | bool isTransient() const override; | ||
113 | bool hasTransientPlacementHint() const override; | | |||
114 | QRect transientPlacement(const QRect &bounds) const override; | | |||
115 | QMatrix4x4 inputTransformation() const override; | 97 | QMatrix4x4 inputTransformation() const override; | ||
116 | void showOnScreenEdge() override; | | |||
117 | bool hasPopupGrab() const override; | 98 | bool hasPopupGrab() const override; | ||
118 | void popupDone() override; | | |||
119 | void updateColorScheme() override; | 99 | void updateColorScheme() override; | ||
120 | bool isPopupWindow() const override; | | |||
121 | void killWindow() override; | 100 | void killWindow() override; | ||
122 | bool isLocalhost() const override; | 101 | bool isLocalhost() const override; | ||
123 | bool supportsWindowRules() const override; | | |||
124 | void destroyClient() override; | 102 | void destroyClient() override; | ||
125 | 103 | | |||
126 | void installPlasmaShellSurface(KWayland::Server::PlasmaShellSurfaceInterface *surface); | | |||
127 | void installServerSideDecoration(KWayland::Server::ServerSideDecorationInterface *decoration); | | |||
128 | void installAppMenu(KWayland::Server::AppMenuInterface *appmenu); | | |||
129 | void installPalette(KWayland::Server::ServerSideDecorationPaletteInterface *palette); | | |||
130 | void installXdgDecoration(KWayland::Server::XdgDecorationInterface *decoration); | | |||
131 | | ||||
132 | protected: | 104 | protected: | ||
133 | void addDamage(const QRegion &damage) override; | 105 | void addDamage(const QRegion &damage) override; | ||
134 | bool belongsToSameApplication(const AbstractClient *other, SameApplicationChecks checks) const override; | 106 | bool belongsToSameApplication(const AbstractClient *other, SameApplicationChecks checks) const override; | ||
135 | void doSetActive() override; | 107 | void doSetActive() override; | ||
136 | bool belongsToDesktop() const override; | 108 | bool belongsToDesktop() const override; | ||
137 | Layer layerForDock() const override; | | |||
138 | void changeMaximize(bool horizontal, bool vertical, bool adjust) override; | 109 | void changeMaximize(bool horizontal, bool vertical, bool adjust) override; | ||
139 | void doResizeSync() override; | 110 | void doResizeSync() override; | ||
140 | bool acceptsFocus() const override; | | |||
141 | void doMinimize() override; | 111 | void doMinimize() override; | ||
142 | void updateCaption() override; | 112 | void updateCaption() override; | ||
143 | void doMove(int x, int y) override; | 113 | void doMove(int x, int y) override; | ||
144 | 114 | | |||
145 | private Q_SLOTS: | 115 | protected Q_SLOTS: | ||
146 | void handleConfigureAcknowledged(quint32 serial); | 116 | void handleConfigureAcknowledged(quint32 serial); | ||
147 | void handleTransientForChanged(); | 117 | void handleTransientForChanged(); | ||
148 | void handleWindowClassChanged(const QByteArray &windowClass); | 118 | void handleWindowClassChanged(const QByteArray &windowClass); | ||
149 | void handleWindowGeometryChanged(const QRect &windowGeometry); | 119 | void handleWindowGeometryChanged(const QRect &windowGeometry); | ||
150 | void handleWindowTitleChanged(const QString &title); | 120 | void handleWindowTitleChanged(const QString &title); | ||
151 | void handleMoveRequested(KWayland::Server::SeatInterface *seat, quint32 serial); | 121 | void handleMoveRequested(KWayland::Server::SeatInterface *seat, quint32 serial); | ||
152 | void handleResizeRequested(KWayland::Server::SeatInterface *seat, quint32 serial, Qt::Edges edges); | 122 | void handleResizeRequested(KWayland::Server::SeatInterface *seat, quint32 serial, Qt::Edges edges); | ||
153 | void handleMinimizeRequested(); | 123 | void handleMinimizeRequested(); | ||
154 | void handleMaximizeRequested(bool maximized); | 124 | void handleMaximizeRequested(bool maximized); | ||
155 | void handleFullScreenRequested(bool fullScreen, KWayland::Server::OutputInterface *output); | 125 | void handleFullScreenRequested(bool fullScreen, KWayland::Server::OutputInterface *output); | ||
156 | void handleWindowMenuRequested(KWayland::Server::SeatInterface *seat, quint32 serial, const QPoint &surfacePos); | 126 | void handleWindowMenuRequested(KWayland::Server::SeatInterface *seat, quint32 serial, const QPoint &surfacePos); | ||
157 | void handleGrabRequested(KWayland::Server::SeatInterface *seat, quint32 serial); | 127 | void handleGrabRequested(KWayland::Server::SeatInterface *seat, quint32 serial); | ||
158 | void handlePingDelayed(quint32 serial); | | |||
159 | void handlePingTimeout(quint32 serial); | | |||
160 | void handlePongReceived(quint32 serial); | | |||
161 | void handleCommitted(); | 128 | void handleCommitted(); | ||
162 | 129 | | |||
163 | private: | 130 | protected: | ||
164 | /** | | |||
165 | * Called when the shell is created. | | |||
166 | */ | | |||
167 | void init(); | 131 | void init(); | ||
132 | virtual void initType() {} | ||||
168 | /** | 133 | /** | ||
169 | * Called for the XDG case when the shell surface is committed to the surface. | 134 | * Called for the when the surface is committed to the surface. | ||
170 | * At this point all initial properties should have been set by the client. | 135 | * At this point all initial properties should have been set by the client. | ||
171 | */ | 136 | */ | ||
172 | void finishInit(); | 137 | void finishInit(); | ||
173 | void createWindowId(); | 138 | void createWindowId(); | ||
174 | void updateIcon(); | 139 | void updateIcon(); | ||
175 | bool shouldExposeToWindowManagement(); | | |||
176 | void updateClientOutputs(); | 140 | void updateClientOutputs(); | ||
177 | KWayland::Server::XdgShellSurfaceInterface::States xdgSurfaceStates() const; | 141 | KWayland::Server::XdgShellSurfaceInterface::States xdgSurfaceStates() const; | ||
178 | void updateShowOnScreenEdge(); | | |||
179 | void updateMaximizeMode(MaximizeMode maximizeMode); | 142 | void updateMaximizeMode(MaximizeMode maximizeMode); | ||
180 | // called on surface commit and processes all m_pendingConfigureRequests up to m_lastAckedConfigureReqest | 143 | // called on surface commit and processes all m_pendingConfigureRequests up to m_lastAckedConfigureReqest | ||
181 | void updatePendingGeometry(); | 144 | void updatePendingGeometry(); | ||
182 | QPoint popupOffset(const QRect &anchorRect, const Qt::Edges anchorEdge, const Qt::Edges gravity, const QSize popupSize) const; | | |||
183 | void requestGeometry(const QRect &rect); | 145 | void requestGeometry(const QRect &rect); | ||
184 | void doSetGeometry(const QRect &rect); | 146 | void doSetGeometry(const QRect &rect); | ||
185 | void unmap(); | 147 | void unmap(); | ||
186 | void markAsMapped(); | 148 | void markAsMapped(); | ||
187 | QRect determineBufferGeometry() const; | 149 | QRect determineBufferGeometry() const; | ||
188 | void ping(PingReason reason); | 150 | static void deleteClient(WaylandClient *c); | ||
189 | static void deleteClient(XdgShellClient *c); | | |||
190 | 151 | | |||
191 | QRect adjustMoveGeometry(const QRect &rect) const; | 152 | QRect adjustMoveGeometry(const QRect &rect) const; | ||
192 | QRect adjustResizeGeometry(const QRect &rect) const; | 153 | QRect adjustResizeGeometry(const QRect &rect) const; | ||
193 | 154 | | |||
194 | KWayland::Server::XdgShellSurfaceInterface *m_xdgShellToplevel; | 155 | virtual void aboutToActivate() {} | ||
195 | KWayland::Server::XdgShellPopupInterface *m_xdgShellPopup; | 156 | virtual void refreshDecoration() {} | ||
157 | virtual KWayland::Server::SurfaceInterface *findTransientSurface() { return nullptr; } | ||||
158 | virtual bool shouldExposeToWindowManagement(); | ||||
159 | | ||||
160 | /** | ||||
161 | * @returns the serial of the configure call | ||||
162 | */ | ||||
163 | virtual int configureResize(const QSize &size, const QRect &newGeometry) | ||||
164 | { | ||||
165 | Q_UNUSED(size); | ||||
166 | Q_UNUSED(newGeometry); | ||||
167 | return 0; | ||||
168 | } | ||||
169 | | ||||
170 | class RequestGeometryBlocker { | ||||
171 | public: | ||||
172 | RequestGeometryBlocker(WaylandClient *client) | ||||
173 | : m_client(client) | ||||
174 | { | ||||
175 | m_client->m_requestGeometryBlockCounter++; | ||||
176 | } | ||||
177 | ~RequestGeometryBlocker() | ||||
178 | { | ||||
179 | m_client->m_requestGeometryBlockCounter--; | ||||
180 | if (m_client->m_requestGeometryBlockCounter == 0) { | ||||
181 | m_client->requestGeometry(m_client->m_blockedRequestGeometry); | ||||
182 | } | ||||
183 | } | ||||
184 | private: | ||||
185 | WaylandClient *m_client; | ||||
186 | }; | ||||
196 | 187 | | |||
197 | QRect m_bufferGeometry; | 188 | QRect m_bufferGeometry; | ||
198 | QRect m_windowGeometry; | 189 | QRect m_windowGeometry; | ||
199 | bool m_hasWindowGeometry = false; | 190 | bool m_hasWindowGeometry = false; | ||
200 | 191 | | |||
201 | // last size we requested or empty if we haven't sent an explicit request to the client | 192 | // last size we requested or empty if we haven't sent an explicit request to the client | ||
202 | // if empty the client should choose their own default size | 193 | // if empty the client should choose their own default size | ||
203 | QSize m_requestedClientSize = QSize(0, 0); | 194 | QSize m_requestedClientSize = QSize(0, 0); | ||
Show All 14 Lines | |||||
218 | //mode we currently want to be, could be pending on client updating, could be not sent yet | 209 | //mode we currently want to be, could be pending on client updating, could be not sent yet | ||
219 | MaximizeMode m_requestedMaximizeMode = MaximizeRestore; | 210 | MaximizeMode m_requestedMaximizeMode = MaximizeRestore; | ||
220 | 211 | | |||
221 | QRect m_geomFsRestore; //size and position of the window before it was set to fullscreen | 212 | QRect m_geomFsRestore; //size and position of the window before it was set to fullscreen | ||
222 | bool m_closing = false; | 213 | bool m_closing = false; | ||
223 | quint32 m_windowId = 0; | 214 | quint32 m_windowId = 0; | ||
224 | bool m_unmapped = true; | 215 | bool m_unmapped = true; | ||
225 | NET::WindowType m_windowType = NET::Normal; | 216 | NET::WindowType m_windowType = NET::Normal; | ||
226 | QPointer<KWayland::Server::PlasmaShellSurfaceInterface> m_plasmaShellSurface; | 217 | | ||
227 | QPointer<KWayland::Server::AppMenuInterface> m_appMenuInterface; | | |||
228 | QPointer<KWayland::Server::ServerSideDecorationPaletteInterface> m_paletteInterface; | | |||
229 | KWayland::Server::ServerSideDecorationInterface *m_serverDecoration = nullptr; | | |||
230 | KWayland::Server::XdgDecorationInterface *m_xdgDecoration = nullptr; | | |||
231 | bool m_userNoBorder = false; | 218 | bool m_userNoBorder = false; | ||
232 | bool m_fullScreen = false; | 219 | bool m_fullScreen = false; | ||
233 | bool m_transient = false; | 220 | bool m_transient = false; | ||
234 | bool m_hidden = false; | 221 | bool m_hidden = false; | ||
235 | bool m_hasPopupGrab = false; | 222 | bool m_hasPopupGrab = false; | ||
236 | qreal m_opacity = 1.0; | 223 | qreal m_opacity = 1.0; | ||
237 | 224 | | |||
238 | class RequestGeometryBlocker { //TODO rename ConfigureBlocker when this class is Xdg only | | |||
239 | public: | | |||
240 | RequestGeometryBlocker(XdgShellClient *client) | | |||
241 | : m_client(client) | | |||
242 | { | | |||
243 | m_client->m_requestGeometryBlockCounter++; | | |||
244 | } | | |||
245 | ~RequestGeometryBlocker() | | |||
246 | { | | |||
247 | m_client->m_requestGeometryBlockCounter--; | | |||
248 | if (m_client->m_requestGeometryBlockCounter == 0) { | | |||
249 | m_client->requestGeometry(m_client->m_blockedRequestGeometry); | | |||
250 | } | | |||
251 | } | | |||
252 | private: | | |||
253 | XdgShellClient *m_client; | | |||
254 | }; | | |||
255 | friend class RequestGeometryBlocker; | | |||
256 | int m_requestGeometryBlockCounter = 0; | 225 | int m_requestGeometryBlockCounter = 0; | ||
257 | QRect m_blockedRequestGeometry; | 226 | QRect m_blockedRequestGeometry; | ||
227 | bool m_isInitialized = false; | ||||
228 | | ||||
258 | QString m_caption; | 229 | QString m_caption; | ||
259 | QString m_captionSuffix; | 230 | QString m_captionSuffix; | ||
260 | QHash<quint32, PingReason> m_pingSerials; | 231 | QHash<quint32, PingReason> m_pingSerials; | ||
232 | }; | ||||
261 | 233 | | |||
262 | bool m_isInitialized = false; | 234 | class KWIN_EXPORT XdgShellClient : public WaylandClient | ||
235 | { | ||||
236 | Q_OBJECT | ||||
237 | | ||||
238 | public: | ||||
239 | explicit XdgShellClient(KWayland::Server::XdgShellSurfaceInterface *surface); | ||||
240 | explicit XdgShellClient(KWayland::Server::XdgShellPopupInterface *surface); | ||||
241 | ~XdgShellClient() override; | ||||
242 | | ||||
243 | void initType() override; | ||||
244 | | ||||
245 | void installPlasmaShellSurface(KWayland::Server::PlasmaShellSurfaceInterface *surface); | ||||
246 | void installServerSideDecoration(KWayland::Server::ServerSideDecorationInterface *decoration); | ||||
247 | void installAppMenu(KWayland::Server::AppMenuInterface *appmenu); | ||||
248 | void installPalette(KWayland::Server::ServerSideDecorationPaletteInterface *palette); | ||||
249 | void installXdgDecoration(KWayland::Server::XdgDecorationInterface *decoration); | ||||
250 | | ||||
251 | private: | ||||
252 | bool acceptsFocus() const override; | ||||
253 | void closeWindow() override; | ||||
254 | int configureResize(const QSize &size, const QRect &newGeometry) override; | ||||
255 | void destroyClient() override; | ||||
256 | bool dockWantsInput() const override; | ||||
257 | bool hasStrut() const override; | ||||
258 | bool hasTransientPlacementHint() const override; | ||||
259 | bool isCloseable() const override; | ||||
260 | bool isInitialPositionSet() const override; | ||||
261 | bool isMinimizable() const override; | ||||
262 | bool isMovable() const override; | ||||
263 | bool isMovableAcrossScreens() const override; | ||||
264 | bool isPopupWindow() const override; | ||||
265 | bool isResizable() const override; | ||||
266 | Layer layerForDock() const override; | ||||
267 | QSize minSize() const override; | ||||
268 | QSize maxSize() const override; | ||||
269 | bool noBorder() const override; | ||||
270 | void popupDone() override; | ||||
271 | void showOnScreenEdge() override; | ||||
272 | bool supportsWindowRules() const override; | ||||
273 | void updateColorScheme() override; | ||||
274 | bool userCanSetFullScreen() const override; | ||||
275 | bool userCanSetNoBorder() const override; | ||||
276 | | ||||
277 | void aboutToActivate() override; | ||||
278 | void refreshDecoration() override; | ||||
279 | bool shouldExposeToWindowManagement() override; | ||||
280 | KWayland::Server::SurfaceInterface *findTransientSurface() override; | ||||
281 | QRect transientPlacement(const QRect &bounds) const override; | ||||
282 | | ||||
283 | void handlePingDelayed(quint32 serial); | ||||
284 | void handlePingTimeout(quint32 serial); | ||||
285 | void handlePongReceived(quint32 serial); | ||||
286 | QPoint popupOffset(const QRect &anchorRect, const Qt::Edges anchorEdge, const Qt::Edges gravity, const QSize popupSize) const; | ||||
287 | void ping(PingReason reason); | ||||
288 | void updateShowOnScreenEdge(); | ||||
289 | | ||||
290 | KWayland::Server::XdgShellSurfaceInterface *m_xdgShellToplevel; | ||||
291 | KWayland::Server::XdgShellPopupInterface *m_xdgShellPopup; | ||||
292 | | ||||
293 | QPointer<KWayland::Server::PlasmaShellSurfaceInterface> m_plasmaShellSurface; | ||||
294 | QPointer<KWayland::Server::AppMenuInterface> m_appMenuInterface; | ||||
295 | QPointer<KWayland::Server::ServerSideDecorationPaletteInterface> m_paletteInterface; | ||||
296 | KWayland::Server::ServerSideDecorationInterface *m_serverDecoration = nullptr; | ||||
297 | KWayland::Server::XdgDecorationInterface *m_xdgDecoration = nullptr; | ||||
263 | 298 | | |||
264 | friend class Workspace; | 299 | friend class Workspace; | ||
265 | }; | 300 | }; | ||
266 | 301 | | |||
267 | } | 302 | } | ||
268 | 303 | | |||
269 | Q_DECLARE_METATYPE(KWin::XdgShellClient *) | 304 | Q_DECLARE_METATYPE(KWin::XdgShellClient *) |