| Line | Source Code | Coverage |
|---|
| 1 | /**************************************************************************** | - |
| | ** | |
| | ** Copyright (C) 2012 Digia Plc and/or its subsidiary(-ies). | |
| | ** Contact: http://www.qt-project.org/legal | |
| | ** | |
| | ** This file is part of the QtGui module of the Qt Toolkit. | |
| | ** | |
| | ** $QT_BEGIN_LICENSE:LGPL$ | |
| | ** Commercial License Usage | |
| | ** Licensees holding valid commercial Qt licenses may use this file in | |
| | ** accordance with the commercial license agreement provided with the | |
| | ** Software or, alternatively, in accordance with the terms contained in | |
| | ** a written agreement between you and Digia. For licensing terms and | |
| | ** conditions see http://qt.digia.com/licensing. For further information | |
| | ** use the contact form at http://qt.digia.com/contact-us. | |
| | ** | |
| | ** GNU Lesser General Public License Usage | |
| | ** Alternatively, this file may be used under the terms of the GNU Lesser | |
| | ** General Public License version 2.1 as published by the Free Software | |
| | ** Foundation and appearing in the file LICENSE.LGPL included in the | |
| | ** packaging of this file. Please review the following information to | |
| | ** ensure the GNU Lesser General Public License version 2.1 requirements | |
| | ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. | |
| | ** | |
| | ** In addition, as a special exception, Digia gives you certain additional | |
| | ** rights. These rights are described in the Digia Qt LGPL Exception | |
| | ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. | |
| | ** | |
| | ** GNU General Public License Usage | |
| | ** Alternatively, this file may be used under the terms of the GNU | |
| | ** General Public License version 3.0 as published by the Free Software | |
| | ** Foundation and appearing in the file LICENSE.GPL included in the | |
| | ** packaging of this file. Please review the following information to | |
| | ** ensure the GNU General Public License version 3.0 requirements will be | |
| | ** met: http://www.gnu.org/copyleft/gpl.html. | |
| | ** | |
| | ** | |
| | ** $QT_END_LICENSE$ | |
| | ** | |
| | ****************************************************************************/**************************************************************************** | |
| 2 | ** | - |
| 3 | ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). | - |
| 4 | ** Contact: http://www.qt-project.org/legal | - |
| 5 | ** | - |
| 6 | ** This file is part of the QtGui module of the Qt Toolkit. | - |
| 7 | ** | - |
| 8 | ** $QT_BEGIN_LICENSE:LGPL$ | - |
| 9 | ** Commercial License Usage | - |
| 10 | ** Licensees holding valid commercial Qt licenses may use this file in | - |
| 11 | ** accordance with the commercial license agreement provided with the | - |
| 12 | ** Software or, alternatively, in accordance with the terms contained in | - |
| 13 | ** a written agreement between you and Digia. For licensing terms and | - |
| 14 | ** conditions see http://qt.digia.com/licensing. For further information | - |
| 15 | ** use the contact form at http://qt.digia.com/contact-us. | - |
| 16 | ** | - |
| 17 | ** GNU Lesser General Public License Usage | - |
| 18 | ** Alternatively, this file may be used under the terms of the GNU Lesser | - |
| 19 | ** General Public License version 2.1 as published by the Free Software | - |
| 20 | ** Foundation and appearing in the file LICENSE.LGPL included in the | - |
| 21 | ** packaging of this file. Please review the following information to | - |
| 22 | ** ensure the GNU Lesser General Public License version 2.1 requirements | - |
| 23 | ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. | - |
| 24 | ** | - |
| 25 | ** In addition, as a special exception, Digia gives you certain additional | - |
| 26 | ** rights. These rights are described in the Digia Qt LGPL Exception | - |
| 27 | ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. | - |
| 28 | ** | - |
| 29 | ** GNU General Public License Usage | - |
| 30 | ** Alternatively, this file may be used under the terms of the GNU | - |
| 31 | ** General Public License version 3.0 as published by the Free Software | - |
| 32 | ** Foundation and appearing in the file LICENSE.GPL included in the | - |
| 33 | ** packaging of this file. Please review the following information to | - |
| 34 | ** ensure the GNU General Public License version 3.0 requirements will be | - |
| 35 | ** met: http://www.gnu.org/copyleft/gpl.html. | - |
| 36 | ** | - |
| 37 | ** | - |
| 38 | ** $QT_END_LICENSE$ | - |
| 39 | ** | - |
| 40 | ****************************************************************************/ | - |
| 41 | | - |
| 42 | #include "qplatformwindow.h" | - |
| 43 | #include "qplatformwindow_p.h" | - |
| 44 | | - |
| 45 | #include <private/qguiapplication_p.h> | - |
| 46 | #include <qpa/qwindowsysteminterface.h> | - |
| 47 | #include <QtGui/qwindow.h> | - |
| 48 | #include <QtGui/qscreen.h> | - |
| 49 | | - |
| 50 | QT_BEGIN_NAMESPACE | - |
| 51 | | - |
| 52 | /*! | - |
| 53 | Constructs a platform window with the given top level window. | - |
| 54 | */ | - |
| 55 | | - |
| 56 | QPlatformWindow::QPlatformWindow(QWindow *window) | - |
| 57 | : QPlatformSurface(window) | - |
| 58 | , d_ptr(new QPlatformWindowPrivate) | - |
| 59 | { | - |
| 60 | Q_D(QPlatformWindow); | - |
| 61 | d->rect = window->geometry(); | - |
| 62 | } | - |
| 63 | | - |
| 64 | /*! | - |
| 65 | Virtual destructor does not delete its top level window. | - |
| 66 | */ | - |
| 67 | QPlatformWindow::~QPlatformWindow() | - |
| 68 | { | - |
| 69 | } | - |
| 70 | | - |
| 71 | /*! | - |
| 72 | Returns the window which belongs to the QPlatformWindow | - |
| 73 | */ | - |
| 74 | QWindow *QPlatformWindow::window() const | - |
| 75 | { | - |
| 76 | return static_cast<QWindow *>(m_surface); | - |
| 77 | } | - |
| 78 | | - |
| 79 | /*! | - |
| 80 | Returns the parent platform window (or 0 if orphan). | - |
| 81 | */ | - |
| 82 | QPlatformWindow *QPlatformWindow::parent() const | - |
| 83 | { | - |
| 84 | return window()->parent() ? window()->parent()->handle() : 0; | - |
| 85 | } | - |
| 86 | | - |
| 87 | /*! | - |
| 88 | Returns the platform screen handle corresponding to this platform window. | - |
| 89 | */ | - |
| 90 | QPlatformScreen *QPlatformWindow::screen() const | - |
| 91 | { | - |
| 92 | return window()->screen()->handle(); | - |
| 93 | } | - |
| 94 | | - |
| 95 | /*! | - |
| 96 | Returns the actual surface format of the window. | - |
| 97 | */ | - |
| 98 | QSurfaceFormat QPlatformWindow::format() const | - |
| 99 | { | - |
| 100 | return QSurfaceFormat(); | - |
| 101 | } | - |
| 102 | | - |
| 103 | /*! | - |
| 104 | This function is called by Qt whenever a window is moved or the window is resized. The resize | - |
| 105 | can happen programatically(from ie. user application) or by the window manager. This means that | - |
| 106 | there is no need to call this function specifically from the window manager callback, instead | - |
| 107 | call QWindowSystemInterface::handleGeometryChange(QWindow *w, const QRect &newRect); | - |
| 108 | | - |
| 109 | The position(x, y) part of the rect might be inclusive or exclusive of the window frame | - |
| 110 | as returned by frameMargins(). You can detect this in the plugin by checking | - |
| 111 | qt_window_private(window())->positionPolicy. | - |
| 112 | */ | - |
| 113 | void QPlatformWindow::setGeometry(const QRect &rect) | - |
| 114 | { | - |
| 115 | Q_D(QPlatformWindow); | - |
| 116 | d->rect = rect; | - |
| 117 | } | - |
| 118 | | - |
| 119 | /*! | - |
| 120 | Returnes the current geometry of a window | - |
| 121 | */ | - |
| 122 | QRect QPlatformWindow::geometry() const | - |
| 123 | { | - |
| 124 | Q_D(const QPlatformWindow); | - |
| 125 | return d->rect; | - |
| 126 | } | - |
| 127 | | - |
| 128 | QMargins QPlatformWindow::frameMargins() const | - |
| 129 | { | - |
| 130 | return QMargins(); | - |
| 131 | } | - |
| 132 | | - |
| 133 | /*! | - |
| 134 | Reimplemented in subclasses to show the surface | - |
| 135 | if \a visible is \c true, and hide it if \a visible is \c false. | - |
| 136 | | - |
| 137 | The default implementation sends a synchronous expose event. | - |
| 138 | */ | - |
| 139 | void QPlatformWindow::setVisible(bool visible) | - |
| 140 | { | - |
| 141 | Q_UNUSED(visible); | - |
| 142 | QRect rect(QPoint(), geometry().size()); | - |
| 143 | QWindowSystemInterface::handleExposeEvent(window(), rect); | - |
| 144 | QWindowSystemInterface::flushWindowSystemEvents(); | - |
| 145 | } | - |
| 146 | | - |
| 147 | /*! | - |
| 148 | Requests setting the window flags of this surface | - |
| 149 | to \a flags. | - |
| 150 | */ | - |
| 151 | void QPlatformWindow::setWindowFlags(Qt::WindowFlags flags) | - |
| 152 | { | - |
| 153 | Q_UNUSED(flags); | - |
| 154 | } | - |
| 155 | | - |
| 156 | /*! | - |
| 157 | Returns if this window is exposed in the windowing system. | - |
| 158 | | - |
| 159 | An exposeEvent() is sent every time this value changes. | - |
| 160 | */ | - |
| 161 | | - |
| 162 | bool QPlatformWindow::isExposed() const | - |
| 163 | { | - |
| 164 | return window()->isVisible(); | - |
| 165 | } | - |
| 166 | | - |
| 167 | /*! | - |
| 168 | Returns true if the window should appear active from a style perspective. | - |
| 169 | | - |
| 170 | This function can make platform-specific isActive checks, such as checking | - |
| 171 | if the QWindow is embedded in an active native window. | - |
| 172 | */ | - |
| 173 | bool QPlatformWindow::isActive() const | - |
| 174 | { | - |
| 175 | return false; | - |
| 176 | } | - |
| 177 | | - |
| 178 | /*! | - |
| 179 | Returns true if the window is a descendant of an embedded non-Qt window. | - |
| 180 | Example of an embedded non-Qt window is the parent window of an in-process QAxServer. | - |
| 181 | | - |
| 182 | If \a parentWindow is nonzero, only check if the window is embedded in the | - |
| 183 | specified \a parentWindow. | - |
| 184 | */ | - |
| 185 | bool QPlatformWindow::isEmbedded(const QPlatformWindow *parentWindow) const | - |
| 186 | { | - |
| 187 | Q_UNUSED(parentWindow); | - |
| 188 | return false; | - |
| 189 | } | - |
| 190 | | - |
| 191 | /*! | - |
| 192 | Translates the window coordinate \a pos to global screen | - |
| 193 | coordinates using native methods. This is required for embedded windows, | - |
| 194 | where the topmost QWindow coordinates are not global screen coordinates. | - |
| 195 | | - |
| 196 | Returns \a pos if there is no platform specific implementation. | - |
| 197 | */ | - |
| 198 | QPoint QPlatformWindow::mapToGlobal(const QPoint &pos) const | - |
| 199 | { | - |
| 200 | return pos; | - |
| 201 | } | - |
| 202 | | - |
| 203 | /*! | - |
| 204 | Translates the global screen coordinate \a pos to window | - |
| 205 | coordinates using native methods. This is required for embedded windows, | - |
| 206 | where the topmost QWindow coordinates are not global screen coordinates. | - |
| 207 | | - |
| 208 | Returns \a pos if there is no platform specific implementation. | - |
| 209 | */ | - |
| 210 | QPoint QPlatformWindow::mapFromGlobal(const QPoint &pos) const | - |
| 211 | { | - |
| 212 | return pos; | - |
| 213 | } | - |
| 214 | | - |
| 215 | /*! | - |
| 216 | Requests setting the window state of this surface | - |
| 217 | to \a type. | - |
| 218 | | - |
| 219 | Qt::WindowActive can be ignored. | - |
| 220 | */ | - |
| 221 | void QPlatformWindow::setWindowState(Qt::WindowState) | - |
| 222 | { | - |
| 223 | } | - |
| 224 | | - |
| 225 | /*! | - |
| 226 | Reimplement in subclasses to return a handle to the native window | - |
| 227 | */ | - |
| 228 | WId QPlatformWindow::winId() const | - |
| 229 | { | - |
| 230 | // Return anything but 0. Returning 0 would cause havoc with QWidgets on | - |
| 231 | // very basic platform plugins that do not reimplement this function, | - |
| 232 | // because the top-level widget's internalWinId() would always be 0 which | - |
| 233 | // would mean top-levels are never treated as native. | - |
| 234 | return WId(1); | - |
| 235 | } | - |
| 236 | | - |
| 237 | /*! | - |
| 238 | This function is called to enable native child window in QPA. It is common not to support this | - |
| 239 | feature in Window systems, but can be faked. When this function is called all geometry of this | - |
| 240 | platform window will be relative to the parent. | - |
| 241 | */ | - |
| 242 | //jl: It would be useful to have a property on the platform window which indicated if the sub-class | - |
| 243 | // supported the setParent. If not, then geometry would be in screen coordinates. | - |
| 244 | void QPlatformWindow::setParent(const QPlatformWindow *parent) | - |
| 245 | { | - |
| 246 | Q_UNUSED(parent); | - |
| 247 | qWarning("This plugin does not support setParent!"); | - |
| 248 | } | - |
| 249 | | - |
| 250 | /*! | - |
| 251 | Reimplement to set the window title to \a title. | - |
| 252 | | - |
| 253 | The implementation might want to append the application display name to | - |
| 254 | the window title, like Windows and Linux do. | - |
| 255 | | - |
| 256 | \sa QGuiApplication::applicationDisplayName() | - |
| 257 | */ | - |
| 258 | void QPlatformWindow::setWindowTitle(const QString &title) { Q_UNUSED(title); } | - |
| 259 | | - |
| 260 | /*! | - |
| 261 | Reimplement to set the window file path to \a filePath | - |
| 262 | */ | - |
| 263 | void QPlatformWindow::setWindowFilePath(const QString &filePath) { Q_UNUSED(filePath); } | - |
| 264 | | - |
| 265 | /*! | - |
| 266 | Reimplement to set the window icon to \a icon | - |
| 267 | */ | - |
| 268 | void QPlatformWindow::setWindowIcon(const QIcon &icon) { Q_UNUSED(icon); } | - |
| 269 | | - |
| 270 | /*! | - |
| 271 | Reimplement to be able to let Qt raise windows to the top of the desktop | - |
| 272 | */ | - |
| 273 | void QPlatformWindow::raise() { qWarning("This plugin does not support raise()"); } | - |
| 274 | | - |
| 275 | /*! | - |
| 276 | Reimplement to be able to let Qt lower windows to the bottom of the desktop | - |
| 277 | */ | - |
| 278 | void QPlatformWindow::lower() { qWarning("This plugin does not support lower()"); } | - |
| 279 | | - |
| 280 | /*! | - |
| 281 | Reimplement to propagate the size hints of the QWindow. | - |
| 282 | | - |
| 283 | The size hints include QWindow::minimumSize(), QWindow::maximumSize(), | - |
| 284 | QWindow::sizeIncrement(), and QWindow::baseSize(). | - |
| 285 | */ | - |
| 286 | void QPlatformWindow::propagateSizeHints() {qWarning("This plugin does not support propagateSizeHints()"); } | - |
| 287 | | - |
| 288 | /*! | - |
| 289 | Reimplement to be able to let Qt set the opacity level of a window | - |
| 290 | */ | - |
| 291 | void QPlatformWindow::setOpacity(qreal level) | - |
| 292 | { | - |
| 293 | Q_UNUSED(level); | - |
| 294 | qWarning("This plugin does not support setting window opacity"); | - |
| 295 | } | - |
| 296 | | - |
| 297 | /*! | - |
| 298 | Reimplement to be able to let Qt set the mask of a window | - |
| 299 | */ | - |
| 300 | | - |
| 301 | void QPlatformWindow::setMask(const QRegion ®ion) | - |
| 302 | { | - |
| 303 | Q_UNUSED(region); | - |
| 304 | qWarning("This plugin does not support setting window masks"); | - |
| 305 | } | - |
| 306 | | - |
| 307 | /*! | - |
| 308 | Reimplement to let Qt be able to request activation/focus for a window | - |
| 309 | | - |
| 310 | Some window systems will probably not have callbacks for this functionality, | - |
| 311 | and then calling QWindowSystemInterface::handleWindowActivated(QWindow *w) | - |
| 312 | would be sufficient. | - |
| 313 | | - |
| 314 | If the window system has some event handling/callbacks then call | - |
| 315 | QWindowSystemInterface::handleWindowActivated(QWindow *w) when the window system | - |
| 316 | gives the notification. | - |
| 317 | | - |
| 318 | Default implementation calls QWindowSystem::handleWindowActivated(QWindow *w) | - |
| 319 | */ | - |
| 320 | void QPlatformWindow::requestActivateWindow() | - |
| 321 | { | - |
| 322 | QWindowSystemInterface::handleWindowActivated(window()); | - |
| 323 | } | - |
| 324 | | - |
| 325 | /*! | - |
| 326 | Handle changes to the orientation of the platform window's contents. | - |
| 327 | | - |
| 328 | This is a hint to the window manager in case it needs to display | - |
| 329 | additional content like popups, dialogs, status bars, or similar | - |
| 330 | in relation to the window. | - |
| 331 | | - |
| 332 | \sa QWindow::reportContentOrientationChange() | - |
| 333 | */ | - |
| 334 | void QPlatformWindow::handleContentOrientationChange(Qt::ScreenOrientation orientation) | - |
| 335 | { | - |
| 336 | Q_UNUSED(orientation); | - |
| 337 | } | - |
| 338 | | - |
| 339 | /*! | - |
| 340 | Reimplement this function in subclass to return the device pixel ratio | - |
| 341 | for the window. This is the ratio between physical pixels | - |
| 342 | and device-independent pixels. | - |
| 343 | | - |
| 344 | \sa QPlatformWindow::devicePixelRatio(); | - |
| 345 | */ | - |
| 346 | qreal QPlatformWindow::devicePixelRatio() const | - |
| 347 | { | - |
| 348 | return 1.0; | - |
| 349 | } | - |
| 350 | | - |
| 351 | bool QPlatformWindow::setKeyboardGrabEnabled(bool grab) | - |
| 352 | { | - |
| 353 | Q_UNUSED(grab); | - |
| 354 | qWarning("This plugin does not support grabbing the keyboard"); | - |
| 355 | return false; | - |
| 356 | } | - |
| 357 | | - |
| 358 | bool QPlatformWindow::setMouseGrabEnabled(bool grab) | - |
| 359 | { | - |
| 360 | Q_UNUSED(grab); | - |
| 361 | qWarning("This plugin does not support grabbing the mouse"); | - |
| 362 | return false; | - |
| 363 | } | - |
| 364 | | - |
| 365 | /*! | - |
| 366 | Reimplement to be able to let Qt indicate that the window has been | - |
| 367 | modified. Return true if the native window supports setting the modified | - |
| 368 | flag, false otherwise. | - |
| 369 | */ | - |
| 370 | bool QPlatformWindow::setWindowModified(bool modified) | - |
| 371 | { | - |
| 372 | Q_UNUSED(modified); | - |
| 373 | return false; | - |
| 374 | } | - |
| 375 | | - |
| 376 | /*! | - |
| 377 | Reimplement this method to be able to do any platform specific event | - |
| 378 | handling. All events for window() are passed to this function before being | - |
| 379 | sent to QWindow::event(). | - |
| 380 | | - |
| 381 | The default implementation is empty and does nothing with \a event. | - |
| 382 | */ | - |
| 383 | void QPlatformWindow::windowEvent(QEvent *event) | - |
| 384 | { | - |
| 385 | Q_UNUSED(event); | - |
| 386 | } | - |
| 387 | | - |
| 388 | /*! | - |
| 389 | Reimplement this method to start a system size grip drag | - |
| 390 | operation if the system supports it and return true to indicate | - |
| 391 | success. | - |
| 392 | It is called from the mouse press event handler of the size grip. | - |
| 393 | | - |
| 394 | The default implementation is empty and does nothing with \a pos | - |
| 395 | and \a corner. | - |
| 396 | */ | - |
| 397 | | - |
| 398 | bool QPlatformWindow::startSystemResize(const QPoint &pos, Qt::Corner corner) | - |
| 399 | { | - |
| 400 | Q_UNUSED(pos) | - |
| 401 | Q_UNUSED(corner) | - |
| 402 | return false; | - |
| 403 | } | - |
| 404 | | - |
| 405 | /*! | - |
| 406 | Reimplement this method to set whether frame strut events | - |
| 407 | should be sent to \a enabled. | - |
| 408 | | - |
| 409 | \sa frameStrutEventsEnabled | - |
| 410 | */ | - |
| 411 | | - |
| 412 | void QPlatformWindow::setFrameStrutEventsEnabled(bool enabled) | - |
| 413 | { | - |
| 414 | if (enabled) | - |
| 415 | qWarning("This plugin does not support frame strut events."); | - |
| 416 | } | - |
| 417 | | - |
| 418 | /*! | - |
| 419 | Reimplement this method to return whether | - |
| 420 | frame strut events are enabled. | - |
| 421 | */ | - |
| 422 | | - |
| 423 | bool QPlatformWindow::frameStrutEventsEnabled() const | - |
| 424 | { | - |
| 425 | return false; | - |
| 426 | } | - |
| 427 | | - |
| 428 | /*! | - |
| 429 | Call this method to put together a window title composed of | - |
| 430 | \a title | - |
| 431 | \a separator | - |
| 432 | the application display name | - |
| 433 | | - |
| 434 | If the display name isn't set, and the title is empty, the raw app name is used. | - |
| 435 | */ | - |
| 436 | QString QPlatformWindow::formatWindowTitle(const QString &title, const QString &separator) | - |
| 437 | { | - |
| 438 | QString fullTitle = title; executed (the execution status of this line is deduced): QString fullTitle = title; | - |
| 439 | if (QGuiApplicationPrivate::displayName) { partially evaluated: QGuiApplicationPrivate::displayName| no Evaluation Count:0 | yes Evaluation Count:5581 |
| 0-5581 |
| 440 | // Append display name, if set. | - |
| 441 | if (!fullTitle.isEmpty()) never evaluated: !fullTitle.isEmpty() | 0 |
| 442 | fullTitle += separator; never executed: fullTitle += separator; | 0 |
| 443 | fullTitle += *QGuiApplicationPrivate::displayName; never executed (the execution status of this line is deduced): fullTitle += *QGuiApplicationPrivate::displayName; | - |
| 444 | } else if (fullTitle.isEmpty()) { never executed: } evaluated: fullTitle.isEmpty()| yes Evaluation Count:5232 | yes Evaluation Count:349 |
| 0-5232 |
| 445 | // Don't let the window title be completely empty, use the app name as fallback. | - |
| 446 | fullTitle = QCoreApplication::applicationName(); executed (the execution status of this line is deduced): fullTitle = QCoreApplication::applicationName(); | - |
| 447 | } executed: }Execution Count:5232 | 5232 |
| 448 | return fullTitle; executed: return fullTitle;Execution Count:5581 | 5581 |
| 449 | } | - |
| 450 | | - |
| 451 | /*! | - |
| 452 | \class QPlatformWindow | - |
| 453 | \since 4.8 | - |
| 454 | \internal | - |
| 455 | \preliminary | - |
| 456 | \ingroup qpa | - |
| 457 | | - |
| 458 | \brief The QPlatformWindow class provides an abstraction for top-level windows. | - |
| 459 | | - |
| 460 | The QPlatformWindow abstraction is used by QWindow for all its top level windows. It is being | - |
| 461 | created by calling the createPlatformWindow function in the loaded QPlatformIntegration | - |
| 462 | instance. | - |
| 463 | | - |
| 464 | QPlatformWindow is used to signal to the windowing system, how Qt perceives its frame. | - |
| 465 | However, it is not concerned with how Qt renders into the window it represents. | - |
| 466 | | - |
| 467 | Visible QWindows will always have a QPlatformWindow. However, it is not necessary for | - |
| 468 | all windows to have a QBackingStore. This is the case for QOpenGLWidget. And could be the case for | - |
| 469 | windows where some 3.party renders into it. | - |
| 470 | | - |
| 471 | The platform specific window handle can be retrieved by the winId function. | - |
| 472 | | - |
| 473 | QPlatformWindow is also the way QPA defines how native child windows should be supported | - |
| 474 | through the setParent function. | - |
| 475 | | - |
| 476 | \section1 Implementation Aspects | - |
| 477 | | - |
| 478 | \list 1 | - |
| 479 | \li Mouse grab: Qt expects windows to automatically grab the mouse if the user presses | - |
| 480 | a button until the button is released. | - |
| 481 | Automatic grab should be released if some window is explicitly grabbed. | - |
| 482 | \li Enter/Leave events: If there is a window explicitly grabbing mouse events | - |
| 483 | (\c{setMouseGrabEnabled()}), enter and leave events should only be sent to the | - |
| 484 | grabbing window when mouse cursor passes over the grabbing window boundary. | - |
| 485 | Other windows will not receive enter or leave events while the grab is active. | - |
| 486 | While an automatic mouse grab caused by a mouse button press is active, no window | - |
| 487 | will receive enter or leave events. When the last mouse button is released, the | - |
| 488 | autograbbing window will receive leave event if mouse cursor is no longer within | - |
| 489 | the window boundary. | - |
| 490 | When any grab starts, the window under cursor will receive a leave event unless | - |
| 491 | it is the grabbing window. | - |
| 492 | When any grab ends, the window under cursor will receive an enter event unless it | - |
| 493 | was the grabbing window. | - |
| 494 | \li Window positioning: When calling \c{QWindow::setFramePosition()}, the flag | - |
| 495 | \c{QWindowPrivate::positionPolicy} is set to \c{QWindowPrivate::WindowFrameInclusive}. | - |
| 496 | This means the position includes the window frame, whose size is at this point | - |
| 497 | unknown and the geometry's topleft point is the position of the window frame. | - |
| 498 | \endlist | - |
| 499 | | - |
| 500 | Apart from the auto-tests (\c{tests/auto/gui/kernel/qwindow}, | - |
| 501 | \c{tests/auto/gui/kernel/qguiapplication} and \c{tests/auto/widgets/kernel/qwidget}), | - |
| 502 | there are a number of manual tests and examples that can help testing a platform plugin: | - |
| 503 | | - |
| 504 | \list 1 | - |
| 505 | \li \c{examples/qpa/windows}: Basic \c{QWindow} creation. | - |
| 506 | \li \c{examples/opengl/hellowindow}: Basic Open GL windows. | - |
| 507 | \li \c{tests/manual/windowflags}: Tests setting the window flags. | - |
| 508 | \li \c{tests/manual/windowgeometry} Tests setting the window geometry. | - |
| 509 | \li \c{tests/manual/windowmodality} Tests setting the window modality. | - |
| 510 | \li \c{tests/manual/widgetgrab} Tests mouse grab and dialogs. | - |
| 511 | \endlist | - |
| 512 | | - |
| 513 | \sa QBackingStore, QWindow | - |
| 514 | */ | - |
| 515 | | - |
| 516 | QT_END_NAMESPACE | - |
| 517 | | - |
| | |