From b600b6a3b3164ead4f8f09e9b34c07db758d25ff Mon Sep 17 00:00:00 2001 From: Ilya Fedin Date: Fri, 11 Jun 2021 11:51:18 +0400 Subject: [PATCH] Move custom xdg-shell integration code to wayland integration --- .../linux/ui_linux_wayland_integration.cpp | 29 ++++++++++++++ .../linux/ui_linux_wayland_integration.h | 4 ++ .../ui_linux_wayland_integration_dummy.cpp | 12 ++++++ ui/platform/linux/ui_utility_linux.cpp | 39 +++---------------- 4 files changed, 51 insertions(+), 33 deletions(-) diff --git a/ui/platform/linux/ui_linux_wayland_integration.cpp b/ui/platform/linux/ui_linux_wayland_integration.cpp index 45f0112..4d78307 100644 --- a/ui/platform/linux/ui_linux_wayland_integration.cpp +++ b/ui/platform/linux/ui_linux_wayland_integration.cpp @@ -8,6 +8,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL #include "ui/platform/linux/ui_linux_wayland_integration.h" #include "base/platform/base_platform_info.h" +#include "waylandshells/xdg_shell.h" #include @@ -17,10 +18,15 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL #define slots Q_SLOTS #endif // QT_NO_KEYWORDS +#include +#include #include #include #include +Q_DECLARE_METATYPE(QMargins); + +using QtWaylandClient::QWaylandIntegration; using QtWaylandClient::QWaylandWindow; namespace Ui { @@ -35,6 +41,29 @@ WaylandIntegration *WaylandIntegration::Instance() { return &instance; } +bool WaylandIntegration::windowExtentsSupported() { + // initialize shell integration before querying + if (const auto integration = static_cast( + QGuiApplicationPrivate::platformIntegration())) { + integration->shellIntegration(); + } + return WaylandShells::XdgShell(); +} + +void WaylandIntegration::setWindowExtents( + QWindow *window, + const QMargins &extents) { + window->setProperty( + "_desktopApp_waylandCustomMargins", + QVariant::fromValue(extents)); +} + +void WaylandIntegration::unsetWindowExtents(QWindow *window) { + window->setProperty( + "_desktopApp_waylandCustomMargins", + QVariant()); +} + bool WaylandIntegration::showWindowMenu(QWindow *window) { if (const auto waylandWindow = static_cast( window->handle())) { diff --git a/ui/platform/linux/ui_linux_wayland_integration.h b/ui/platform/linux/ui_linux_wayland_integration.h index bbc2331..ed877f2 100644 --- a/ui/platform/linux/ui_linux_wayland_integration.h +++ b/ui/platform/linux/ui_linux_wayland_integration.h @@ -15,6 +15,10 @@ namespace Platform { class WaylandIntegration { public: static WaylandIntegration *Instance(); + + bool windowExtentsSupported(); + void setWindowExtents(QWindow *window, const QMargins &extents); + void unsetWindowExtents(QWindow *window); bool showWindowMenu(QWindow *window); private: diff --git a/ui/platform/linux/ui_linux_wayland_integration_dummy.cpp b/ui/platform/linux/ui_linux_wayland_integration_dummy.cpp index 11abd62..972b09c 100644 --- a/ui/platform/linux/ui_linux_wayland_integration_dummy.cpp +++ b/ui/platform/linux/ui_linux_wayland_integration_dummy.cpp @@ -21,6 +21,18 @@ WaylandIntegration *WaylandIntegration::Instance() { return &instance; } +bool WaylandIntegration::windowExtentsSupported() { + return false; +} + +void WaylandIntegration::setWindowExtents( + QWindow *window, + const QMargins &extents) { +} + +void WaylandIntegration::unsetWindowExtents(QWindow *window) { +} + bool WaylandIntegration::showWindowMenu(QWindow *window) { return false; } diff --git a/ui/platform/linux/ui_utility_linux.cpp b/ui/platform/linux/ui_utility_linux.cpp index 5bc5971..8d95acc 100644 --- a/ui/platform/linux/ui_utility_linux.cpp +++ b/ui/platform/linux/ui_utility_linux.cpp @@ -18,23 +18,11 @@ #include "base/platform/linux/base_linux_xcb_utilities.h" #endif // !DESKTOP_APP_DISABLE_X11_INTEGRATION -#ifndef DESKTOP_APP_DISABLE_WAYLAND_INTEGRATION -#include "waylandshells/xdg_shell.h" -#endif // !DESKTOP_APP_DISABLE_WAYLAND_INTEGRATION - #include #include #include #include -#include #include -#include - -#ifndef DESKTOP_APP_DISABLE_WAYLAND_INTEGRATION -#include -#endif // !DESKTOP_APP_DISABLE_WAYLAND_INTEGRATION - -Q_DECLARE_METATYPE(QMargins); namespace Ui { namespace Platform { @@ -466,16 +454,9 @@ std::optional IsOverlapped( } bool WindowExtentsSupported() { -#ifndef DESKTOP_APP_DISABLE_WAYLAND_INTEGRATION - if (::Platform::IsWayland()) { - // initialize shell integration before querying - using QtWaylandClient::QWaylandIntegration; - const auto integration = static_cast( - QGuiApplicationPrivate::platformIntegration()); - integration->shellIntegration(); - return WaylandShells::XdgShell(); + if (const auto integration = WaylandIntegration::Instance()) { + return integration->windowExtentsSupported(); } -#endif // !DESKTOP_APP_DISABLE_WAYLAND_INTEGRATION #ifndef DESKTOP_APP_DISABLE_X11_INTEGRATION namespace XCB = base::Platform::XCB; @@ -489,12 +470,8 @@ bool WindowExtentsSupported() { } void SetWindowExtents(QWindow *window, const QMargins &extents) { - if (::Platform::IsWayland()) { -#ifndef DESKTOP_APP_DISABLE_WAYLAND_INTEGRATION - window->setProperty( - "_desktopApp_waylandCustomMargins", - QVariant::fromValue(extents)); -#endif // !DESKTOP_APP_DISABLE_WAYLAND_INTEGRATION + if (const auto integration = WaylandIntegration::Instance()) { + integration->setWindowExtents(window, extents); } else if (::Platform::IsX11()) { #ifndef DESKTOP_APP_DISABLE_X11_INTEGRATION SetXCBFrameExtents(window, extents); @@ -503,12 +480,8 @@ void SetWindowExtents(QWindow *window, const QMargins &extents) { } void UnsetWindowExtents(QWindow *window) { - if (::Platform::IsWayland()) { -#ifndef DESKTOP_APP_DISABLE_WAYLAND_INTEGRATION - window->setProperty( - "_desktopApp_waylandCustomMargins", - QVariant()); -#endif // !DESKTOP_APP_DISABLE_WAYLAND_INTEGRATION + if (const auto integration = WaylandIntegration::Instance()) { + integration->unsetWindowExtents(window); } else if (::Platform::IsX11()) { #ifndef DESKTOP_APP_DISABLE_X11_INTEGRATION UnsetXCBFrameExtents(window);