Avoid using 0 as the default winId in QPlatformWindow.
authorLaszlo Agocs <laszlo.p.agocs@nokia.com>
Fri, 14 Oct 2011 14:11:06 +0000 (17:11 +0300)
committerQt by Nokia <qt-info@nokia.com>
Fri, 14 Oct 2011 17:42:26 +0000 (19:42 +0200)
When the platform plugin does not reimplement QPlatformWindow::winId()
to return a non-zero value, the default implementation provides a WId
of 0. This breaks various scenarios with QWidgets which, for example
in nativeParentWidget(), rely on internalWinId() being non-zero for
TLWs.

As a result, apps like collidingmice will crash with the 'minimal'
platform plugin when they try to do markDirtyOnScreen for the graphics
view's viewport widget because viewport()->nativeParentWidget()
unexpectedly returns null, even though it should return the
QGraphicsView.

The patch makes the default value WId(1) in order to to avoid this.

Change-Id: Iafef2e510e32b5610b8cef742313e9119ed64963
Reviewed-by: Samuel Rødal <samuel.rodal@nokia.com>
src/gui/kernel/qplatformwindow_qpa.cpp

index b29112a..fa1d3a3 100644 (file)
@@ -166,7 +166,14 @@ Qt::WindowState QPlatformWindow::setWindowState(Qt::WindowState)
 /*!
   Reimplement in subclasses to return a handle to the native window
 */
-WId QPlatformWindow::winId() const { return WId(0); }
+WId QPlatformWindow::winId() const
+{
+    // Return anything but 0. Returning 0 would cause havoc with QWidgets on
+    // very basic platform plugins that do not reimplement this function,
+    // because the top-level widget's internalWinId() would always be 0 which
+    // would mean top-levels are never treated as native.
+    return WId(1);
+}
 
 /*!
     This function is called to enable native child window in QPA. It is common not to support this