Qt
Internal/Contributor docs for the Qt SDK. Note: These are NOT official API docs; those are found at https://doc.qt.io/
Loading...
Searching...
No Matches
qfbscreen.cpp
Go to the documentation of this file.
1// Copyright (C) 2016 The Qt Company Ltd.
2// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
3
4#include "qfbscreen_p.h"
5#include "qfbcursor_p.h"
6#include "qfbwindow_p.h"
8
9#include <QtGui/QPainter>
10#include <QtCore/QCoreApplication>
11#include <qpa/qwindowsysteminterface.h>
12
13#include <QtCore/QDebug>
14#include <QtCore/QElapsedTimer>
15
17
18QFbScreen::QFbScreen()
19 : mUpdatePending(false),
20 mCursor(0),
21 mDepth(16),
22 mFormat(QImage::Format_RGB16),
23 mPainter(nullptr)
24{
25}
26
28{
29 delete mPainter;
30}
31
33{
34 mScreenImage = QImage(mGeometry.size(), mFormat);
36}
37
38bool QFbScreen::event(QEvent *event)
39{
40 if (event->type() == QEvent::UpdateRequest) {
41 doRedraw();
42 mUpdatePending = false;
43 return true;
44 }
45 return QObject::event(event);
46}
47
49{
50 mWindowStack.prepend(window);
51 if (!mPendingBackingStores.isEmpty()) {
52 //check if we have a backing store for this window
53 for (int i = 0; i < mPendingBackingStores.size(); ++i) {
54 QFbBackingStore *bs = mPendingBackingStores.at(i);
55 // this gets called during QWindow::create() at a point where the
56 // invariant (window->handle()->window() == window) is broken
57 if (bs->window() == window->window()) {
58 window->setBackingStore(bs);
59 mPendingBackingStores.removeAt(i);
60 break;
61 }
62 }
63 }
64 setDirty(window->geometry());
65 QWindow *w = topWindow();
66 QWindowSystemInterface::handleFocusWindowChanged(w);
67 topWindowChanged(w);
68}
69
71{
72 mWindowStack.removeOne(window);
73 setDirty(window->geometry());
74 QWindow *w = topWindow();
75 QWindowSystemInterface::handleFocusWindowChanged(w);
76 topWindowChanged(w);
77}
78
80{
81 int index = mWindowStack.indexOf(window);
82 if (index <= 0)
83 return;
84 mWindowStack.move(index, 0);
85 setDirty(window->geometry());
86 QWindow *w = topWindow();
87 QWindowSystemInterface::handleFocusWindowChanged(w);
88 topWindowChanged(w);
89}
90
92{
93 int index = mWindowStack.indexOf(window);
94 if (index == -1 || index == (mWindowStack.size() - 1))
95 return;
96 mWindowStack.move(index, mWindowStack.size() - 1);
97 setDirty(window->geometry());
98 QWindow *w = topWindow();
99 QWindowSystemInterface::handleFocusWindowChanged(w);
100 topWindowChanged(w);
101}
102
103QWindow *QFbScreen::topWindow() const
104{
105 for (QFbWindow *fbw : mWindowStack) {
106 if (fbw->window()->type() == Qt::Window || fbw->window()->type() == Qt::Dialog)
107 return fbw->window();
108 }
109 return nullptr;
110}
111
112QWindow *QFbScreen::topLevelAt(const QPoint & p) const
113{
114 for (QFbWindow *fbw : mWindowStack) {
115 if (fbw->geometry().contains(p, false) && fbw->window()->isVisible())
116 return fbw->window();
117 }
118 return nullptr;
119}
120
122{
123 return mWindowStack.size();
124}
125
126void QFbScreen::setDirty(const QRect &rect)
127{
128 const QRect intersection = rect.intersected(mGeometry);
129 const QPoint screenOffset = mGeometry.topLeft();
130 mRepaintRegion += intersection.translated(-screenOffset); // global to local translation
132}
133
135{
136 if (!mUpdatePending) {
137 mUpdatePending = true;
138 QCoreApplication::postEvent(this, new QEvent(QEvent::UpdateRequest));
139 }
140}
141
142void QFbScreen::setPhysicalSize(const QSize &size)
143{
144 mPhysicalSize = size;
145}
146
147void QFbScreen::setGeometry(const QRect &rect)
148{
149 delete mPainter;
150 mPainter = nullptr;
151 mGeometry = rect;
152 mScreenImage = QImage(mGeometry.size(), mFormat);
153 QWindowSystemInterface::handleScreenGeometryChange(QPlatformScreen::screen(), geometry(), availableGeometry());
154 resizeMaximizedWindows();
155}
156
158{
159 return true;
160}
161
163{
164 const QPoint screenOffset = mGeometry.topLeft();
165
166 QRegion touchedRegion;
168 const QRect lastCursor = mCursor->dirtyRect();
169 mRepaintRegion += lastCursor;
170 }
171 if (mRepaintRegion.isEmpty() && (!mCursor || !mCursor->isDirty()))
172 return touchedRegion;
173
174 if (!mPainter)
175 mPainter = new QPainter(&mScreenImage);
176
177 const QRect screenRect = mGeometry.translated(-screenOffset);
178 for (QRect rect : mRepaintRegion) {
179 rect = rect.intersected(screenRect);
180 if (rect.isEmpty())
181 continue;
182
183 mPainter->setCompositionMode(QPainter::CompositionMode_Source);
184 mPainter->fillRect(rect, mScreenImage.hasAlphaChannel() ? Qt::transparent : Qt::black);
185
186 for (int layerIndex = mWindowStack.size() - 1; layerIndex != -1; layerIndex--) {
187 if (!mWindowStack[layerIndex]->window()->isVisible())
188 continue;
189
190 const QRect windowRect = mWindowStack[layerIndex]->geometry().translated(-screenOffset);
191 const QRect windowIntersect = rect.translated(-windowRect.left(), -windowRect.top());
192 QFbBackingStore *backingStore = mWindowStack[layerIndex]->backingStore();
193 if (backingStore) {
194 backingStore->lock();
195 mPainter->drawImage(rect, backingStore->image(), windowIntersect);
196 backingStore->unlock();
197 }
198 }
199 }
200
201 if (mCursor && (mCursor->isDirty() || mRepaintRegion.intersects(mCursor->lastPainted()))) {
202 mPainter->setCompositionMode(QPainter::CompositionMode_SourceOver);
203 touchedRegion += mCursor->drawCursor(*mPainter);
204 }
205 touchedRegion += mRepaintRegion;
206 mRepaintRegion = QRegion();
207
208 return touchedRegion;
209}
210
212{
213 for (int i = 0; i < mWindowStack.size(); ++i) {
214 if (mWindowStack[i]->winId() == wid)
215 return mWindowStack[i];
216 }
217 return nullptr;
218}
219
221{
222 return { };
223}
224
225QT_END_NAMESPACE
226
227#include "moc_qfbscreen_p.cpp"
virtual bool isOnScreen() const
Definition qfbcursor_p.h:63
virtual bool isDirty() const
Definition qfbcursor_p.h:62
QFbWindow * windowForId(WId wid) const
virtual int windowCount() const
virtual Flags flags() const
QWindow * topLevelAt(const QPoint &p) const override
Return the given top level window for a given position.
bool event(QEvent *event) override
This virtual function receives events to an object and should return true if the event e was recogniz...
Definition qfbscreen.cpp:38
virtual bool initialize()
virtual void lower(QFbWindow *window)
Definition qfbscreen.cpp:91
QWindow * topWindow() const
void initializeCompositor()
Definition qfbscreen.cpp:32
void setGeometry(const QRect &rect)
virtual void raise(QFbWindow *window)
Definition qfbscreen.cpp:79
virtual QRegion doRedraw()
void setPhysicalSize(const QSize &size)
QFbCursor * mCursor
Definition qfbscreen_p.h:83
bool mUpdatePending
Definition qfbscreen_p.h:81
virtual void removeWindow(QFbWindow *window)
Definition qfbscreen.cpp:70
virtual void addWindow(QFbWindow *window)
Definition qfbscreen.cpp:48
void scheduleUpdate()
void setBackingStore(QFbBackingStore *store)
Definition qfbwindow_p.h:44