diff options
author | Alberto Mardegan <alberto.mardegan@canonical.com> | 2012-12-12 17:18:28 +0100 |
---|---|---|
committer | The Qt Project <gerrit-noreply@qt-project.org> | 2013-03-06 18:59:07 +0100 |
commit | b5bdd31de41cb5e6d6abedce79864fc01d8d4984 (patch) | |
tree | 030b374282b12a2857d80295a993fc550cb722f7 /src/gui/kernel/qwindow.cpp | |
parent | f0533ba8c22d6366f9d4fb8e8ce18554cd0d01e9 (diff) |
Implement XEmbed protocol
Add a static QWindow::fromWinId(WId id) constructor which can be used to
create a QWindow object representing windows created by other processes.
Then, QWindow::setParent() can be used to embed a window into a foreign
window socket and QWindow::setTransientParent() to stick the current
window on top of a foreign window.
The changes in the QtWidgets module ensure that the focus chain (TAB
navigation) correctly works when a QtWidgets-based window is embedded
into another application.
As far as the platform implementation is concerned, this commit only
implements the embedding functionality in the XCB plugin. So, this is
roughly equivalent to the Qt4 QX11EmbedWidget functionality.
Change-Id: Iff8f7b9ee974d33fb30f36056f7838b433a413c7
Reviewed-by: Gunnar Sletta <gunnar.sletta@digia.com>
Diffstat (limited to 'src/gui/kernel/qwindow.cpp')
-rw-r--r-- | src/gui/kernel/qwindow.cpp | 37 |
1 files changed, 36 insertions, 1 deletions
diff --git a/src/gui/kernel/qwindow.cpp b/src/gui/kernel/qwindow.cpp index 99a54dc847..3d4383301e 100644 --- a/src/gui/kernel/qwindow.cpp +++ b/src/gui/kernel/qwindow.cpp @@ -474,6 +474,10 @@ void QWindow::create() WId QWindow::winId() const { Q_D(const QWindow); + + if (type() == Qt::ForeignWindow) + return WId(property("_q_foreignWinId").value<WId>()); + if(!d->platformWindow) const_cast<QWindow *>(this)->create(); @@ -499,8 +503,11 @@ QWindow *QWindow::parent() const the clip of the window, so it will be clipped to the \a parent window. Setting \a parent to be 0 will make the window become a top level window. -*/ + If \a parent is a window created by fromWinId(), then the current window + will be embedded inside \a parent, if the platform supports it. Window + embedding is currently supported only by the X11 platform plugin. +*/ void QWindow::setParent(QWindow *parent) { Q_D(QWindow); @@ -2104,6 +2111,34 @@ void QWindowPrivate::maybeQuitOnLastWindowClosed() } +/*! + Creates a local representation of a window created by another process or by + using native libraries below Qt. + + Given the handle \a id to a native window, this method creates a QWindow + object which can be used to represent the window when invoking methods like + setParent() and setTransientParent(). + This can be used, on platforms which support it, to embed a window inside a + container or to make a window stick on top of a window created by another + process. + + \sa setParent() + \sa setTransientParent() +*/ +QWindow *QWindow::fromWinId(WId id) +{ + if (!QGuiApplicationPrivate::platformIntegration()->hasCapability(QPlatformIntegration::ForeignWindows)) { + qWarning() << "QWindow::fromWinId(): platform plugin does not support foreign windows."; + return 0; + } + + QWindow *window = new QWindow; + window->setFlags(Qt::ForeignWindow); + window->setProperty("_q_foreignWinId", QVariant::fromValue(id)); + window->create(); + return window; +} + #ifndef QT_NO_CURSOR /*! \brief set the cursor shape for this window |