summaryrefslogtreecommitdiffstats
path: root/src/plugins/platforms
diff options
context:
space:
mode:
authorTor Arne Vestbø <tor.arne.vestbo@qt.io>2020-07-17 22:15:07 +0200
committerTor Arne Vestbø <tor.arne.vestbo@qt.io>2020-07-20 17:47:39 +0200
commit9166abcd997f57625c17db8e8734988ff303217e (patch)
treefa8c97b1f5d89e7c64645a2d261b75ddfbbea18c /src/plugins/platforms
parent6034494070041baab95b835a2605c795f0d7166c (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.cpp1
-rw-r--r--src/plugins/platforms/xcb/qxcbnativeinterface.cpp19
-rw-r--r--src/plugins/platforms/xcb/qxcbwindow.cpp116
-rw-r--r--src/plugins/platforms/xcb/qxcbwindow.h21
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;