From 7442b72b9312ff478b54a20a39e0f99b1311d772 Mon Sep 17 00:00:00 2001 From: David Edmundson Date: Fri, 13 Jul 2018 15:50:19 +0200 Subject: [PATCH] Make XDGShellV5 co-compilable with XDGWMBase Summary: When we add WMBase (the new name stable XdgShell) we get a clash with XDGShellV5. This clash consists of all functions in the generated C file which clashes at linker time, as well as multiple xdg_blah_interface structs which would get redefined. XDGShellV5 in practice is used by literally no-one (Qt never defaulted to it if wl-shell was available) and has been dropped from GTK when they added v6. But it's used by some kwin unit tests so breaking would cause issues for stable kwin release tests... so it's a pain. We can't mod the XML as we need the strings sent down the wire to remain the same and we need the same names for our forward declared structs that the client code can cast to. This patch copies the generated files and modifies them manually. Hacky, but we know this code will never change again - and IMHO this task isn't one worth investing too much time into. Test Plan: Finished my XDG WM Base patch (see next phab) and things compile \o/ Unit test still passes Ran: QT_WAYLAND_SHELL_INTEGRATION=xdg-shell-v5 dolphin --platform wayland and verified it worked Reviewers: #plasma, romangg Reviewed By: #plasma, romangg Subscribers: romangg, kde-frameworks-devel Tags: #frameworks Differential Revision: https://phabricator.kde.org/D13488 --- src/wayland/CMakeLists.txt | 4 +- src/wayland/server/xdgshell_v5_interface.cpp | 62 ++++++++++---------- 2 files changed, 33 insertions(+), 33 deletions(-) diff --git a/src/wayland/CMakeLists.txt b/src/wayland/CMakeLists.txt index 5a2e2ca614..d95bf7391f 100644 --- a/src/wayland/CMakeLists.txt +++ b/src/wayland/CMakeLists.txt @@ -53,8 +53,10 @@ set(SERVER_LIB_SRCS xdgshell_v5_interface.cpp xdgforeign_v2_interface.cpp xdgforeign_interface.cpp + xdgshell_v5_interface.cpp xdgshell_v6_interface.cpp xdgoutput_interface.cpp + ../compat/wayland-xdg-shell-v5-protocol.c ) ecm_add_wayland_server_protocol(SERVER_LIB_SRCS @@ -221,8 +223,6 @@ set(SERVER_GENERATED_SRCS ${CMAKE_CURRENT_BINARY_DIR}/wayland-text-server-protocol.h ${CMAKE_CURRENT_BINARY_DIR}/wayland-text-input-unstable-v2-client-protocol.h ${CMAKE_CURRENT_BINARY_DIR}/wayland-text-input-unstable-v2-server-protocol.h - ${CMAKE_CURRENT_BINARY_DIR}/wayland-xdg-shell-v5-client-protocol.h - ${CMAKE_CURRENT_BINARY_DIR}/wayland-xdg-shell-v5-server-protocol.h ${CMAKE_CURRENT_BINARY_DIR}/wayland-xdg-shell-v6-client-protocol.h ${CMAKE_CURRENT_BINARY_DIR}/wayland-xdg-shell-v6-server-protocol.h ${CMAKE_CURRENT_BINARY_DIR}/wayland-pointer-gestures-unstable-v1-client-protocol.h diff --git a/src/wayland/server/xdgshell_v5_interface.cpp b/src/wayland/server/xdgshell_v5_interface.cpp index 5d2089b9ed..6d574b89bc 100644 --- a/src/wayland/server/xdgshell_v5_interface.cpp +++ b/src/wayland/server/xdgshell_v5_interface.cpp @@ -27,7 +27,7 @@ License along with this library. If not, see . #include "seat_interface.h" #include "surface_interface.h" -#include +#include "../compat/wayland-xdg-shell-v5-server-protocol.h" namespace KWayland { @@ -61,7 +61,7 @@ private: static void pongCallback(wl_client *client, wl_resource *resource, uint32_t serial); XdgShellV5Interface *q; - static const struct xdg_shell_interface s_interface; + static const struct zxdg_shell_v5_interface s_interface; static const quint32 s_version; }; @@ -79,13 +79,13 @@ public: private: - static const struct xdg_popup_interface s_interface; + static const struct zxdg_popup_v5_interface s_interface; }; const quint32 XdgShellV5Interface::Private::s_version = 1; #ifndef DOXYGEN_SHOULD_SKIP_THIS -const struct xdg_shell_interface XdgShellV5Interface::Private::s_interface = { +const struct zxdg_shell_v5_interface XdgShellV5Interface::Private::s_interface = { destroyCallback, useUnstableVersionCallback, getXdgSurfaceCallback, @@ -123,7 +123,7 @@ void XdgShellV5Interface::Private::createSurface(wl_client *client, uint32_t ver } ); if (it != surfaces.constEnd()) { - wl_resource_post_error(surface->resource(), XDG_SHELL_ERROR_ROLE, "ShellSurface already created"); + wl_resource_post_error(surface->resource(), ZXDG_SHELL_V5_ERROR_ROLE, "ShellSurface already created"); return; } XdgSurfaceV5Interface *shellSurface = new XdgSurfaceV5Interface(q, surface, parentResource); @@ -175,7 +175,7 @@ void XdgShellV5Interface::Private::pongCallback(wl_client *client, wl_resource * } XdgShellV5Interface::Private::Private(XdgShellV5Interface *q, Display *d) - : XdgShellInterface::Private(XdgShellInterfaceVersion::UnstableV5, q, d, &xdg_shell_interface, s_version) + : XdgShellInterface::Private(XdgShellInterfaceVersion::UnstableV5, q, d, &zxdg_shell_v5_interface, s_version) , q(q) { } @@ -183,7 +183,7 @@ XdgShellV5Interface::Private::Private(XdgShellV5Interface *q, Display *d) void XdgShellV5Interface::Private::bind(wl_client *client, uint32_t version, uint32_t id) { auto c = display->getConnection(client); - auto resource = c->createResource(&xdg_shell_interface, qMin(version, s_version), id); + auto resource = c->createResource(&zxdg_shell_v5_interface, qMin(version, s_version), id); if (!resource) { wl_client_post_no_memory(client); return; @@ -226,7 +226,7 @@ quint32 XdgShellV5Interface::Private::ping(XdgShellSurfaceInterface * surface) return 0; } const quint32 pingSerial = display->nextSerial(); - xdg_shell_send_ping(clientXdgShellResource, pingSerial); + zxdg_shell_v5_send_ping(clientXdgShellResource, pingSerial); setupTimer(pingSerial); return pingSerial; @@ -261,40 +261,40 @@ private: static void unsetFullscreenCallback(wl_client *client, wl_resource *resource); static void setMinimizedCallback(wl_client *client, wl_resource *resource); - static const struct xdg_surface_interface s_interface; + static const struct zxdg_surface_v5_interface s_interface; }; namespace { template <> -Qt::Edges edgesToQtEdges(xdg_surface_resize_edge edges) +Qt::Edges edgesToQtEdges(zxdg_surface_v5_resize_edge edges) { Qt::Edges qtEdges; switch (edges) { - case XDG_SURFACE_RESIZE_EDGE_TOP: + case ZXDG_SURFACE_V5_RESIZE_EDGE_TOP: qtEdges = Qt::TopEdge; break; - case XDG_SURFACE_RESIZE_EDGE_BOTTOM: + case ZXDG_SURFACE_V5_RESIZE_EDGE_BOTTOM: qtEdges = Qt::BottomEdge; break; - case XDG_SURFACE_RESIZE_EDGE_LEFT: + case ZXDG_SURFACE_V5_RESIZE_EDGE_LEFT: qtEdges = Qt::LeftEdge; break; - case XDG_SURFACE_RESIZE_EDGE_TOP_LEFT: + case ZXDG_SURFACE_V5_RESIZE_EDGE_TOP_LEFT: qtEdges = Qt::TopEdge | Qt::LeftEdge; break; - case XDG_SURFACE_RESIZE_EDGE_BOTTOM_LEFT: + case ZXDG_SURFACE_V5_RESIZE_EDGE_BOTTOM_LEFT: qtEdges = Qt::BottomEdge | Qt::LeftEdge; break; - case XDG_SURFACE_RESIZE_EDGE_RIGHT: + case ZXDG_SURFACE_V5_RESIZE_EDGE_RIGHT: qtEdges = Qt::RightEdge; break; - case XDG_SURFACE_RESIZE_EDGE_TOP_RIGHT: + case ZXDG_SURFACE_V5_RESIZE_EDGE_TOP_RIGHT: qtEdges = Qt::TopEdge | Qt::RightEdge; break; - case XDG_SURFACE_RESIZE_EDGE_BOTTOM_RIGHT: + case ZXDG_SURFACE_V5_RESIZE_EDGE_BOTTOM_RIGHT: qtEdges = Qt::BottomEdge | Qt::RightEdge; break; - case XDG_SURFACE_RESIZE_EDGE_NONE: + case ZXDG_SURFACE_V5_RESIZE_EDGE_NONE: break; default: Q_UNREACHABLE(); @@ -305,14 +305,14 @@ Qt::Edges edgesToQtEdges(xdg_surface_resize_edge edges) } #ifndef DOXYGEN_SHOULD_SKIP_THIS -const struct xdg_surface_interface XdgSurfaceV5Interface::Private::s_interface = { +const struct zxdg_surface_v5_interface XdgSurfaceV5Interface::Private::s_interface = { resourceDestroyedCallback, setParentCallback, setTitleCallback, setAppIdCallback, showWindowMenuCallback, moveCallback, - resizeCallback, + resizeCallback, ackConfigureCallback, setWindowGeometryCallback, setMaximizedCallback, @@ -409,7 +409,7 @@ void XdgSurfaceV5Interface::Private::setMinimizedCallback(wl_client *client, wl_ } XdgSurfaceV5Interface::Private::Private(XdgSurfaceV5Interface *q, XdgShellV5Interface *c, SurfaceInterface *surface, wl_resource *parentResource) - : XdgShellSurfaceInterface::Private(XdgShellInterfaceVersion::UnstableV5, q, c, surface, parentResource, &xdg_surface_interface, &s_interface) + : XdgShellSurfaceInterface::Private(XdgShellInterfaceVersion::UnstableV5, q, c, surface, parentResource, &zxdg_surface_v5_interface, &s_interface) { } @@ -417,7 +417,7 @@ XdgSurfaceV5Interface::Private::~Private() = default; void XdgSurfaceV5Interface::Private::close() { - xdg_surface_send_close(resource); + zxdg_surface_v5_send_close(resource); client->flush(); } @@ -431,22 +431,22 @@ quint32 XdgSurfaceV5Interface::Private::configure(States states, const QSize &si wl_array_init(&state); if (states.testFlag(State::Maximized)) { uint32_t *s = reinterpret_cast(wl_array_add(&state, sizeof(uint32_t))); - *s = XDG_SURFACE_STATE_MAXIMIZED; + *s = ZXDG_SURFACE_V5_STATE_MAXIMIZED; } if (states.testFlag(State::Fullscreen)) { uint32_t *s = reinterpret_cast(wl_array_add(&state, sizeof(uint32_t))); - *s = XDG_SURFACE_STATE_FULLSCREEN; + *s = ZXDG_SURFACE_V5_STATE_FULLSCREEN; } if (states.testFlag(State::Resizing)) { uint32_t *s = reinterpret_cast(wl_array_add(&state, sizeof(uint32_t))); - *s = XDG_SURFACE_STATE_RESIZING; + *s = ZXDG_SURFACE_V5_STATE_RESIZING; } if (states.testFlag(State::Activated)) { uint32_t *s = reinterpret_cast(wl_array_add(&state, sizeof(uint32_t))); - *s = XDG_SURFACE_STATE_ACTIVATED; + *s = ZXDG_SURFACE_V5_STATE_ACTIVATED; } configureSerials << serial; - xdg_surface_send_configure(resource, size.width(), size.height(), &state, serial); + zxdg_surface_v5_send_configure(resource, size.width(), size.height(), &state, serial); client->flush(); wl_array_release(&state); @@ -454,13 +454,13 @@ quint32 XdgSurfaceV5Interface::Private::configure(States states, const QSize &si } #ifndef DOXYGEN_SHOULD_SKIP_THIS -const struct xdg_popup_interface XdgPopupV5Interface::Private::s_interface = { +const struct zxdg_popup_v5_interface XdgPopupV5Interface::Private::s_interface = { resourceDestroyedCallback }; #endif XdgPopupV5Interface::Private::Private(XdgPopupV5Interface *q, XdgShellV5Interface *c, SurfaceInterface *surface, wl_resource *parentResource) - : XdgShellPopupInterface::Private(XdgShellInterfaceVersion::UnstableV5, q, c, surface, parentResource, &xdg_popup_interface, &s_interface) + : XdgShellPopupInterface::Private(XdgShellInterfaceVersion::UnstableV5, q, c, surface, parentResource, &zxdg_popup_v5_interface, &s_interface) { } @@ -473,7 +473,7 @@ void XdgPopupV5Interface::Private::popupDone() return; } // TODO: dismiss all child popups - xdg_popup_send_popup_done(resource); + zxdg_popup_v5_send_popup_done(resource); client->flush(); }