diff options
author | Tor Arne Vestbø <tor.arne.vestbo@qt.io> | 2020-07-17 22:15:07 +0200 |
---|---|---|
committer | Tor Arne Vestbø <tor.arne.vestbo@qt.io> | 2020-07-20 17:47:39 +0200 |
commit | 9166abcd997f57625c17db8e8734988ff303217e (patch) | |
tree | fa8c97b1f5d89e7c64645a2d261b75ddfbbea18c /src/plugins/platforms | |
parent | 6034494070041baab95b835a2605c795f0d7166c (diff) |
Add QXcbWindow platform interface
Task-number: QTBUG-84220
Change-Id: I8bb4288f1ac06d77fb4f43ae091fa1712f694eeb
Reviewed-by: Friedemann Kleint <Friedemann.Kleint@qt.io>
Diffstat (limited to 'src/plugins/platforms')
-rw-r--r-- | src/plugins/platforms/xcb/gl_integrations/xcb_glx/qglxintegration.cpp | 1 | ||||
-rw-r--r-- | src/plugins/platforms/xcb/qxcbnativeinterface.cpp | 19 | ||||
-rw-r--r-- | src/plugins/platforms/xcb/qxcbwindow.cpp | 116 | ||||
-rw-r--r-- | src/plugins/platforms/xcb/qxcbwindow.h | 21 |
4 files changed, 54 insertions, 103 deletions
diff --git a/src/plugins/platforms/xcb/gl_integrations/xcb_glx/qglxintegration.cpp b/src/plugins/platforms/xcb/gl_integrations/xcb_glx/qglxintegration.cpp index 4c1786394f..b6cb54370a 100644 --- a/src/plugins/platforms/xcb/gl_integrations/xcb_glx/qglxintegration.cpp +++ b/src/plugins/platforms/xcb/gl_integrations/xcb_glx/qglxintegration.cpp @@ -51,6 +51,7 @@ #if QT_CONFIG(regularexpression) # include <QtCore/QRegularExpression> #endif +#include <QtGui/qguiapplication.h> #include <QtGui/QOpenGLContext> #include <QtGui/QOffscreenSurface> diff --git a/src/plugins/platforms/xcb/qxcbnativeinterface.cpp b/src/plugins/platforms/xcb/qxcbnativeinterface.cpp index d725d49082..95c552a468 100644 --- a/src/plugins/platforms/xcb/qxcbnativeinterface.cpp +++ b/src/plugins/platforms/xcb/qxcbnativeinterface.cpp @@ -53,8 +53,6 @@ #include <QtGui/qopenglcontext.h> #include <QtGui/qscreen.h> -#include <QtPlatformHeaders/private/qxcbwindowfunctions_p.h> - #include <stdio.h> #include <algorithm> @@ -310,24 +308,9 @@ QPlatformNativeInterface::NativeResourceForBackingStoreFunction QXcbNativeInterf QFunctionPointer QXcbNativeInterface::platformFunction(const QByteArray &function) const { const QByteArray lowerCaseFunction = function.toLower(); - QFunctionPointer func = handlerPlatformFunction(lowerCaseFunction); - if (func) + if (QFunctionPointer func = handlerPlatformFunction(lowerCaseFunction)) return func; - //case sensitive - if (function == QXcbWindowFunctions::setWmWindowTypeIdentifier()) - return QFunctionPointer(QXcbWindowFunctions::SetWmWindowType(QXcbWindow::setWmWindowTypeStatic)); - - if (function == QXcbWindowFunctions::setWmWindowRoleIdentifier()) - return QFunctionPointer(QXcbWindowFunctions::SetWmWindowRole(QXcbWindow::setWmWindowRoleStatic)); - - if (function == QXcbWindowFunctions::setWmWindowIconTextIdentifier()) - return QFunctionPointer(QXcbWindowFunctions::SetWmWindowIconText(QXcbWindow::setWindowIconTextStatic)); - - if (function == QXcbWindowFunctions::visualIdIdentifier()) { - return QFunctionPointer(QXcbWindowFunctions::VisualId(QXcbWindow::visualIdStatic)); - } - return nullptr; } diff --git a/src/plugins/platforms/xcb/qxcbwindow.cpp b/src/plugins/platforms/xcb/qxcbwindow.cpp index c29e18529c..224f0bd4cb 100644 --- a/src/plugins/platforms/xcb/qxcbwindow.cpp +++ b/src/plugins/platforms/xcb/qxcbwindow.cpp @@ -511,7 +511,7 @@ void QXcbWindow::create() if (window()->dynamicPropertyNames().contains(wm_window_role_property_id)) { QByteArray wmWindowRole = window()->property(wm_window_role_property_id).toByteArray(); - setWmWindowRole(wmWindowRole); + setWindowRole(QString::fromLatin1(wmWindowRole)); } if (m_trayIconWindow) @@ -919,9 +919,9 @@ void QXcbWindow::setWindowFlags(Qt::WindowFlags flags) xcb_change_window_attributes(xcb_connection(), xcb_window(), mask, values); - QXcbWindowFunctions::WmWindowTypes wmWindowTypes; + WindowTypes wmWindowTypes; if (window()->dynamicPropertyNames().contains(wm_window_type_property_id)) { - wmWindowTypes = static_cast<QXcbWindowFunctions::WmWindowTypes>( + wmWindowTypes = static_cast<WindowTypes>( qvariant_cast<int>(window()->property(wm_window_type_property_id))); } @@ -1445,38 +1445,9 @@ QSurfaceFormat QXcbWindow::format() const return m_format; } -void QXcbWindow::setWmWindowTypeStatic(QWindow *window, QXcbWindowFunctions::WmWindowTypes windowTypes) +QXcbWindow::WindowTypes QXcbWindow::wmWindowTypes() const { - window->setProperty(wm_window_type_property_id, QVariant::fromValue(static_cast<int>(windowTypes))); - - if (window->handle()) - static_cast<QXcbWindow *>(window->handle())->setWmWindowType(windowTypes, window->flags()); -} - -void QXcbWindow::setWindowIconTextStatic(QWindow *window, const QString &text) -{ - if (window->handle()) - static_cast<QXcbWindow *>(window->handle())->setWindowIconText(text); -} - -void QXcbWindow::setWmWindowRoleStatic(QWindow *window, const QByteArray &role) -{ - if (window->handle()) - static_cast<QXcbWindow *>(window->handle())->setWmWindowRole(role); - else - window->setProperty(wm_window_role_property_id, role); -} - -uint QXcbWindow::visualIdStatic(QWindow *window) -{ - if (window && window->handle()) - return static_cast<QXcbWindow *>(window->handle())->visualId(); - return UINT_MAX; -} - -QXcbWindowFunctions::WmWindowTypes QXcbWindow::wmWindowTypes() const -{ - QXcbWindowFunctions::WmWindowTypes result; + WindowTypes result; auto reply = Q_XCB_REPLY_UNCHECKED(xcb_get_property, xcb_connection(), 0, m_window, atom(QXcbAtom::_NET_WM_WINDOW_TYPE), @@ -1488,49 +1459,49 @@ QXcbWindowFunctions::WmWindowTypes QXcbWindow::wmWindowTypes() const QXcbAtom::Atom type = connection()->qatom(*types); switch (type) { case QXcbAtom::_NET_WM_WINDOW_TYPE_NORMAL: - result |= QXcbWindowFunctions::Normal; + result |= WindowType::Normal; break; case QXcbAtom::_NET_WM_WINDOW_TYPE_DESKTOP: - result |= QXcbWindowFunctions::Desktop; + result |= WindowType::Desktop; break; case QXcbAtom::_NET_WM_WINDOW_TYPE_DOCK: - result |= QXcbWindowFunctions::Dock; + result |= WindowType::Dock; break; case QXcbAtom::_NET_WM_WINDOW_TYPE_TOOLBAR: - result |= QXcbWindowFunctions::Toolbar; + result |= WindowType::Toolbar; break; case QXcbAtom::_NET_WM_WINDOW_TYPE_MENU: - result |= QXcbWindowFunctions::Menu; + result |= WindowType::Menu; break; case QXcbAtom::_NET_WM_WINDOW_TYPE_UTILITY: - result |= QXcbWindowFunctions::Utility; + result |= WindowType::Utility; break; case QXcbAtom::_NET_WM_WINDOW_TYPE_SPLASH: - result |= QXcbWindowFunctions::Splash; + result |= WindowType::Splash; break; case QXcbAtom::_NET_WM_WINDOW_TYPE_DIALOG: - result |= QXcbWindowFunctions::Dialog; + result |= WindowType::Dialog; break; case QXcbAtom::_NET_WM_WINDOW_TYPE_DROPDOWN_MENU: - result |= QXcbWindowFunctions::DropDownMenu; + result |= WindowType::DropDownMenu; break; case QXcbAtom::_NET_WM_WINDOW_TYPE_POPUP_MENU: - result |= QXcbWindowFunctions::PopupMenu; + result |= WindowType::PopupMenu; break; case QXcbAtom::_NET_WM_WINDOW_TYPE_TOOLTIP: - result |= QXcbWindowFunctions::Tooltip; + result |= WindowType::Tooltip; break; case QXcbAtom::_NET_WM_WINDOW_TYPE_NOTIFICATION: - result |= QXcbWindowFunctions::Notification; + result |= WindowType::Notification; break; case QXcbAtom::_NET_WM_WINDOW_TYPE_COMBO: - result |= QXcbWindowFunctions::Combo; + result |= WindowType::Combo; break; case QXcbAtom::_NET_WM_WINDOW_TYPE_DND: - result |= QXcbWindowFunctions::Dnd; + result |= WindowType::Dnd; break; case QXcbAtom::_KDE_NET_WM_WINDOW_TYPE_OVERRIDE: - result |= QXcbWindowFunctions::KdeOverride; + result |= WindowType::KdeOverride; break; default: break; @@ -1540,46 +1511,46 @@ QXcbWindowFunctions::WmWindowTypes QXcbWindow::wmWindowTypes() const return result; } -void QXcbWindow::setWmWindowType(QXcbWindowFunctions::WmWindowTypes types, Qt::WindowFlags flags) +void QXcbWindow::setWmWindowType(WindowTypes types, Qt::WindowFlags flags) { QList<xcb_atom_t> atoms; // manual selection 1 (these are never set by Qt and take precedence) - if (types & QXcbWindowFunctions::Normal) + if (types & WindowType::Normal) atoms.append(atom(QXcbAtom::_NET_WM_WINDOW_TYPE_NORMAL)); - if (types & QXcbWindowFunctions::Desktop) + if (types & WindowType::Desktop) atoms.append(atom(QXcbAtom::_NET_WM_WINDOW_TYPE_DESKTOP)); - if (types & QXcbWindowFunctions::Dock) + if (types & WindowType::Dock) atoms.append(atom(QXcbAtom::_NET_WM_WINDOW_TYPE_DOCK)); - if (types & QXcbWindowFunctions::Notification) + if (types & WindowType::Notification) atoms.append(atom(QXcbAtom::_NET_WM_WINDOW_TYPE_NOTIFICATION)); // manual selection 2 (Qt uses these during auto selection); - if (types & QXcbWindowFunctions::Utility) + if (types & WindowType::Utility) atoms.append(atom(QXcbAtom::_NET_WM_WINDOW_TYPE_UTILITY)); - if (types & QXcbWindowFunctions::Splash) + if (types & WindowType::Splash) atoms.append(atom(QXcbAtom::_NET_WM_WINDOW_TYPE_SPLASH)); - if (types & QXcbWindowFunctions::Dialog) + if (types & WindowType::Dialog) atoms.append(atom(QXcbAtom::_NET_WM_WINDOW_TYPE_DIALOG)); - if (types & QXcbWindowFunctions::Tooltip) + if (types & WindowType::Tooltip) atoms.append(atom(QXcbAtom::_NET_WM_WINDOW_TYPE_TOOLTIP)); - if (types & QXcbWindowFunctions::KdeOverride) + if (types & WindowType::KdeOverride) atoms.append(atom(QXcbAtom::_KDE_NET_WM_WINDOW_TYPE_OVERRIDE)); // manual selection 3 (these can be set by Qt, but don't have a // corresponding Qt::WindowType). note that order of the *MENU // atoms is important - if (types & QXcbWindowFunctions::Menu) + if (types & WindowType::Menu) atoms.append(atom(QXcbAtom::_NET_WM_WINDOW_TYPE_MENU)); - if (types & QXcbWindowFunctions::DropDownMenu) + if (types & WindowType::DropDownMenu) atoms.append(atom(QXcbAtom::_NET_WM_WINDOW_TYPE_DROPDOWN_MENU)); - if (types & QXcbWindowFunctions::PopupMenu) + if (types & WindowType::PopupMenu) atoms.append(atom(QXcbAtom::_NET_WM_WINDOW_TYPE_POPUP_MENU)); - if (types & QXcbWindowFunctions::Toolbar) + if (types & WindowType::Toolbar) atoms.append(atom(QXcbAtom::_NET_WM_WINDOW_TYPE_TOOLBAR)); - if (types & QXcbWindowFunctions::Combo) + if (types & WindowType::Combo) atoms.append(atom(QXcbAtom::_NET_WM_WINDOW_TYPE_COMBO)); - if (types & QXcbWindowFunctions::Dnd) + if (types & WindowType::Dnd) atoms.append(atom(QXcbAtom::_NET_WM_WINDOW_TYPE_DND)); // automatic selection @@ -1587,27 +1558,27 @@ void QXcbWindow::setWmWindowType(QXcbWindowFunctions::WmWindowTypes types, Qt::W switch (type) { case Qt::Dialog: case Qt::Sheet: - if (!(types & QXcbWindowFunctions::Dialog)) + if (!(types & WindowType::Dialog)) atoms.append(atom(QXcbAtom::_NET_WM_WINDOW_TYPE_DIALOG)); break; case Qt::Tool: case Qt::Drawer: - if (!(types & QXcbWindowFunctions::Utility)) + if (!(types & WindowType::Utility)) atoms.append(atom(QXcbAtom::_NET_WM_WINDOW_TYPE_UTILITY)); break; case Qt::ToolTip: - if (!(types & QXcbWindowFunctions::Tooltip)) + if (!(types & WindowType::Tooltip)) atoms.append(atom(QXcbAtom::_NET_WM_WINDOW_TYPE_TOOLTIP)); break; case Qt::SplashScreen: - if (!(types & QXcbWindowFunctions::Splash)) + if (!(types & WindowType::Splash)) atoms.append(atom(QXcbAtom::_NET_WM_WINDOW_TYPE_SPLASH)); break; default: break; } - if ((flags & Qt::FramelessWindowHint) && !(type & QXcbWindowFunctions::KdeOverride)) { + if ((flags & Qt::FramelessWindowHint) && !(type & WindowType::KdeOverride)) { // override netwm type - quick and easy for KDE noborder atoms.append(atom(QXcbAtom::_KDE_NET_WM_WINDOW_TYPE_OVERRIDE)); } @@ -1627,11 +1598,12 @@ void QXcbWindow::setWmWindowType(QXcbWindowFunctions::WmWindowTypes types, Qt::W xcb_flush(xcb_connection()); } -void QXcbWindow::setWmWindowRole(const QByteArray &role) +void QXcbWindow::setWindowRole(const QString &role) { + QByteArray roleData = role.toLatin1(); xcb_change_property(xcb_connection(), XCB_PROP_MODE_REPLACE, m_window, atom(QXcbAtom::WM_WINDOW_ROLE), XCB_ATOM_STRING, 8, - role.size(), role.constData()); + roleData.size(), roleData.constData()); } void QXcbWindow::setParentRelativeBackPixmap() diff --git a/src/plugins/platforms/xcb/qxcbwindow.h b/src/plugins/platforms/xcb/qxcbwindow.h index 258ee3fe95..b8e5159c7f 100644 --- a/src/plugins/platforms/xcb/qxcbwindow.h +++ b/src/plugins/platforms/xcb/qxcbwindow.h @@ -41,6 +41,7 @@ #define QXCBWINDOW_H #include <qpa/qplatformwindow.h> +#include <qpa/qplatformwindow_p.h> #include <QtGui/QSurfaceFormat> #include <QtGui/QImage> @@ -49,8 +50,6 @@ #include "qxcbobject.h" -#include <QtPlatformHeaders/private/qxcbwindowfunctions_p.h> - QT_BEGIN_NAMESPACE class QXcbScreen; @@ -58,6 +57,7 @@ class QXcbSyncWindowRequest; class QIcon; class Q_XCB_EXPORT QXcbWindow : public QXcbObject, public QXcbWindowEventListener, public QPlatformWindow + , public QPlatformInterface::Private::QXcbWindow { public: enum NetWmState { @@ -93,7 +93,7 @@ public: QPoint mapFromGlobal(const QPoint &pos) const override; void setWindowTitle(const QString &title) override; - void setWindowIconText(const QString &title); + void setWindowIconText(const QString &title) override; void setWindowIcon(const QIcon &icon) override; void raise() override; void lower() override; @@ -148,19 +148,14 @@ public: void updateNetWmUserTime(xcb_timestamp_t timestamp); - static void setWmWindowTypeStatic(QWindow *window, QXcbWindowFunctions::WmWindowTypes windowTypes); - static void setWmWindowRoleStatic(QWindow *window, const QByteArray &role); - static uint visualIdStatic(QWindow *window); - - QXcbWindowFunctions::WmWindowTypes wmWindowTypes() const; - void setWmWindowType(QXcbWindowFunctions::WmWindowTypes types, Qt::WindowFlags flags); - void setWmWindowRole(const QByteArray &role); - - static void setWindowIconTextStatic(QWindow *window, const QString &text); + WindowTypes wmWindowTypes() const; + void setWmWindowType(WindowTypes types, Qt::WindowFlags flags); + void setWindowType(WindowTypes windowTypes) override { setWmWindowType(windowTypes, window()->flags()); } + void setWindowRole(const QString &role) override; void setParentRelativeBackPixmap(); bool requestSystemTrayWindowDock(); - uint visualId() const; + uint visualId() const override; bool needsSync() const; |