From 9166abcd997f57625c17db8e8734988ff303217e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tor=20Arne=20Vestb=C3=B8?= Date: Fri, 17 Jul 2020 22:15:07 +0200 Subject: Add QXcbWindow platform interface Task-number: QTBUG-84220 Change-Id: I8bb4288f1ac06d77fb4f43ae091fa1712f694eeb Reviewed-by: Friedemann Kleint --- src/widgets/kernel/qwidget.cpp | 70 +++++++++++++++++++++++++++--------------- 1 file changed, 46 insertions(+), 24 deletions(-) (limited to 'src/widgets') diff --git a/src/widgets/kernel/qwidget.cpp b/src/widgets/kernel/qwidget.cpp index 0eb929f600..d2ce855bdd 100644 --- a/src/widgets/kernel/qwidget.cpp +++ b/src/widgets/kernel/qwidget.cpp @@ -62,6 +62,7 @@ # include "qaccessible.h" #endif #include +#include #include "private/qwidgetwindow_p.h" #include "qpainter.h" #if QT_CONFIG(tooltip) @@ -113,8 +114,6 @@ #include "qwindowcontainer_p.h" -#include - #include // widget/widget data creation count @@ -123,6 +122,8 @@ QT_BEGIN_NAMESPACE +using namespace QPlatformInterface::Private; + Q_LOGGING_CATEGORY(lcWidgetPainting, "qt.widgets.painting", QtWarningMsg); static inline bool qRectIntersects(const QRect &r1, const QRect &r2) @@ -1334,8 +1335,12 @@ void QWidgetPrivate::create() if (!win->isTopLevel()) // In a Widget world foreign windows can only be top level data.window_flags &= ~Qt::ForeignWindow; - if (!topData()->role.isNull()) - QXcbWindowFunctions::setWmWindowRole(win, topData()->role.toLatin1()); +#if QT_CONFIG(xcb) + if (!topData()->role.isNull()) { + if (auto *xcbWindow = dynamic_cast(win->handle())) + xcbWindow->setWindowRole(topData()->role); + } +#endif QBackingStore *store = q->backingStore(); @@ -5896,11 +5901,17 @@ void QWidgetPrivate::setWindowIconText_helper(const QString &title) void QWidgetPrivate::setWindowIconText_sys(const QString &iconText) { +#if QT_CONFIG(xcb) Q_Q(QWidget); // ### The QWidget property is deprecated, but the XCB window function is not. // It should remain available for the rare application that needs it. - if (QWindow *window = q->windowHandle()) - QXcbWindowFunctions::setWmWindowIconText(window, iconText); + if (QWindow *window = q->windowHandle()) { + if (auto *xcbWindow = dynamic_cast(window->handle())) + xcbWindow->setWindowIconText(iconText); + } +#else + Q_UNUSED(iconText); +#endif } /*! @@ -6140,11 +6151,17 @@ QString QWidget::windowRole() const */ void QWidget::setWindowRole(const QString &role) { +#if QT_CONFIG(xcb) Q_D(QWidget); d->createTLExtra(); d->topData()->role = role; - if (windowHandle()) - QXcbWindowFunctions::setWmWindowRole(windowHandle(), role.toLatin1()); + if (windowHandle()) { + if (auto *xcbWindow = dynamic_cast(windowHandle()->handle())) + xcbWindow->setWindowRole(role); + } +#else + Q_UNUSED(role); +#endif } /*! @@ -12738,43 +12755,48 @@ void QWidgetPrivate::setWidgetParentHelper(QObject *widgetAsObject, QObject *new void QWidgetPrivate::setNetWmWindowTypes(bool skipIfMissing) { +#if QT_CONFIG(xcb) Q_Q(QWidget); if (!q->windowHandle()) return; - int wmWindowType = 0; + QXcbWindow::WindowTypes wmWindowType = QXcbWindow::None; if (q->testAttribute(Qt::WA_X11NetWmWindowTypeDesktop)) - wmWindowType |= QXcbWindowFunctions::Desktop; + wmWindowType |= QXcbWindow::Desktop; if (q->testAttribute(Qt::WA_X11NetWmWindowTypeDock)) - wmWindowType |= QXcbWindowFunctions::Dock; + wmWindowType |= QXcbWindow::Dock; if (q->testAttribute(Qt::WA_X11NetWmWindowTypeToolBar)) - wmWindowType |= QXcbWindowFunctions::Toolbar; + wmWindowType |= QXcbWindow::Toolbar; if (q->testAttribute(Qt::WA_X11NetWmWindowTypeMenu)) - wmWindowType |= QXcbWindowFunctions::Menu; + wmWindowType |= QXcbWindow::Menu; if (q->testAttribute(Qt::WA_X11NetWmWindowTypeUtility)) - wmWindowType |= QXcbWindowFunctions::Utility; + wmWindowType |= QXcbWindow::Utility; if (q->testAttribute(Qt::WA_X11NetWmWindowTypeSplash)) - wmWindowType |= QXcbWindowFunctions::Splash; + wmWindowType |= QXcbWindow::Splash; if (q->testAttribute(Qt::WA_X11NetWmWindowTypeDialog)) - wmWindowType |= QXcbWindowFunctions::Dialog; + wmWindowType |= QXcbWindow::Dialog; if (q->testAttribute(Qt::WA_X11NetWmWindowTypeDropDownMenu)) - wmWindowType |= QXcbWindowFunctions::DropDownMenu; + wmWindowType |= QXcbWindow::DropDownMenu; if (q->testAttribute(Qt::WA_X11NetWmWindowTypePopupMenu)) - wmWindowType |= QXcbWindowFunctions::PopupMenu; + wmWindowType |= QXcbWindow::PopupMenu; if (q->testAttribute(Qt::WA_X11NetWmWindowTypeToolTip)) - wmWindowType |= QXcbWindowFunctions::Tooltip; + wmWindowType |= QXcbWindow::Tooltip; if (q->testAttribute(Qt::WA_X11NetWmWindowTypeNotification)) - wmWindowType |= QXcbWindowFunctions::Notification; + wmWindowType |= QXcbWindow::Notification; if (q->testAttribute(Qt::WA_X11NetWmWindowTypeCombo)) - wmWindowType |= QXcbWindowFunctions::Combo; + wmWindowType |= QXcbWindow::Combo; if (q->testAttribute(Qt::WA_X11NetWmWindowTypeDND)) - wmWindowType |= QXcbWindowFunctions::Dnd; + wmWindowType |= QXcbWindow::Dnd; - if (wmWindowType == 0 && skipIfMissing) + if (wmWindowType == QXcbWindow::None && skipIfMissing) return; - QXcbWindowFunctions::setWmWindowType(q->windowHandle(), static_cast(wmWindowType)); + if (auto *xcbWindow = dynamic_cast(q->windowHandle()->handle())) + xcbWindow->setWindowType(wmWindowType); +#else + Q_UNUSED(skipIfMissing); +#endif } #ifndef QT_NO_DEBUG_STREAM -- cgit v1.2.3