diff options
author | Tor Arne Vestbø <tor.arne.vestbo@qt.io> | 2017-07-17 12:13:58 +0200 |
---|---|---|
committer | Tor Arne Vestbø <tor.arne.vestbo@qt.io> | 2017-07-17 13:05:55 +0000 |
commit | 4c855a9f9ff523e2753157897100393d14bf2f9e (patch) | |
tree | b2d757ff234415011397e1f520654f87e2946937 /src/gui/kernel/qplatformwindow.cpp | |
parent | 1e8a687a3a1d9a8ef6cec5be4911b8ff584e9825 (diff) |
Add QPlatformWindow::initialize() for two-step window creation
The QWindow::create method calls createPlatformWindow, and assigns the
result to d->platformWindow. If the platform sends any sort of events
synchronously during the creation, the event will be delivered to a
QWindow that doesn't have a handle() yet, resulting in noop handling
of the event, or crashes.
To mitigate this situations, platforms should do as little a possible
in the QPlatformWindow constructor, and leave initialization to the
new method, where the QWindow will have a handle().
The macOS platform plugin still has a m_initialized guard, to prevent
sending geometry changes during initialization, as this will result
in a resize event before a show event. This forced behavior seems
dubious, but is left for a followup patch.
Task-number: QTBUG-61977
Change-Id: I04d32d93391e89d068752b719270438e7024ad46
Reviewed-by: Morten Johan Sørvig <morten.sorvig@qt.io>
Reviewed-by: Simon Hausmann <simon.hausmann@qt.io>
Diffstat (limited to 'src/gui/kernel/qplatformwindow.cpp')
-rw-r--r-- | src/gui/kernel/qplatformwindow.cpp | 11 |
1 files changed, 11 insertions, 0 deletions
diff --git a/src/gui/kernel/qplatformwindow.cpp b/src/gui/kernel/qplatformwindow.cpp index a26a23243d..5ece421ea5 100644 --- a/src/gui/kernel/qplatformwindow.cpp +++ b/src/gui/kernel/qplatformwindow.cpp @@ -71,6 +71,17 @@ QPlatformWindow::~QPlatformWindow() } /*! + Called as part of QWindow::create(), after constructing + the window. Platforms should prefer to do initialization + here instead of in the constructor, as the platform window + object will be fully constructed, and associated to the + corresponding QWindow, allowing synchronous event delivery. +*/ +void QPlatformWindow::initialize() +{ +} + +/*! Returns the window which belongs to the QPlatformWindow */ QWindow *QPlatformWindow::window() const |