1
/****************************************************************************
3
** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
4
** All rights reserved.
5
** Contact: Nokia Corporation (qt-info@nokia.com)
7
** This file is part of the QtGui module of the Qt Toolkit.
9
** $QT_BEGIN_LICENSE:LGPL$
10
** No Commercial Usage
11
** This file contains pre-release code and may not be distributed.
12
** You may use this file in accordance with the terms and conditions
13
** contained in the Technology Preview License Agreement accompanying
16
** GNU Lesser General Public License Usage
17
** Alternatively, this file may be used under the terms of the GNU Lesser
18
** General Public License version 2.1 as published by the Free Software
19
** Foundation and appearing in the file LICENSE.LGPL included in the
20
** packaging of this file. Please review the following information to
21
** ensure the GNU Lesser General Public License version 2.1 requirements
22
** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
24
** In addition, as a special exception, Nokia gives you certain additional
25
** rights. These rights are described in the Nokia Qt LGPL Exception
26
** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
28
** If you have questions regarding the use of this file, please contact
29
** Nokia at qt-info@nokia.com.
40
****************************************************************************/
42
/****************************************************************************
44
** Copyright (c) 2007-2008, Apple, Inc.
46
** All rights reserved.
48
** Redistribution and use in source and binary forms, with or without
49
** modification, are permitted provided that the following conditions are met:
51
** * Redistributions of source code must retain the above copyright notice,
52
** this list of conditions and the following disclaimer.
54
** * Redistributions in binary form must reproduce the above copyright notice,
55
** this list of conditions and the following disclaimer in the documentation
56
** and/or other materials provided with the distribution.
58
** * Neither the name of Apple, Inc. nor the names of its contributors
59
** may be used to endorse or promote products derived from this software
60
** without specific prior written permission.
62
** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
63
** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
64
** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
65
** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
66
** CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
67
** EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
68
** PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
69
** PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
70
** LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
71
** NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
72
** SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
74
****************************************************************************/
76
#import <Cocoa/Cocoa.h>
78
#include "qapplication.h"
79
#include "qdesktopwidget.h"
80
#include <private/qt_mac_p.h>
81
#include "qwidget_p.h"
82
#include <private/qt_cocoa_helpers_mac_p.h>
83
#include <private/qdesktopwidget_mac_p.h>
89
/*****************************************************************************
91
*****************************************************************************/
93
/*****************************************************************************
94
QDesktopWidget member functions
95
*****************************************************************************/
97
Q_GLOBAL_STATIC(QDesktopWidgetImplementation, qdesktopWidgetImplementation)
99
QDesktopWidgetImplementation::QDesktopWidgetImplementation()
105
QDesktopWidgetImplementation::~QDesktopWidgetImplementation()
109
QDesktopWidgetImplementation *QDesktopWidgetImplementation::instance()
111
return qdesktopWidgetImplementation();
114
QRect QDesktopWidgetImplementation::availableRect(int screenIndex) const
116
if (screenIndex < 0 || screenIndex >= screenCount)
117
screenIndex = appScreen;
119
return availableRects[screenIndex].toRect();
122
QRect QDesktopWidgetImplementation::screenRect(int screenIndex) const
124
if (screenIndex < 0 || screenIndex >= screenCount)
125
screenIndex = appScreen;
127
return screenRects[screenIndex].toRect();
130
void QDesktopWidgetImplementation::onResize()
132
QMacCocoaAutoReleasePool pool;
133
NSArray *displays = [NSScreen screens];
134
screenCount = [displays count];
137
availableRects.clear();
138
NSRect primaryRect = [[displays objectAtIndex:0] frame];
139
for (int i = 0; i<screenCount; i++) {
140
NSRect r = [[displays objectAtIndex:i] frame];
141
const int flippedY = - r.origin.y + // account for position offset and
142
primaryRect.size.height - r.size.height; // height difference.
143
screenRects.append(QRectF(r.origin.x, flippedY,
144
r.size.width, r.size.height));
145
r = [[displays objectAtIndex:i] visibleFrame];
146
availableRects.append(QRectF(r.origin.x, flippedY,
147
r.size.width, r.size.height));
153
QDesktopWidget::QDesktopWidget()
154
: QWidget(0, Qt::Desktop)
156
setObjectName(QLatin1String("desktop"));
157
setAttribute(Qt::WA_WState_Visible);
160
QDesktopWidget::~QDesktopWidget()
164
bool QDesktopWidget::isVirtualDesktop() const
169
int QDesktopWidget::primaryScreen() const
171
return qdesktopWidgetImplementation()->appScreen;
174
int QDesktopWidget::numScreens() const
176
return qdesktopWidgetImplementation()->screenCount;
179
QWidget *QDesktopWidget::screen(int)
184
const QRect QDesktopWidget::availableGeometry(int screen) const
186
return qdesktopWidgetImplementation()->availableRect(screen);
189
const QRect QDesktopWidget::screenGeometry(int screen) const
191
return qdesktopWidgetImplementation()->screenRect(screen);
194
int QDesktopWidget::screenNumber(const QWidget *widget) const
196
QDesktopWidgetImplementation *d = qdesktopWidgetImplementation();
199
QRect frame = widget->frameGeometry();
200
if (!widget->isWindow())
201
frame.moveTopLeft(widget->mapToGlobal(QPoint(0,0)));
202
int maxSize = -1, maxScreen = -1;
203
for (int i = 0; i < d->screenCount; ++i) {
204
QRect rr = d->screenRect(i);
205
QRect sect = rr.intersected(frame);
206
int size = sect.width() * sect.height();
207
if (size > maxSize && sect.width() > 0 && sect.height() > 0) {
215
int QDesktopWidget::screenNumber(const QPoint &point) const
217
QDesktopWidgetImplementation *d = qdesktopWidgetImplementation();
218
int closestScreen = -1;
219
int shortestDistance = INT_MAX;
220
for (int i = 0; i < d->screenCount; ++i) {
221
QRect rr = d->screenRect(i);
222
int thisDistance = QWidgetPrivate::pointToRect(point, rr);
223
if (thisDistance < shortestDistance) {
224
shortestDistance = thisDistance;
228
return closestScreen;
231
void QDesktopWidget::resizeEvent(QResizeEvent *)
233
QDesktopWidgetImplementation *d = qdesktopWidgetImplementation();
235
const int oldScreenCount = d->screenCount;
236
const QVector<QRectF> oldRects(d->screenRects);
237
const QVector<QRectF> oldWorks(d->availableRects);
241
for (int i = 0; i < qMin(oldScreenCount, d->screenCount); ++i) {
242
if (oldRects.at(i) != d->screenRects.at(i))
245
for (int i = 0; i < qMin(oldScreenCount, d->screenCount); ++i) {
246
if (oldWorks.at(i) != d->availableRects.at(i))
247
emit workAreaResized(i);
250
if (oldScreenCount != d->screenCount)
251
emit screenCountChanged(d->screenCount);