qdesktopwidget.cpp

Absolute File Name:/home/qt/qt5_coco/qt5/qtbase/src/widgets/kernel/qdesktopwidget.cpp
Source codeSwitch to Preprocessed file
LineSourceCount
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 QtWidgets 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#include "qglobal.h"-
41#include "qdesktopwidget.h"-
42#include "qdesktopwidget_p.h"-
43#include "qscreen.h"-
44#include "qwidget_p.h"-
45#include "qwindow.h"-
46-
47#include <private/qhighdpiscaling_p.h>-
48#include <qpa/qplatformscreen.h>-
49-
50QT_BEGIN_NAMESPACE-
51-
52QDesktopScreenWidget::QDesktopScreenWidget(QScreen *screen, const QRect &geometry)-
53 : QWidget(Q_NULLPTR, Qt::Desktop), m_screen(screen)-
54{-
55 setVisible(false);-
56 if (QWindow *winHandle = windowHandle())
QWindow *winHa...windowHandle()Description
TRUEnever evaluated
FALSEnever evaluated
0
57 winHandle->setScreen(screen);
never executed: winHandle->setScreen(screen);
0
58 setScreenGeometry(geometry);-
59}
never executed: end of block
0
60-
61void QDesktopScreenWidget::setScreenGeometry(const QRect &geometry)-
62{-
63 m_geometry = geometry;-
64 setGeometry(geometry);-
65}
never executed: end of block
0
66-
67int QDesktopScreenWidget::screenNumber() const-
68{-
69 const QDesktopWidgetPrivate *desktopWidgetP-
70 = static_cast<const QDesktopWidgetPrivate *>(qt_widget_private(QApplication::desktop()));-
71 return desktopWidgetP->screens.indexOf(const_cast<QDesktopScreenWidget *>(this));
never executed: return desktopWidgetP->screens.indexOf(const_cast<QDesktopScreenWidget *>(this));
0
72}-
73-
74const QRect QDesktopWidget::screenGeometry(const QWidget *widget) const-
75{-
76 if (Q_UNLIKELY(!widget)) {
__builtin_expe...idget), false)Description
TRUEnever evaluated
FALSEnever evaluated
0
77 qWarning("QDesktopWidget::screenGeometry(): Attempt "-
78 "to get the screen geometry of a null widget");-
79 return QRect();
never executed: return QRect();
0
80 }-
81 QRect rect = QWidgetPrivate::screenGeometry(widget);-
82 if (rect.isNull())
rect.isNull()Description
TRUEnever evaluated
FALSEnever evaluated
0
83 return screenGeometry(screenNumber(widget));
never executed: return screenGeometry(screenNumber(widget));
0
84 else return rect;
never executed: return rect;
0
85}-
86-
87const QRect QDesktopWidget::availableGeometry(const QWidget *widget) const-
88{-
89 if (Q_UNLIKELY(!widget)) {
__builtin_expe...idget), false)Description
TRUEnever evaluated
FALSEnever evaluated
0
90 qWarning("QDesktopWidget::availableGeometry(): Attempt "-
91 "to get the available geometry of a null widget");-
92 return QRect();
never executed: return QRect();
0
93 }-
94 QRect rect = QWidgetPrivate::screenGeometry(widget);-
95 if (rect.isNull())
rect.isNull()Description
TRUEnever evaluated
FALSEnever evaluated
0
96 return availableGeometry(screenNumber(widget));
never executed: return availableGeometry(screenNumber(widget));
0
97 else-
98 return rect;
never executed: return rect;
0
99}-
100-
101QDesktopScreenWidget *QDesktopWidgetPrivate::widgetForScreen(QScreen *qScreen) const-
102{-
103 foreach (QDesktopScreenWidget *widget, screens) {-
104 if (widget->screen() == qScreen)
widget->screen() == qScreenDescription
TRUEnever evaluated
FALSEnever evaluated
0
105 return widget;
never executed: return widget;
0
106 }
never executed: end of block
0
107 return Q_NULLPTR;
never executed: return nullptr;
0
108}-
109-
110void QDesktopWidgetPrivate::_q_updateScreens()-
111{-
112 Q_Q(QDesktopWidget);-
113 const QList<QScreen *> screenList = QGuiApplication::screens();-
114 const int targetLength = screenList.length();-
115 bool screenCountChanged = false;-
116-
117 // Re-build our screens list. This is the easiest way to later compute which signals to emit.-
118 // Create new screen widgets as necessary. While iterating, keep the old list in place so-
119 // that widgetForScreen works.-
120 // Furthermore, we note which screens have changed, and compute the overall virtual geometry.-
121 QList<QDesktopScreenWidget *> newScreens;-
122 QList<int> changedScreens;-
123 QRegion virtualGeometry;-
124-
125 for (int i = 0; i < targetLength; ++i) {
i < targetLengthDescription
TRUEnever evaluated
FALSEnever evaluated
0
126 QScreen *qScreen = screenList.at(i);-
127 const QRect screenGeometry = qScreen->geometry();-
128 QDesktopScreenWidget *screenWidget = widgetForScreen(qScreen);-
129 if (screenWidget) {
screenWidgetDescription
TRUEnever evaluated
FALSEnever evaluated
0
130 // an old screen. update geometry and remember the index in the *new* list-
131 if (screenGeometry != screenWidget->screenGeometry()) {
screenGeometry...reenGeometry()Description
TRUEnever evaluated
FALSEnever evaluated
0
132 screenWidget->setScreenGeometry(screenGeometry);-
133 changedScreens.push_back(i);-
134 }
never executed: end of block
0
135 } else {
never executed: end of block
0
136 // a new screen, create a widget and connect the signals.-
137 screenWidget = new QDesktopScreenWidget(qScreen, screenGeometry);-
138 QObject::connect(qScreen, SIGNAL(geometryChanged(QRect)),-
139 q, SLOT(_q_updateScreens()), Qt::QueuedConnection);-
140 QObject::connect(qScreen, SIGNAL(availableGeometryChanged(QRect)),-
141 q, SLOT(_q_availableGeometryChanged()), Qt::QueuedConnection);-
142 QObject::connect(qScreen, SIGNAL(destroyed()),-
143 q, SLOT(_q_updateScreens()), Qt::QueuedConnection);-
144 screenCountChanged = true;-
145 }
never executed: end of block
0
146 // record all the screens and the overall geometry.-
147 newScreens.push_back(screenWidget);-
148 virtualGeometry += screenGeometry;-
149 }
never executed: end of block
0
150-
151 // Now we apply the accumulated updates.-
152 screens.swap(newScreens); // now [newScreens] is the old screen list-
153 Q_ASSERT(screens.size() == targetLength);-
154 q->setGeometry(virtualGeometry.boundingRect());-
155-
156 // Delete the QDesktopScreenWidget that are not used any more.-
157 foreach (QDesktopScreenWidget *screen, newScreens) {-
158 if (!screens.contains(screen)) {
!screens.contains(screen)Description
TRUEnever evaluated
FALSEnever evaluated
0
159 delete screen;-
160 screenCountChanged = true;-
161 }
never executed: end of block
0
162 }
never executed: end of block
0
163-
164 // Finally, emit the signals.-
165 if (screenCountChanged) {
screenCountChangedDescription
TRUEnever evaluated
FALSEnever evaluated
0
166 // Notice that we trigger screenCountChanged even if a screen was removed and another one added,-
167 // in which case the total number of screens did not change. This is the only way for applications-
168 // to notice that a screen was swapped out against another one.-
169 emit q->screenCountChanged(targetLength);-
170 }
never executed: end of block
0
171 foreach (int changedScreen, changedScreens)-
172 emit q->resized(changedScreen);
never executed: q->resized(changedScreen);
0
173}
never executed: end of block
0
174-
175void QDesktopWidgetPrivate::_q_availableGeometryChanged()-
176{-
177 Q_Q(QDesktopWidget);-
178 if (QScreen *screen = qobject_cast<QScreen *>(q->sender()))
QScreen *scree...>(q->sender())Description
TRUEnever evaluated
FALSEnever evaluated
0
179 emit q->workAreaResized(QGuiApplication::screens().indexOf(screen));
never executed: q->workAreaResized(QGuiApplication::screens().indexOf(screen));
0
180}
never executed: end of block
0
181-
182QDesktopWidget::QDesktopWidget()-
183 : QWidget(*new QDesktopWidgetPrivate, 0, Qt::Desktop)-
184{-
185 Q_D(QDesktopWidget);-
186 setObjectName(QLatin1String("desktop"));-
187 d->_q_updateScreens();-
188 connect(qApp, SIGNAL(screenAdded(QScreen*)), this, SLOT(_q_updateScreens()));-
189 connect(qApp, SIGNAL(primaryScreenChanged(QScreen*)), this, SIGNAL(primaryScreenChanged()));-
190}
never executed: end of block
0
191-
192QDesktopWidget::~QDesktopWidget()-
193{-
194}-
195-
196bool QDesktopWidget::isVirtualDesktop() const-
197{-
198 return QGuiApplication::primaryScreen()->virtualSiblings().size() > 1;
never executed: return QGuiApplication::primaryScreen()->virtualSiblings().size() > 1;
0
199}-
200-
201int QDesktopWidget::primaryScreen() const-
202{-
203 return 0;
never executed: return 0;
0
204}-
205-
206int QDesktopWidget::numScreens() const-
207{-
208 return qMax(QGuiApplication::screens().size(), 1);
never executed: return qMax(QGuiApplication::screens().size(), 1);
0
209}-
210-
211QWidget *QDesktopWidget::screen(int screen)-
212{-
213 Q_D(QDesktopWidget);-
214 if (screen < 0 || screen >= d->screens.length())
screen < 0Description
TRUEnever evaluated
FALSEnever evaluated
screen >= d->screens.length()Description
TRUEnever evaluated
FALSEnever evaluated
0
215 return d->screens.at(0);
never executed: return d->screens.at(0);
0
216 return d->screens.at(screen);
never executed: return d->screens.at(screen);
0
217}-
218-
219const QRect QDesktopWidget::availableGeometry(int screenNo) const-
220{-
221 QList<QScreen *> screens = QGuiApplication::screens();-
222 if (screenNo == -1)
screenNo == -1Description
TRUEnever evaluated
FALSEnever evaluated
0
223 screenNo = 0;
never executed: screenNo = 0;
0
224 if (screenNo < 0 || screenNo >= screens.size())
screenNo < 0Description
TRUEnever evaluated
FALSEnever evaluated
screenNo >= screens.size()Description
TRUEnever evaluated
FALSEnever evaluated
0
225 return QRect();
never executed: return QRect();
0
226 else-
227 return screens.at(screenNo)->availableGeometry();
never executed: return screens.at(screenNo)->availableGeometry();
0
228}-
229-
230const QRect QDesktopWidget::screenGeometry(int screenNo) const-
231{-
232 QList<QScreen *> screens = QGuiApplication::screens();-
233 if (screenNo == -1)
screenNo == -1Description
TRUEnever evaluated
FALSEnever evaluated
0
234 screenNo = 0;
never executed: screenNo = 0;
0
235 if (screenNo < 0 || screenNo >= screens.size())
screenNo < 0Description
TRUEnever evaluated
FALSEnever evaluated
screenNo >= screens.size()Description
TRUEnever evaluated
FALSEnever evaluated
0
236 return QRect();
never executed: return QRect();
0
237 else-
238 return screens.at(screenNo)->geometry();
never executed: return screens.at(screenNo)->geometry();
0
239}-
240-
241int QDesktopWidget::screenNumber(const QWidget *w) const-
242{-
243 if (!w)
!wDescription
TRUEnever evaluated
FALSEnever evaluated
0
244 return primaryScreen();
never executed: return primaryScreen();
0
245-
246 const QList<QScreen *> allScreens = QGuiApplication::screens();-
247 QList<QScreen *> screens = allScreens;-
248 if (screens.isEmpty()) // This should never happen
screens.isEmpty()Description
TRUEnever evaluated
FALSEnever evaluated
0
249 return primaryScreen();
never executed: return primaryScreen();
0
250-
251 const QWindow *winHandle = w->windowHandle();-
252 if (!winHandle) {
!winHandleDescription
TRUEnever evaluated
FALSEnever evaluated
0
253 if (const QWidget *nativeParent = w->nativeParentWidget())
const QWidget ...ParentWidget()Description
TRUEnever evaluated
FALSEnever evaluated
0
254 winHandle = nativeParent->windowHandle();
never executed: winHandle = nativeParent->windowHandle();
0
255 }
never executed: end of block
0
256-
257 // If there is more than one virtual desktop-
258 if (screens.count() != screens.constFirst()->virtualSiblings().count()) {
screens.count(...ings().count()Description
TRUEnever evaluated
FALSEnever evaluated
0
259 // Find the root widget, get a QScreen from it and use the-
260 // virtual siblings for checking the window position.-
261 if (winHandle) {
winHandleDescription
TRUEnever evaluated
FALSEnever evaluated
0
262 if (const QScreen *winScreen = winHandle->screen())
const QScreen ...ndle->screen()Description
TRUEnever evaluated
FALSEnever evaluated
0
263 screens = winScreen->virtualSiblings();
never executed: screens = winScreen->virtualSiblings();
0
264 }
never executed: end of block
0
265 }
never executed: end of block
0
266-
267 // Get the screen number from window position using screen geometry-
268 // and proper screens.-
269 QRect frame = w->frameGeometry();-
270 if (!w->isWindow())
!w->isWindow()Description
TRUEnever evaluated
FALSEnever evaluated
0
271 frame.moveTopLeft(w->mapToGlobal(QPoint(0, 0)));
never executed: frame.moveTopLeft(w->mapToGlobal(QPoint(0, 0)));
0
272 const QRect nativeFrame = QHighDpi::toNativePixels(frame, winHandle);-
273-
274 QScreen *widgetScreen = Q_NULLPTR;-
275 int largestArea = 0;-
276 foreach (QScreen *screen, screens) {-
277 const QRect intersected = screen->handle()->geometry().intersected(nativeFrame);-
278 int area = intersected.width() * intersected.height();-
279 if (largestArea < area) {
largestArea < areaDescription
TRUEnever evaluated
FALSEnever evaluated
0
280 widgetScreen = screen;-
281 largestArea = area;-
282 }
never executed: end of block
0
283 }
never executed: end of block
0
284 return allScreens.indexOf(widgetScreen);
never executed: return allScreens.indexOf(widgetScreen);
0
285}-
286-
287int QDesktopWidget::screenNumber(const QPoint &p) const-
288{-
289 const QList<QScreen *> screens = QGuiApplication::screens();-
290 if (!screens.isEmpty()) {
!screens.isEmpty()Description
TRUEnever evaluated
FALSEnever evaluated
0
291 const QList<QScreen *> primaryScreens = screens.first()->virtualSiblings();-
292 // Find the screen index on the primary virtual desktop first-
293 foreach (QScreen *screen, primaryScreens) {-
294 if (screen->geometry().contains(p))
screen->geometry().contains(p)Description
TRUEnever evaluated
FALSEnever evaluated
0
295 return screens.indexOf(screen);
never executed: return screens.indexOf(screen);
0
296 }
never executed: end of block
0
297 // If the screen index is not found on primary virtual desktop, find-
298 // the screen index on all screens except the first which was for-
299 // sure in the previous loop. Some other screens may repeat. Find-
300 // only when there is more than one virtual desktop.-
301 if (screens.count() != primaryScreens.count()) {
screens.count(...creens.count()Description
TRUEnever evaluated
FALSEnever evaluated
0
302 for (int i = 1; i < screens.size(); ++i) {
i < screens.size()Description
TRUEnever evaluated
FALSEnever evaluated
0
303 if (screens[i]->geometry().contains(p))
screens[i]->ge...().contains(p)Description
TRUEnever evaluated
FALSEnever evaluated
0
304 return i;
never executed: return i;
0
305 }
never executed: end of block
0
306 }
never executed: end of block
0
307 }
never executed: end of block
0
308 return primaryScreen(); //even better would be closest screen
never executed: return primaryScreen();
0
309}-
310-
311void QDesktopWidget::resizeEvent(QResizeEvent *)-
312{-
313}-
314-
315QT_END_NAMESPACE-
316-
317#include "moc_qdesktopwidget.cpp"-
318#include "moc_qdesktopwidget_p.cpp"-
Source codeSwitch to Preprocessed file

Generated by Squish Coco Non-Commercial 4.3.0-BETA-master-30-08-2018-4cb69e9