1 /****************************************************************************
3 ** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies).
4 ** Contact: http://www.qt-project.org/
6 ** This file is part of the QtGui module of the Qt Toolkit.
8 ** $QT_BEGIN_LICENSE:LGPL$
9 ** GNU Lesser General Public License Usage
10 ** This file may be used under the terms of the GNU Lesser General Public
11 ** License version 2.1 as published by the Free Software Foundation and
12 ** appearing in the file LICENSE.LGPL included in the packaging of this
13 ** file. Please review the following information to ensure the GNU Lesser
14 ** General Public License version 2.1 requirements will be met:
15 ** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
17 ** In addition, as a special exception, Nokia gives you certain additional
18 ** rights. These rights are described in the Nokia Qt LGPL Exception
19 ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
21 ** GNU General Public License Usage
22 ** Alternatively, this file may be used under the terms of the GNU General
23 ** Public License version 3.0 as published by the Free Software Foundation
24 ** and appearing in the file LICENSE.GPL included in the packaging of this
25 ** file. Please review the following information to ensure the GNU General
26 ** Public License version 3.0 requirements will be met:
27 ** http://www.gnu.org/copyleft/gpl.html.
30 ** Alternatively, this file may be used in accordance with the terms and
31 ** conditions contained in a signed written agreement between you and Nokia.
40 ****************************************************************************/
42 #include "qplatformwindow.h"
44 #include <QtGui/qwindowsysteminterface_qpa.h>
45 #include <QtGui/qwindow.h>
46 #include <QtGui/qscreen.h>
50 class QPlatformWindowPrivate
53 friend class QPlatformWindow;
57 Constructs a platform window with the given top level window.
60 QPlatformWindow::QPlatformWindow(QWindow *window)
61 : QPlatformSurface(window)
62 , d_ptr(new QPlatformWindowPrivate)
65 d->rect = window->geometry();
69 Virtual destructor does not delete its top level window.
71 QPlatformWindow::~QPlatformWindow()
76 Returns the window which belongs to the QPlatformWindow
78 QWindow *QPlatformWindow::window() const
80 return static_cast<QWindow *>(m_surface);
84 Returns the parent platform window (or 0 if orphan).
86 QPlatformWindow *QPlatformWindow::parent() const
88 return window()->parent() ? window()->parent()->handle() : 0;
92 Returns the platform screen handle corresponding to this platform window.
94 QPlatformScreen *QPlatformWindow::screen() const
96 return window()->screen()->handle();
100 Returns the actual surface format of the window.
102 QSurfaceFormat QPlatformWindow::format() const
104 return QSurfaceFormat();
108 This function is called by Qt whenever a window is moved or the window is resized. The resize
109 can happen programatically(from ie. user application) or by the window manager. This means that
110 there is no need to call this function specifically from the window manager callback, instead
111 call QWindowSystemInterface::handleGeometryChange(QWindow *w, const QRect &newRect);
113 The position(x, y) part of the rect might be inclusive or exclusive of the window frame
114 as returned by frameMargins(). You can detect this in the plugin by checking
115 qt_window_private(window())->positionPolicy.
117 void QPlatformWindow::setGeometry(const QRect &rect)
119 Q_D(QPlatformWindow);
124 Returnes the current geometry of a window
126 QRect QPlatformWindow::geometry() const
128 Q_D(const QPlatformWindow);
132 QMargins QPlatformWindow::frameMargins() const
138 Reimplemented in subclasses to show the surface
139 if \a visible is \c true, and hide it if \a visible is \c false.
141 The default implementation sends a synchronous expose event.
143 void QPlatformWindow::setVisible(bool visible)
146 QRect rect(QPoint(), geometry().size());
147 QWindowSystemInterface::handleSynchronousExposeEvent(window(), rect);
150 Requests setting the window flags of this surface
151 to \a type. Returns the actual flags set.
153 Qt::WindowFlags QPlatformWindow::setWindowFlags(Qt::WindowFlags flags)
161 Returns if this window is exposed in the windowing system.
163 An exposeEvent() is sent every time this value changes.
166 bool QPlatformWindow::isExposed() const
168 return window()->isVisible();
172 Requests setting the window state of this surface
173 to \a type. Returns the actual state set.
175 Qt::WindowActive can be ignored.
177 Qt::WindowState QPlatformWindow::setWindowState(Qt::WindowState)
179 return Qt::WindowNoState;
183 Reimplement in subclasses to return a handle to the native window
185 WId QPlatformWindow::winId() const
187 // Return anything but 0. Returning 0 would cause havoc with QWidgets on
188 // very basic platform plugins that do not reimplement this function,
189 // because the top-level widget's internalWinId() would always be 0 which
190 // would mean top-levels are never treated as native.
195 This function is called to enable native child window in QPA. It is common not to support this
196 feature in Window systems, but can be faked. When this function is called all geometry of this
197 platform window will be relative to the parent.
199 //jl: It would be useful to have a property on the platform window which indicated if the sub-class
200 // supported the setParent. If not, then geometry would be in screen coordinates.
201 void QPlatformWindow::setParent(const QPlatformWindow *parent)
204 qWarning("This plugin does not support setParent!");
208 Reimplement to set the window title to \a title
210 void QPlatformWindow::setWindowTitle(const QString &title) { Q_UNUSED(title); }
213 Reimplement to set the window icon to \a icon
215 void QPlatformWindow::setWindowIcon(const QIcon &icon) { Q_UNUSED(icon); }
218 Reimplement to be able to let Qt raise windows to the top of the desktop
220 void QPlatformWindow::raise() { qWarning("This plugin does not support raise()"); }
223 Reimplement to be able to let Qt lower windows to the bottom of the desktop
225 void QPlatformWindow::lower() { qWarning("This plugin does not support lower()"); }
228 Reimplement to propagate the size hints of the QWindow.
230 The size hints include QWindow::minimumSize(), QWindow::maximumSize(),
231 QWindow::sizeIncrement(), and QWindow::baseSize().
233 void QPlatformWindow::propagateSizeHints() {qWarning("This plugin does not support propagateSizeHints()"); }
236 Reimplement to be able to let Qt set the opacity level of a window
238 void QPlatformWindow::setOpacity(qreal level)
241 qWarning("This plugin does not support setting window opacity");
245 Reimplement to let Qt be able to request activation/focus for a window
247 Some window systems will probably not have callbacks for this functionality,
248 and then calling QWindowSystemInterface::handleWindowActivated(QWindow *w)
251 If the window system has some event handling/callbacks then call
252 QWindowSystemInterface::handleWindowActivated(QWindow *w) when the window system
253 gives the notification.
255 Default implementation calls QWindowSystem::handleWindowActivated(QWindow *w)
257 void QPlatformWindow::requestActivateWindow()
259 QWindowSystemInterface::handleWindowActivated(window());
263 Handle changes to the orientation of the platform window's contents.
265 This is a hint to the window manager in case it needs to display
266 additional content like popups, dialogs, status bars, or similar
267 in relation to the window.
269 \sa QWindow::reportContentOrientationChange()
271 void QPlatformWindow::handleContentOrientationChange(Qt::ScreenOrientation orientation)
273 Q_UNUSED(orientation);
277 Request a different orientation of the platform window.
279 This tells the window manager how the window wants to be rotated in order
280 to be displayed, and how input events should be translated.
282 As an example, a portrait compositor might rotate the window by 90 degrees,
283 if the window is in landscape. It will also rotate input coordinates from
284 portrait to landscape such that top right in portrait gets mapped to top
287 If the implementation doesn't support the requested orientation it should
288 signal this by returning an actual supported orientation.
290 If the implementation doesn't support rotating the window at all it should
291 return Qt::PrimaryOrientation, this is also the default value.
293 \sa QWindow::requestWindowOrientation()
295 Qt::ScreenOrientation QPlatformWindow::requestWindowOrientation(Qt::ScreenOrientation orientation)
297 Q_UNUSED(orientation);
298 return Qt::PrimaryOrientation;
301 bool QPlatformWindow::setKeyboardGrabEnabled(bool grab)
304 qWarning("This plugin does not support grabbing the keyboard");
308 bool QPlatformWindow::setMouseGrabEnabled(bool grab)
311 qWarning("This plugin does not support grabbing the mouse");
316 Reimplement to be able to let Qt indicate that the window has been
317 modified. Return true if the native window supports setting the modified
318 flag, false otherwise.
320 bool QPlatformWindow::setWindowModified(bool modified)
327 Reimplement this method to be able to do any platform specific event
328 handling. All events for window() are passed to this function before being
329 sent to QWindow::event().
331 The default implementation is empty and does nothing with \a event.
333 void QPlatformWindow::windowEvent(QEvent *event)
339 Reimplement this method to start a system size grip drag
340 operation if the system supports it and return true to indicate
342 It is called from the mouse press event handler of the size grip.
344 The default implementation is empty and does nothing with \a pos
348 bool QPlatformWindow::startSystemResize(const QPoint &pos, Qt::Corner corner)
356 \class QPlatformWindow
362 \brief The QPlatformWindow class provides an abstraction for top-level windows.
364 The QPlatformWindow abstraction is used by QWindow for all its top level windows. It is being
365 created by calling the createPlatformWindow function in the loaded QPlatformIntegration
368 QPlatformWindow is used to signal to the windowing system, how Qt perceives its frame.
369 However, it is not concerned with how Qt renders into the window it represents.
371 Visible QWindows will always have a QPlatformWindow. However, it is not necessary for
372 all windows to have a QBackingStore. This is the case for QOpenGLWidget. And could be the case for
373 windows where some 3.party renders into it.
375 The platform specific window handle can be retrieved by the winId function.
377 QPlatformWindow is also the way QPA defines how native child windows should be supported
378 through the setParent function.
380 The only way to retrieve a QPlatformOpenGLContext in QPA is by calling the glContext() function
383 \sa QBackingStore, QWindow