From be0067a8c7879171fa4cfb870ef1ad91f523e2d8 Mon Sep 17 00:00:00 2001 From: Ilya Fedin Date: Sat, 13 May 2023 23:31:54 +0400 Subject: [PATCH] Switch Wayland integration to the new type safe Qt API This also makes it possible to get a more right seat/serial pair --- .../linux/ui_linux_wayland_integration.cpp | 89 +++++++------------ ui/widgets/popup_menu.cpp | 10 +-- 2 files changed, 37 insertions(+), 62 deletions(-) diff --git a/ui/platform/linux/ui_linux_wayland_integration.cpp b/ui/platform/linux/ui_linux_wayland_integration.cpp index 8831888..d27d9b9 100644 --- a/ui/platform/linux/ui_linux_wayland_integration.cpp +++ b/ui/platform/linux/ui_linux_wayland_integration.cpp @@ -13,12 +13,11 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL #include #include -#include +#include #include -typedef void (*SetWindowMarginsFunc)( - QWindow *window, - const QMargins &margins); +using namespace QNativeInterface; +using namespace QNativeInterface::Private; namespace Ui { namespace Platform { @@ -66,14 +65,12 @@ const struct wl_registry_listener WaylandIntegration::Private::RegistryListener WaylandIntegration::WaylandIntegration() : _private(std::make_unique()) { - const auto native = QGuiApplication::platformNativeInterface(); + const auto native = qApp->nativeInterface(); if (!native) { return; } - const auto display = reinterpret_cast( - native->nativeResourceForIntegration(QByteArray("wl_display"))); - + const auto display = native->display(); if (!display) { return; } @@ -85,7 +82,7 @@ WaylandIntegration::WaylandIntegration() _private.get()); base::qt_signal_producer( - native, + qApp, &QObject::destroyed ) | rpl::start_with_next([=] { // too late for standard destructors, just free @@ -108,77 +105,57 @@ bool WaylandIntegration::xdgDecorationSupported() { } bool WaylandIntegration::windowExtentsSupported() { - const auto native = QGuiApplication::platformNativeInterface(); - if (!native) { - return false; - } - - const auto setWindowMargins = reinterpret_cast( - reinterpret_cast( - native->nativeResourceFunctionForWindow("setmargins"))); - - if (!setWindowMargins) { - return false; - } - - return true; + QWindow window; + window.create(); + return window.nativeInterface(); } void WaylandIntegration::setWindowExtents( not_null widget, const QMargins &extents) { - const auto native = QGuiApplication::platformNativeInterface(); + const auto window = widget->windowHandle(); + if (!window) { + return; + } + + const auto native = window->nativeInterface(); if (!native) { return; } - const auto setWindowMargins = reinterpret_cast( - reinterpret_cast( - native->nativeResourceFunctionForWindow("setmargins"))); - - if (!setWindowMargins) { - return; - } - - setWindowMargins(widget->windowHandle(), extents); + native->setCustomMargins(extents); } void WaylandIntegration::unsetWindowExtents(not_null widget) { - const auto native = QGuiApplication::platformNativeInterface(); + const auto window = widget->windowHandle(); + if (!window) { + return; + } + + const auto native = window->nativeInterface(); if (!native) { return; } - const auto setWindowMargins = reinterpret_cast( - reinterpret_cast( - native->nativeResourceFunctionForWindow("setmargins"))); - - if (!setWindowMargins) { - return; - } - - setWindowMargins(widget->windowHandle(), QMargins()); + native->setCustomMargins(QMargins()); } void WaylandIntegration::showWindowMenu( not_null widget, const QPoint &point) { - const auto native = QGuiApplication::platformNativeInterface(); - if (!native) { + const auto window = widget->windowHandle(); + if (!window) { return; } - const auto toplevel = reinterpret_cast( - native->nativeResourceForWindow( - QByteArray("xdg_toplevel"), - widget->windowHandle())); - - const auto seat = reinterpret_cast( - native->nativeResourceForIntegration(QByteArray("wl_seat"))); - - const auto serial = uint32_t(reinterpret_cast( - native->nativeResourceForIntegration(QByteArray("serial")))); + const auto native = qApp->nativeInterface(); + const auto nativeWindow = window->nativeInterface(); + if (!native || !nativeWindow) { + return; + } + const auto toplevel = nativeWindow->surfaceRole(); + const auto seat = native->lastInputSeat(); if (!toplevel || !seat) { return; } @@ -186,7 +163,7 @@ void WaylandIntegration::showWindowMenu( xdg_toplevel_show_window_menu( toplevel, seat, - serial, + native->lastInputSerial(), point.x(), point.y()); } diff --git a/ui/widgets/popup_menu.cpp b/ui/widgets/popup_menu.cpp index ff81dbc..2ab8c63 100644 --- a/ui/widgets/popup_menu.cpp +++ b/ui/widgets/popup_menu.cpp @@ -323,12 +323,10 @@ void PopupMenu::validateCompositingSupport() { std::max(_st.shadow.extend.bottom(), additional.bottom())); _extents = _padding - (additional - _additionalMenuExtents); } - if (windowHandle()) { - if (_extents.isNull()) { - Platform::UnsetWindowExtents(this); - } else { - Platform::SetWindowExtents(this, _extents); - } + if (_extents.isNull()) { + Platform::UnsetWindowExtents(this); + } else { + Platform::SetWindowExtents(this, _extents); } _scroll->moveToLeft(_padding.left(), _padding.top()); handleMenuResize();