6 #include "../compat/wayland-xdg-shell-v5-client-protocol.h"
7 #include "event_queue.h"
11 #include "wayland_pointer_p.h"
12 #include "xdgshell_p.h"
18 class XdgShellUnstableV5::Private :
public XdgShell::Private
21 void setupV5(xdg_shell *shell)
override;
23 void destroy()
override;
25 XdgShellSurface *getXdgSurface(Surface *surface,
QObject *parent)
override;
26 XdgShellPopup *getXdgPopup(Surface *surface, Surface *parentSurface, Seat *seat, quint32 serial,
const QPoint &parentPos,
QObject *parent)
override;
28 using XdgShell::Private::operator xdg_wm_base *;
29 using XdgShell::Private::operator zxdg_shell_v6 *;
30 operator xdg_shell *()
override
34 operator xdg_shell *()
const override
39 static void pingCallback(
void *data,
struct xdg_shell *shell, uint32_t serial);
41 WaylandPointer<xdg_shell, zxdg_shell_v5_destroy> xdgshellv5;
42 static const struct zxdg_shell_v5_listener s_shellListener;
45 const struct zxdg_shell_v5_listener XdgShellUnstableV5::Private::s_shellListener = {
49 void XdgShellUnstableV5::Private::pingCallback(
void *data,
struct xdg_shell *shell, uint32_t serial)
52 zxdg_shell_v5_pong(shell, serial);
55 void XdgShellUnstableV5::Private::setupV5(xdg_shell *shell)
58 Q_ASSERT(!xdgshellv5);
59 xdgshellv5.setup(shell);
60 zxdg_shell_v5_use_unstable_version(xdgshellv5, 5);
61 zxdg_shell_v5_add_listener(shell, &s_shellListener,
this);
69 void XdgShellUnstableV5::Private::destroy()
74 bool XdgShellUnstableV5::Private::isValid()
const
76 return xdgshellv5.isValid();
79 XdgShellSurface *XdgShellUnstableV5::Private::getXdgSurface(Surface *surface,
QObject *parent)
82 XdgShellSurface *s =
new XdgShellSurfaceUnstableV5(parent);
83 auto w = zxdg_shell_v5_get_xdg_surface(xdgshellv5, *surface);
92 XdgShellUnstableV5::Private::getXdgPopup(Surface *surface, Surface *parentSurface, Seat *seat, quint32 serial,
const QPoint &parentPos,
QObject *parent)
95 XdgShellPopup *s =
new XdgShellPopupUnstableV5(parent);
96 auto w = zxdg_shell_v5_get_xdg_popup(xdgshellv5, *surface, *parentSurface, *seat, serial, parentPos.
x(), parentPos.
y());
104 XdgShellUnstableV5::XdgShellUnstableV5(
QObject *parent)
105 : XdgShell(new Private, parent)
109 XdgShellUnstableV5::~XdgShellUnstableV5() =
default;
111 class XdgShellSurfaceUnstableV5::Private :
public XdgShellSurface::Private
114 Private(XdgShellSurface *q);
115 WaylandPointer<xdg_surface, zxdg_surface_v5_destroy> xdgsurfacev5;
117 void setupV5(xdg_surface *surface)
override;
119 void destroy()
override;
122 using XdgShellSurface::Private::operator zxdg_surface_v6 *;
123 using XdgShellSurface::Private::operator zxdg_toplevel_v6 *;
124 using XdgShellSurface::Private::operator xdg_toplevel *;
125 operator xdg_surface *()
override
129 operator xdg_surface *()
const override
134 void setTransientFor(XdgShellSurface *parent)
override;
135 void setTitle(
const QString &title)
override;
136 void setAppId(
const QByteArray &appId)
override;
137 void showWindowMenu(Seat *seat, quint32 serial, qint32 x, qint32 y)
override;
138 void move(Seat *seat, quint32 serial)
override;
139 void resize(Seat *seat, quint32 serial,
Qt::Edges edges)
override;
140 void ackConfigure(quint32 serial)
override;
141 void setMaximized()
override;
142 void unsetMaximized()
override;
143 void setFullscreen(Output *output)
override;
144 void unsetFullscreen()
override;
145 void setMinimized()
override;
146 void setMaxSize(
const QSize &size)
override;
147 void setMinSize(
const QSize &size)
override;
150 static void configureCallback(
void *data, xdg_surface *xdg_surface, int32_t width, int32_t height, wl_array *states, uint32_t serial);
151 static void closeCallback(
void *data, xdg_surface *xdg_surface);
153 static const struct zxdg_surface_v5_listener s_listener;
156 const struct zxdg_surface_v5_listener XdgShellSurfaceUnstableV5::Private::s_listener = {configureCallback, closeCallback};
158 void XdgShellSurfaceUnstableV5::Private::configureCallback(
void *data,
159 xdg_surface *xdg_surface,
165 auto s =
reinterpret_cast<XdgShellSurfaceUnstableV5::Private *
>(data);
166 Q_ASSERT(s->xdgsurfacev5 == xdg_surface);
167 uint32_t *state =
reinterpret_cast<uint32_t *
>(wlStates->data);
168 size_t numStates = wlStates->size /
sizeof(uint32_t);
170 for (
size_t i = 0; i < numStates; i++) {
173 states = states | XdgShellSurface::State::Maximized;
176 states = states | XdgShellSurface::State::Fullscreen;
179 states = states | XdgShellSurface::State::Resizing;
182 states = states | XdgShellSurface::State::Activated;
187 Q_EMIT s->q->configureRequested(size, states, serial);
193 void XdgShellSurfaceUnstableV5::Private::closeCallback(
void *data, xdg_surface *xdg_surface)
195 auto s =
reinterpret_cast<XdgShellSurfaceUnstableV5::Private *
>(data);
196 Q_ASSERT(s->xdgsurfacev5 == xdg_surface);
197 Q_EMIT s->q->closeRequested();
200 XdgShellSurfaceUnstableV5::Private::Private(XdgShellSurface *q)
201 : XdgShellSurface::Private(q)
205 void XdgShellSurfaceUnstableV5::Private::setupV5(xdg_surface *surface)
208 Q_ASSERT(!xdgsurfacev5);
209 xdgsurfacev5.setup(surface);
210 zxdg_surface_v5_add_listener(xdgsurfacev5, &s_listener,
this);
215 xdgsurfacev5.release();
218 void XdgShellSurfaceUnstableV5::Private::destroy()
220 xdgsurfacev5.destroy();
223 bool XdgShellSurfaceUnstableV5::Private::isValid()
const
225 return xdgsurfacev5.isValid();
228 void XdgShellSurfaceUnstableV5::Private::setTransientFor(XdgShellSurface *parent)
230 xdg_surface *parentSurface =
nullptr;
232 parentSurface = *parent;
234 zxdg_surface_v5_set_parent(xdgsurfacev5, parentSurface);
237 void XdgShellSurfaceUnstableV5::Private::setTitle(
const QString &title)
242 void XdgShellSurfaceUnstableV5::Private::setAppId(
const QByteArray &appId)
244 zxdg_surface_v5_set_app_id(xdgsurfacev5, appId.
constData());
247 void XdgShellSurfaceUnstableV5::Private::showWindowMenu(Seat *seat, quint32 serial, qint32 x, qint32 y)
249 zxdg_surface_v5_show_window_menu(xdgsurfacev5, *seat, serial, x, y);
252 void XdgShellSurfaceUnstableV5::Private::move(Seat *seat, quint32 serial)
254 zxdg_surface_v5_move(xdgsurfacev5, *seat, serial);
257 void XdgShellSurfaceUnstableV5::Private::resize(Seat *seat, quint32 serial,
Qt::Edges edges)
259 uint wlEdge = ZXDG_SURFACE_V5_RESIZE_EDGE_NONE;
262 wlEdge = ZXDG_SURFACE_V5_RESIZE_EDGE_TOP_LEFT;
264 wlEdge = ZXDG_SURFACE_V5_RESIZE_EDGE_TOP_RIGHT;
266 wlEdge = ZXDG_SURFACE_V5_RESIZE_EDGE_TOP;
270 wlEdge = ZXDG_SURFACE_V5_RESIZE_EDGE_BOTTOM_LEFT;
272 wlEdge = ZXDG_SURFACE_V5_RESIZE_EDGE_BOTTOM_RIGHT;
274 wlEdge = ZXDG_SURFACE_V5_RESIZE_EDGE_BOTTOM;
277 wlEdge = ZXDG_SURFACE_V5_RESIZE_EDGE_RIGHT;
279 wlEdge = ZXDG_SURFACE_V5_RESIZE_EDGE_LEFT;
281 zxdg_surface_v5_resize(xdgsurfacev5, *seat, serial, wlEdge);
284 void XdgShellSurfaceUnstableV5::Private::ackConfigure(quint32 serial)
286 zxdg_surface_v5_ack_configure(xdgsurfacev5, serial);
289 void XdgShellSurfaceUnstableV5::Private::setMaximized()
291 zxdg_surface_v5_set_maximized(xdgsurfacev5);
294 void XdgShellSurfaceUnstableV5::Private::unsetMaximized()
296 zxdg_surface_v5_unset_maximized(xdgsurfacev5);
299 void XdgShellSurfaceUnstableV5::Private::setFullscreen(Output *output)
301 wl_output *o =
nullptr;
305 zxdg_surface_v5_set_fullscreen(xdgsurfacev5, o);
308 void XdgShellSurfaceUnstableV5::Private::unsetFullscreen()
310 zxdg_surface_v5_unset_fullscreen(xdgsurfacev5);
313 void XdgShellSurfaceUnstableV5::Private::setMinimized()
315 zxdg_surface_v5_set_minimized(xdgsurfacev5);
318 void XdgShellSurfaceUnstableV5::Private::setMaxSize(
const QSize &size)
324 void XdgShellSurfaceUnstableV5::Private::setMinSize(
const QSize &size)
330 XdgShellSurfaceUnstableV5::XdgShellSurfaceUnstableV5(
QObject *parent)
331 : XdgShellSurface(new Private(this), parent)
335 XdgShellSurfaceUnstableV5::~XdgShellSurfaceUnstableV5() =
default;
337 class XdgShellPopupUnstableV5::Private :
public XdgShellPopup::Private
340 Private(XdgShellPopup *q);
342 void setupV5(xdg_popup *p)
override;
344 void destroy()
override;
347 using XdgShellPopup::Private::operator xdg_surface *;
348 using XdgShellPopup::Private::operator zxdg_popup_v6 *;
349 using XdgShellPopup::Private::operator zxdg_surface_v6 *;
350 operator xdg_popup *()
override
354 operator xdg_popup *()
const override
358 WaylandPointer<xdg_popup, zxdg_popup_v5_destroy> xdgpopupv5;
361 static void popupDoneCallback(
void *data, xdg_popup *xdg_popup);
362 static const struct zxdg_popup_v5_listener s_listener;
365 const struct zxdg_popup_v5_listener XdgShellPopupUnstableV5::Private::s_listener = {popupDoneCallback};
367 void XdgShellPopupUnstableV5::Private::popupDoneCallback(
void *data, xdg_popup *xdg_popup)
369 auto s =
reinterpret_cast<XdgShellPopupUnstableV5::Private *
>(data);
370 Q_ASSERT(s->xdgpopupv5 == xdg_popup);
371 Q_EMIT s->q->popupDone();
374 XdgShellPopupUnstableV5::Private::Private(XdgShellPopup *q)
375 : XdgShellPopup::Private(q)
379 void XdgShellPopupUnstableV5::Private::setupV5(xdg_popup *p)
382 Q_ASSERT(!xdgpopupv5);
384 zxdg_popup_v5_add_listener(xdgpopupv5, &s_listener,
this);
389 xdgpopupv5.release();
392 void XdgShellPopupUnstableV5::Private::destroy()
394 xdgpopupv5.destroy();
397 bool XdgShellPopupUnstableV5::Private::isValid()
const
399 return xdgpopupv5.isValid();
402 XdgShellPopupUnstableV5::XdgShellPopupUnstableV5(
QObject *parent)
403 : XdgShellPopup(new Private(this), parent)
407 XdgShellPopupUnstableV5::~XdgShellPopupUnstableV5() =
default;