summaryrefslogtreecommitdiffstats
path: root/src/gui/kernel
diff options
context:
space:
mode:
Diffstat (limited to 'src/gui/kernel')
-rw-r--r--src/gui/kernel/qguiapplication.cpp2
-rw-r--r--src/gui/kernel/qplatformintegration.h1
-rw-r--r--src/gui/kernel/qwindow.cpp24
-rw-r--r--src/gui/kernel/qwindow_p.h2
4 files changed, 17 insertions, 12 deletions
diff --git a/src/gui/kernel/qguiapplication.cpp b/src/gui/kernel/qguiapplication.cpp
index 7c596d5ae5..c057fccade 100644
--- a/src/gui/kernel/qguiapplication.cpp
+++ b/src/gui/kernel/qguiapplication.cpp
@@ -1124,7 +1124,7 @@ static void init_platform(const QString &pluginArgument, const QString &platform
= QStringLiteral("This application failed to start because it could not find or load the Qt platform plugin \"%1\"\nin \"%2\".\n\n").arg(name, QDir::toNativeSeparators(platformPluginPath));
if (!keys.isEmpty()) {
fatalMessage += QStringLiteral("Available platform plugins are: %1.\n\n").arg(
- keys.join(QStringLiteral(", ")));
+ keys.join(QLatin1String(", ")));
}
fatalMessage += QStringLiteral("Reinstalling the application may fix this problem.");
#if defined(Q_OS_WIN) && !defined(Q_OS_WINRT)
diff --git a/src/gui/kernel/qplatformintegration.h b/src/gui/kernel/qplatformintegration.h
index 29f7b9b3a6..54904ef60d 100644
--- a/src/gui/kernel/qplatformintegration.h
+++ b/src/gui/kernel/qplatformintegration.h
@@ -109,6 +109,7 @@ public:
virtual QPlatformPixmap *createPlatformPixmap(QPlatformPixmap::PixelType type) const;
virtual QPlatformWindow *createPlatformWindow(QWindow *window) const = 0;
+ virtual QPlatformWindow *createForeignWindow(QWindow *, WId) const { return 0; }
virtual QPlatformBackingStore *createPlatformBackingStore(QWindow *window) const = 0;
#ifndef QT_NO_OPENGL
virtual QPlatformOpenGLContext *createPlatformOpenGLContext(QOpenGLContext *context) const;
diff --git a/src/gui/kernel/qwindow.cpp b/src/gui/kernel/qwindow.cpp
index 9d41a72072..8e98958949 100644
--- a/src/gui/kernel/qwindow.cpp
+++ b/src/gui/kernel/qwindow.cpp
@@ -424,7 +424,7 @@ void QWindowPrivate::setTopLevelScreen(QScreen *newScreen, bool recreate)
}
}
-void QWindowPrivate::create(bool recursive)
+void QWindowPrivate::create(bool recursive, WId nativeHandle)
{
Q_Q(QWindow);
if (platformWindow)
@@ -433,8 +433,10 @@ void QWindowPrivate::create(bool recursive)
if (q->parent())
q->parent()->create();
- platformWindow = QGuiApplicationPrivate::platformIntegration()->createPlatformWindow(q);
- Q_ASSERT(platformWindow || q->type() == Qt::ForeignWindow);
+ QPlatformIntegration *platformIntegration = QGuiApplicationPrivate::platformIntegration();
+ platformWindow = nativeHandle ? platformIntegration->createForeignWindow(q, nativeHandle)
+ : platformIntegration->createPlatformWindow(q);
+ Q_ASSERT(platformWindow);
if (!platformWindow) {
qWarning() << "Failed to create platform window for" << q << "with flags" << q->flags();
@@ -629,9 +631,6 @@ 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();
@@ -865,7 +864,12 @@ void QWindow::setFlags(Qt::WindowFlags flags)
Qt::WindowFlags QWindow::flags() const
{
Q_D(const QWindow);
- return d->windowFlags;
+ Qt::WindowFlags flags = d->windowFlags;
+
+ if (d->platformWindow && d->platformWindow->isForeignWindow())
+ flags |= Qt::ForeignWindow;
+
+ return flags;
}
/*!
@@ -2584,13 +2588,13 @@ QWindow *QWindow::fromWinId(WId id)
}
QWindow *window = new QWindow;
- window->setFlags(Qt::ForeignWindow);
- window->setProperty("_q_foreignWinId", QVariant::fromValue(id));
- window->create();
+ qt_window_private(window)->create(false, id);
+
if (!window->handle()) {
delete window;
return nullptr;
}
+
return window;
}
diff --git a/src/gui/kernel/qwindow_p.h b/src/gui/kernel/qwindow_p.h
index 272401453a..59016e4551 100644
--- a/src/gui/kernel/qwindow_p.h
+++ b/src/gui/kernel/qwindow_p.h
@@ -136,7 +136,7 @@ public:
void updateSiblingPosition(SiblingPosition);
bool windowRecreationRequired(QScreen *newScreen) const;
- void create(bool recursive);
+ void create(bool recursive, WId nativeHandle = 0);
void destroy();
void setTopLevelScreen(QScreen *newScreen, bool recreate);
void connectToScreen(QScreen *topLevelScreen);