diff -up qtbase-opensource-src-5.4.1/src/gui/kernel/qplatformwindow.cpp.QTBUG-45484 qtbase-opensource-src-5.4.1/src/gui/kernel/qplatformwindow.cpp --- qtbase-opensource-src-5.4.1/src/gui/kernel/qplatformwindow.cpp.QTBUG-45484 2015-02-16 22:56:48.000000000 -0600 +++ qtbase-opensource-src-5.4.1/src/gui/kernel/qplatformwindow.cpp 2015-05-25 08:45:55.305771441 -0500 @@ -286,6 +286,16 @@ void QPlatformWindow::setWindowFilePath( void QPlatformWindow::setWindowIcon(const QIcon &icon) { Q_UNUSED(icon); } /*! + Reimplement to set the window role to \a role +*/ +void QPlatformWindow::setWindowRole(const QString &role) { Q_UNUSED(role); } + +/*! + Reimplement to get the window role +*/ +QString QPlatformWindow::windowRole() const { return QString(); } + +/*! Reimplement to be able to let Qt raise windows to the top of the desktop */ void QPlatformWindow::raise() { qWarning("This plugin does not support raise()"); } diff -up qtbase-opensource-src-5.4.1/src/gui/kernel/qplatformwindow.h.QTBUG-45484 qtbase-opensource-src-5.4.1/src/gui/kernel/qplatformwindow.h --- qtbase-opensource-src-5.4.1/src/gui/kernel/qplatformwindow.h.QTBUG-45484 2015-02-16 22:56:48.000000000 -0600 +++ qtbase-opensource-src-5.4.1/src/gui/kernel/qplatformwindow.h 2015-05-25 08:45:55.305771441 -0500 @@ -90,9 +90,12 @@ public: virtual void setWindowTitle(const QString &title); virtual void setWindowFilePath(const QString &title); virtual void setWindowIcon(const QIcon &icon); + virtual void setWindowRole(const QString &role); virtual void raise(); virtual void lower(); + virtual QString windowRole() const; + virtual bool isExposed() const; virtual bool isActive() const; virtual bool isEmbedded(const QPlatformWindow *parentWindow) const; diff -up qtbase-opensource-src-5.4.1/src/plugins/platforms/xcb/qxcbwindow.cpp.QTBUG-45484 qtbase-opensource-src-5.4.1/src/plugins/platforms/xcb/qxcbwindow.cpp --- qtbase-opensource-src-5.4.1/src/plugins/platforms/xcb/qxcbwindow.cpp.QTBUG-45484 2015-05-25 08:45:55.258771302 -0500 +++ qtbase-opensource-src-5.4.1/src/plugins/platforms/xcb/qxcbwindow.cpp 2015-05-25 09:07:12.608572492 -0500 @@ -256,6 +256,7 @@ QXcbWindow::QXcbWindow(QWindow *window) , m_lastWindowStateEvent(-1) , m_syncState(NoSyncNeeded) , m_pendingSyncRequest(0) + , m_windowRole() { setConnection(xcbscreen()->connection()); @@ -1455,6 +1456,20 @@ void QXcbWindow::setWindowIcon(const QIc } } +void QXcbWindow::setWindowRole(const QString &role) +{ + const QByteArray ba = role.toLatin1(); + Q_XCB_CALL(xcb_change_property(xcb_connection(), + XCB_PROP_MODE_REPLACE, + m_window, + atom(QXcbAtom::WM_WINDOW_ROLE), + XCB_ATOM_STRING, + 8, + ba.length(), + ba.constData())); + m_windowRole = role; +} + void QXcbWindow::raise() { const quint32 mask = XCB_CONFIG_WINDOW_STACK_MODE; diff -up qtbase-opensource-src-5.4.1/src/plugins/platforms/xcb/qxcbwindow.h.QTBUG-45484 qtbase-opensource-src-5.4.1/src/plugins/platforms/xcb/qxcbwindow.h --- qtbase-opensource-src-5.4.1/src/plugins/platforms/xcb/qxcbwindow.h.QTBUG-45484 2015-05-25 08:45:55.258771302 -0500 +++ qtbase-opensource-src-5.4.1/src/plugins/platforms/xcb/qxcbwindow.h 2015-05-25 08:45:55.306771444 -0500 @@ -88,8 +88,12 @@ public: void setWindowTitle(const QString &title); void setWindowIcon(const QIcon &icon); + void setWindowRole(const QString &role); void raise(); void lower(); + + QString windowRole() const Q_DECL_OVERRIDE { return m_windowRole; } + void propagateSizeHints(); void requestActivateWindow(); @@ -234,6 +238,8 @@ private: SyncState m_syncState; QXcbSyncWindowRequest *m_pendingSyncRequest; + + QString m_windowRole; }; QT_END_NAMESPACE diff -up qtbase-opensource-src-5.4.1/src/widgets/kernel/qwidget.cpp.QTBUG-45484 qtbase-opensource-src-5.4.1/src/widgets/kernel/qwidget.cpp --- qtbase-opensource-src-5.4.1/src/widgets/kernel/qwidget.cpp.QTBUG-45484 2015-02-16 22:56:40.000000000 -0600 +++ qtbase-opensource-src-5.4.1/src/widgets/kernel/qwidget.cpp 2015-05-25 08:45:55.309771453 -0500 @@ -6226,8 +6226,11 @@ void QWidgetPrivate::setWindowFilePath_s QString QWidget::windowRole() const { - Q_D(const QWidget); - return (d->extra && d->extra->topextra) ? d->extra->topextra->role : QString(); + if (const QWindow *window = windowHandle()) + if (QPlatformWindow *platformWindow = window->handle()) + return platformWindow->windowRole(); + + return QString(); } /*! @@ -6236,13 +6239,9 @@ QString QWidget::windowRole() const */ void QWidget::setWindowRole(const QString &role) { -#if defined(Q_WS_X11) - Q_D(QWidget); - d->topData()->role = role; - d->setWindowRole(); -#else - Q_UNUSED(role) -#endif + if (const QWindow *window = windowHandle()) + if (QPlatformWindow *platformWindow = window->handle()) + return platformWindow->setWindowRole(role); } /*!