1 /****************************************************************************
2 **
3 ** Copyright (C) 2016 The Qt Company Ltd.
4 ** Contact: https://www.qt.io/licensing/
5 **
6 ** This file is part of the QtQuick 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 The Qt Company. For licensing terms
14 ** and conditions see https://www.qt.io/terms-conditions. For further
15 ** information use the contact form at https://www.qt.io/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 3 as published by the Free Software
20 ** Foundation and appearing in the file LICENSE.LGPL3 included in the
21 ** packaging of this file. Please review the following information to
22 ** ensure the GNU Lesser General Public License version 3 requirements
23 ** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
24 **
25 ** GNU General Public License Usage
26 ** Alternatively, this file may be used under the terms of the GNU
27 ** General Public License version 2.0 or (at your option) the GNU General
28 ** Public license version 3 or any later version approved by the KDE Free
29 ** Qt Foundation. The licenses are as published by the Free Software
30 ** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
31 ** included in the packaging of this file. Please review the following
32 ** information to ensure the GNU General Public License requirements will
33 ** be met: https://www.gnu.org/licenses/gpl-2.0.html and
34 ** https://www.gnu.org/licenses/gpl-3.0.html.
35 **
36 ** $QT_END_LICENSE$
37 **
38 ****************************************************************************/
39 
40 #ifndef QQUICKWINDOW_H
41 #define QQUICKWINDOW_H
42 
43 #include <QtQuick/qtquickglobal.h>
44 #include <QtQuick/qsgrendererinterface.h>
45 #include <QtCore/qmetatype.h>
46 #include <QtGui/qopengl.h>
47 #include <QtGui/qwindow.h>
48 #include <QtGui/qevent.h>
49 #include <QtQml/qqml.h>
50 #include <QtQml/qqmldebug.h>
51 
52 QT_BEGIN_NAMESPACE
53 
54 class QRunnable;
55 class QQuickItem;
56 class QSGTexture;
57 class QInputMethodEvent;
58 class QQuickWindowPrivate;
59 class QQuickWindowAttached;
60 class QOpenGLContext;
61 class QOpenGLFramebufferObject;
62 class QQmlIncubationController;
63 class QInputMethodEvent;
64 class QQuickCloseEvent;
65 class QQuickRenderControl;
66 class QSGRectangleNode;
67 class QSGImageNode;
68 class QSGNinePatchNode;
69 class QRhi;
70 
71 class Q_QUICK_EXPORT QQuickWindow : public QWindow
72 {
73     Q_OBJECT
74     Q_PRIVATE_PROPERTY(QQuickWindow::d_func(), QQmlListProperty<QObject> data READ data DESIGNABLE false)
75     Q_PROPERTY(QColor color READ color WRITE setColor NOTIFY colorChanged)
76     Q_PROPERTY(QQuickItem* contentItem READ contentItem CONSTANT)
77     Q_PROPERTY(QQuickItem* activeFocusItem READ activeFocusItem NOTIFY activeFocusItemChanged REVISION 1)
78     Q_CLASSINFO("DefaultProperty", "data")
79     Q_DECLARE_PRIVATE(QQuickWindow)
80 public:
81     enum CreateTextureOption {
82         TextureHasAlphaChannel  = 0x0001,
83         TextureHasMipmaps       = 0x0002,
84         TextureOwnsGLTexture    = 0x0004,
85         TextureCanUseAtlas      = 0x0008,
86         TextureIsOpaque         = 0x0010
87     };
88 
89     enum RenderStage {
90         BeforeSynchronizingStage,
91         AfterSynchronizingStage,
92         BeforeRenderingStage,
93         AfterRenderingStage,
94         AfterSwapStage,
95         NoStage
96     };
97 
98     Q_DECLARE_FLAGS(CreateTextureOptions, CreateTextureOption)
99     Q_FLAG(CreateTextureOptions)
100 
101     enum SceneGraphError {
102         ContextNotAvailable = 1
103     };
104     Q_ENUM(SceneGraphError)
105 
106     enum TextRenderType {
107         QtTextRendering,
108         NativeTextRendering
109     };
110     Q_ENUM(TextRenderType)
111 
112     enum NativeObjectType {
113         NativeObjectTexture
114     };
115     Q_ENUM(NativeObjectType)
116 
117     explicit QQuickWindow(QWindow *parent = nullptr);
118     explicit QQuickWindow(QQuickRenderControl *renderControl);
119 
120     ~QQuickWindow() override;
121 
122     QQuickItem *contentItem() const;
123 
124     QQuickItem *activeFocusItem() const;
125     QObject *focusObject() const override;
126 
127     QQuickItem *mouseGrabberItem() const;
128 
129 #if QT_DEPRECATED_SINCE(5, 8)
130     QT_DEPRECATED bool sendEvent(QQuickItem *, QEvent *);
131 #endif
132 
133     QImage grabWindow();
134 #if QT_CONFIG(opengl)
135     void setRenderTarget(QOpenGLFramebufferObject *fbo);
136     QOpenGLFramebufferObject *renderTarget() const;
137 #endif
138     void setRenderTarget(uint fboId, const QSize &size);
139     uint renderTargetId() const;
140     QSize renderTargetSize() const;
141 #if QT_CONFIG(opengl)
142     void resetOpenGLState();
143 #endif
144     struct GraphicsStateInfo {
145         int currentFrameSlot;
146         int framesInFlight;
147     };
148     const GraphicsStateInfo &graphicsStateInfo();
149     void beginExternalCommands();
150     void endExternalCommands();
151     QQmlIncubationController *incubationController() const;
152 
153 #if QT_CONFIG(accessibility)
154     QAccessibleInterface *accessibleRoot() const override;
155 #endif
156 
157     // Scene graph specific functions
158     QSGTexture *createTextureFromImage(const QImage &image) const;
159     QSGTexture *createTextureFromImage(const QImage &image, CreateTextureOptions options) const;
160 
161 #if QT_DEPRECATED_SINCE(5, 15)
162     QT_DEPRECATED_X("Use createTextureFromNativeObject() instead")
163     QSGTexture *createTextureFromId(uint id, const QSize &size, CreateTextureOptions options = CreateTextureOption()) const;
164 #endif
165 
166     QSGTexture *createTextureFromNativeObject(NativeObjectType type,
167                                               const void *nativeObjectPtr,
168                                               int nativeLayout,
169                                               const QSize &size,
170                                               CreateTextureOptions options = CreateTextureOption()) const;
171 
172     void setClearBeforeRendering(bool enabled);
173     bool clearBeforeRendering() const;
174 
175     void setColor(const QColor &color);
176     QColor color() const;
177 
178     static bool hasDefaultAlphaBuffer();
179     static void setDefaultAlphaBuffer(bool useAlpha);
180 
181     void setPersistentOpenGLContext(bool persistent);
182     bool isPersistentOpenGLContext() const;
183 
184     void setPersistentSceneGraph(bool persistent);
185     bool isPersistentSceneGraph() const;
186 
187     QOpenGLContext *openglContext() const;
188     bool isSceneGraphInitialized() const;
189 
190     void scheduleRenderJob(QRunnable *job, RenderStage schedule);
191 
192     qreal effectiveDevicePixelRatio() const;
193 
194     QSGRendererInterface *rendererInterface() const;
195 
196     static void setSceneGraphBackend(QSGRendererInterface::GraphicsApi api);
197     static void setSceneGraphBackend(const QString &backend);
198     static QString sceneGraphBackend();
199 
200     QSGRectangleNode *createRectangleNode() const;
201     QSGImageNode *createImageNode() const;
202     QSGNinePatchNode *createNinePatchNode() const;
203 
204     static TextRenderType textRenderType();
205     static void setTextRenderType(TextRenderType renderType);
206 
207 Q_SIGNALS:
208     void frameSwapped();
209     Q_REVISION(2) void openglContextCreated(QOpenGLContext *context);
210     void sceneGraphInitialized();
211     void sceneGraphInvalidated();
212     void beforeSynchronizing();
213     Q_REVISION(2) void afterSynchronizing();
214     void beforeRendering();
215     void afterRendering();
216     Q_REVISION(2) void afterAnimating();
217     Q_REVISION(2) void sceneGraphAboutToStop();
218 
219     Q_REVISION(1) void closing(QQuickCloseEvent *close);
220     void colorChanged(const QColor &);
221     Q_REVISION(1) void activeFocusItemChanged();
222     Q_REVISION(2) void sceneGraphError(QQuickWindow::SceneGraphError error, const QString &message);
223 
224     Q_REVISION(14) void beforeRenderPassRecording();
225     Q_REVISION(14) void afterRenderPassRecording();
226 
227 public Q_SLOTS:
228     void update();
229     void releaseResources();
230 
231 protected:
232     QQuickWindow(QQuickWindowPrivate &dd, QWindow *parent = nullptr);
233     QQuickWindow(QQuickWindowPrivate &dd, QQuickRenderControl *control);
234 
235     void exposeEvent(QExposeEvent *) override;
236     void resizeEvent(QResizeEvent *) override;
237 
238     void showEvent(QShowEvent *) override;
239     void hideEvent(QHideEvent *) override;
240     // TODO Qt 6: reimplement QWindow::closeEvent to emit closing
241 
242     void focusInEvent(QFocusEvent *) override;
243     void focusOutEvent(QFocusEvent *) override;
244 
245     bool event(QEvent *) override;
246     void keyPressEvent(QKeyEvent *) override;
247     void keyReleaseEvent(QKeyEvent *) override;
248     void mousePressEvent(QMouseEvent *) override;
249     void mouseReleaseEvent(QMouseEvent *) override;
250     void mouseDoubleClickEvent(QMouseEvent *) override;
251     void mouseMoveEvent(QMouseEvent *) override;
252 #if QT_CONFIG(wheelevent)
253     void wheelEvent(QWheelEvent *) override;
254 #endif
255 #if QT_CONFIG(tabletevent)
256     void tabletEvent(QTabletEvent *) override;
257 #endif
258 
259 private Q_SLOTS:
260     void maybeUpdate();
261     void cleanupSceneGraph();
262     void physicalDpiChanged();
263     void handleScreenChanged(QScreen *screen);
264     void setTransientParent_helper(QQuickWindow *window);
265     void runJobsAfterSwap();
266     void handleApplicationStateChanged(Qt::ApplicationState state);
267 private:
268     friend class QQuickItem;
269     friend class QQuickWidget;
270     friend class QQuickRenderControl;
271     friend class QQuickAnimatorController;
272     friend class QQuickWidgetPrivate;
273     Q_DISABLE_COPY(QQuickWindow)
274 };
275 
276 #ifndef QT_NO_DEBUG_STREAM
277 QDebug Q_QUICK_EXPORT operator<<(QDebug debug, const QQuickWindow *item);
278 #endif
279 
280 QT_END_NAMESPACE
281 
282 Q_DECLARE_METATYPE(QQuickWindow *)
283 
284 #endif // QQUICKWINDOW_H
285 
286