1 /****************************************************************************
3 ** Copyright (C) 2012 Digia Plc and/or its subsidiary(-ies).
4 ** Contact: http://www.qt-project.org/legal
6 ** This file is part of the QtGui module of the Qt Toolkit.
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.
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.
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.
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.
40 ****************************************************************************/
42 #include "qplatformwindow.h"
43 #include "qplatformwindow_p.h"
45 #include <qpa/qwindowsysteminterface.h>
46 #include <QtGui/qwindow.h>
47 #include <QtGui/qscreen.h>
52 Constructs a platform window with the given top level window.
55 QPlatformWindow::QPlatformWindow(QWindow *window)
56 : QPlatformSurface(window)
57 , d_ptr(new QPlatformWindowPrivate)
60 d->rect = window->geometry();
64 Virtual destructor does not delete its top level window.
66 QPlatformWindow::~QPlatformWindow()
71 Returns the window which belongs to the QPlatformWindow
73 QWindow *QPlatformWindow::window() const
75 return static_cast<QWindow *>(m_surface);
79 Returns the parent platform window (or 0 if orphan).
81 QPlatformWindow *QPlatformWindow::parent() const
83 return window()->parent() ? window()->parent()->handle() : 0;
87 Returns the platform screen handle corresponding to this platform window.
89 QPlatformScreen *QPlatformWindow::screen() const
91 return window()->screen()->handle();
95 Returns the actual surface format of the window.
97 QSurfaceFormat QPlatformWindow::format() const
99 return QSurfaceFormat();
103 This function is called by Qt whenever a window is moved or the window is resized. The resize
104 can happen programatically(from ie. user application) or by the window manager. This means that
105 there is no need to call this function specifically from the window manager callback, instead
106 call QWindowSystemInterface::handleGeometryChange(QWindow *w, const QRect &newRect);
108 The position(x, y) part of the rect might be inclusive or exclusive of the window frame
109 as returned by frameMargins(). You can detect this in the plugin by checking
110 qt_window_private(window())->positionPolicy.
112 void QPlatformWindow::setGeometry(const QRect &rect)
114 Q_D(QPlatformWindow);
119 Returnes the current geometry of a window
121 QRect QPlatformWindow::geometry() const
123 Q_D(const QPlatformWindow);
127 QMargins QPlatformWindow::frameMargins() const
133 Reimplemented in subclasses to show the surface
134 if \a visible is \c true, and hide it if \a visible is \c false.
136 The default implementation sends a synchronous expose event.
138 void QPlatformWindow::setVisible(bool visible)
141 QRect rect(QPoint(), geometry().size());
142 QWindowSystemInterface::handleExposeEvent(window(), rect);
143 QWindowSystemInterface::flushWindowSystemEvents();
147 Requests setting the window flags of this surface
150 void QPlatformWindow::setWindowFlags(Qt::WindowFlags flags)
156 Returns if this window is exposed in the windowing system.
158 An exposeEvent() is sent every time this value changes.
161 bool QPlatformWindow::isExposed() const
163 return window()->isVisible();
167 Returns true if the window should appear active from a style perspective.
169 This function can make platform-specific isActive checks, such as checking
170 if the QWindow is embedded in an active native window.
172 bool QPlatformWindow::isActive() const
178 Returns true if the window is a descendant of an embedded non-Qt window.
179 Example of an embedded non-Qt window is the parent window of an in-process QAxServer.
181 If \a parentWindow is nonzero, only check if the window is embedded in the
182 specified \a parentWindow.
184 bool QPlatformWindow::isEmbedded(const QPlatformWindow *parentWindow) const
186 Q_UNUSED(parentWindow);
191 Translates the window coordinate \a pos to global screen
192 coordinates using native methods. This is required for embedded windows,
193 where the topmost QWindow coordinates are not global screen coordinates.
195 Returns \a pos if there is no platform specific implementation.
197 QPoint QPlatformWindow::mapToGlobal(const QPoint &pos) const
203 Translates the global screen coordinate \a pos to window
204 coordinates using native methods. This is required for embedded windows,
205 where the topmost QWindow coordinates are not global screen coordinates.
207 Returns \a pos if there is no platform specific implementation.
209 QPoint QPlatformWindow::mapFromGlobal(const QPoint &pos) const
215 Requests setting the window state of this surface
218 Qt::WindowActive can be ignored.
220 void QPlatformWindow::setWindowState(Qt::WindowState)
225 Reimplement in subclasses to return a handle to the native window
227 WId QPlatformWindow::winId() const
229 // Return anything but 0. Returning 0 would cause havoc with QWidgets on
230 // very basic platform plugins that do not reimplement this function,
231 // because the top-level widget's internalWinId() would always be 0 which
232 // would mean top-levels are never treated as native.
237 This function is called to enable native child window in QPA. It is common not to support this
238 feature in Window systems, but can be faked. When this function is called all geometry of this
239 platform window will be relative to the parent.
241 //jl: It would be useful to have a property on the platform window which indicated if the sub-class
242 // supported the setParent. If not, then geometry would be in screen coordinates.
243 void QPlatformWindow::setParent(const QPlatformWindow *parent)
246 qWarning("This plugin does not support setParent!");
250 Reimplement to set the window title to \a title
252 void QPlatformWindow::setWindowTitle(const QString &title) { Q_UNUSED(title); }
255 Reimplement to set the window file path to \a filePath
257 void QPlatformWindow::setWindowFilePath(const QString &filePath) { Q_UNUSED(filePath); }
260 Reimplement to set the window icon to \a icon
262 void QPlatformWindow::setWindowIcon(const QIcon &icon) { Q_UNUSED(icon); }
265 Reimplement to be able to let Qt raise windows to the top of the desktop
267 void QPlatformWindow::raise() { qWarning("This plugin does not support raise()"); }
270 Reimplement to be able to let Qt lower windows to the bottom of the desktop
272 void QPlatformWindow::lower() { qWarning("This plugin does not support lower()"); }
275 Reimplement to propagate the size hints of the QWindow.
277 The size hints include QWindow::minimumSize(), QWindow::maximumSize(),
278 QWindow::sizeIncrement(), and QWindow::baseSize().
280 void QPlatformWindow::propagateSizeHints() {qWarning("This plugin does not support propagateSizeHints()"); }
283 Reimplement to be able to let Qt set the opacity level of a window
285 void QPlatformWindow::setOpacity(qreal level)
288 qWarning("This plugin does not support setting window opacity");
292 Reimplement to be able to let Qt set the mask of a window
295 void QPlatformWindow::setMask(const QRegion ®ion)
298 qWarning("This plugin does not support setting window masks");
302 Reimplement to let Qt be able to request activation/focus for a window
304 Some window systems will probably not have callbacks for this functionality,
305 and then calling QWindowSystemInterface::handleWindowActivated(QWindow *w)
308 If the window system has some event handling/callbacks then call
309 QWindowSystemInterface::handleWindowActivated(QWindow *w) when the window system
310 gives the notification.
312 Default implementation calls QWindowSystem::handleWindowActivated(QWindow *w)
314 void QPlatformWindow::requestActivateWindow()
316 QWindowSystemInterface::handleWindowActivated(window());
320 Handle changes to the orientation of the platform window's contents.
322 This is a hint to the window manager in case it needs to display
323 additional content like popups, dialogs, status bars, or similar
324 in relation to the window.
326 \sa QWindow::reportContentOrientationChange()
328 void QPlatformWindow::handleContentOrientationChange(Qt::ScreenOrientation orientation)
330 Q_UNUSED(orientation);
334 Request a different orientation of the platform window.
336 This tells the window manager how the window wants to be rotated in order
337 to be displayed, and how input events should be translated.
339 As an example, a portrait compositor might rotate the window by 90 degrees,
340 if the window is in landscape. It will also rotate input coordinates from
341 portrait to landscape such that top right in portrait gets mapped to top
344 If the implementation doesn't support the requested orientation it should
345 signal this by returning an actual supported orientation.
347 If the implementation doesn't support rotating the window at all it should
348 return Qt::PrimaryOrientation, this is also the default value.
350 \sa QWindow::requestWindowOrientation()
352 Qt::ScreenOrientation QPlatformWindow::requestWindowOrientation(Qt::ScreenOrientation orientation)
354 Q_UNUSED(orientation);
355 return Qt::PrimaryOrientation;
358 bool QPlatformWindow::setKeyboardGrabEnabled(bool grab)
361 qWarning("This plugin does not support grabbing the keyboard");
365 bool QPlatformWindow::setMouseGrabEnabled(bool grab)
368 qWarning("This plugin does not support grabbing the mouse");
373 Reimplement to be able to let Qt indicate that the window has been
374 modified. Return true if the native window supports setting the modified
375 flag, false otherwise.
377 bool QPlatformWindow::setWindowModified(bool modified)
384 Reimplement this method to be able to do any platform specific event
385 handling. All events for window() are passed to this function before being
386 sent to QWindow::event().
388 The default implementation is empty and does nothing with \a event.
390 void QPlatformWindow::windowEvent(QEvent *event)
396 Reimplement this method to start a system size grip drag
397 operation if the system supports it and return true to indicate
399 It is called from the mouse press event handler of the size grip.
401 The default implementation is empty and does nothing with \a pos
405 bool QPlatformWindow::startSystemResize(const QPoint &pos, Qt::Corner corner)
413 Reimplement this method to set whether frame strut events
414 should be sent to \a enabled.
416 \sa frameStrutEventsEnabled
419 void QPlatformWindow::setFrameStrutEventsEnabled(bool enabled)
422 qWarning("This plugin does not support frame strut events.");
426 Reimplement this method to return whether
427 frame strut events are enabled.
430 bool QPlatformWindow::frameStrutEventsEnabled() const
436 \class QPlatformWindow
442 \brief The QPlatformWindow class provides an abstraction for top-level windows.
444 The QPlatformWindow abstraction is used by QWindow for all its top level windows. It is being
445 created by calling the createPlatformWindow function in the loaded QPlatformIntegration
448 QPlatformWindow is used to signal to the windowing system, how Qt perceives its frame.
449 However, it is not concerned with how Qt renders into the window it represents.
451 Visible QWindows will always have a QPlatformWindow. However, it is not necessary for
452 all windows to have a QBackingStore. This is the case for QOpenGLWidget. And could be the case for
453 windows where some 3.party renders into it.
455 The platform specific window handle can be retrieved by the winId function.
457 QPlatformWindow is also the way QPA defines how native child windows should be supported
458 through the setParent function.
460 The only way to retrieve a QPlatformOpenGLContext in QPA is by calling the glContext() function
463 \section1 Implementation Aspects
466 \li Mouse grab: Qt expects windows to automatically grab the mouse if the user presses
467 a button until the button is released.
468 Automatic grab should be released if some window is explicitly grabbed.
469 \li Enter/Leave events: Enter and leave events should be sent independently of
470 explicit mouse grabs (\c{setMouseGrabEnabled()}). That is, if the mouse leaves
471 a window that has explicit mouse grab, a leave event should be sent and other
472 windows should get enter/leave events as well as the mouse traverses them.
473 For automatic mouse grab, however, a leave event should be sent when the
475 \li Window positioning: When calling \c{QWindow::setFramePos()}, the flag
476 \c{QWindowPrivate::positionPolicy} is set to \c{QWindowPrivate::WindowFrameInclusive}.
477 This means the position includes the window frame, whose size is at this point
478 unknown and the geometry's topleft point is the position of the window frame.
481 Apart from the auto-tests (\c{tests/auto/gui/kernel/qwindow},
482 \c{tests/auto/gui/kernel/qguiapplication} and \c{tests/auto/widgets/kernel/qwidget}),
483 there are a number of manual tests and examples that can help testing a platform plugin:
486 \li \c{examples/qpa/windows}: Basic \c{QWindow} creation.
487 \li \c{examples/opengl/hellowindow}: Basic Open GL windows.
488 \li \c{tests/manual/windowflags}: Tests setting the window flags.
489 \li \c{tests/manual/windowgeometry} Tests setting the window geometry.
490 \li \c{tests/manual/windowmodality} Tests setting the window modality.
491 \li \c{tests/manual/widgetgrab} Tests mouse grab and dialogs.
494 \sa QBackingStore, QWindow