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