source: trunk/src/gui/kernel/qdesktopwidget_mac.mm@ 561

Last change on this file since 561 was 561, checked in by Dmitry A. Kuminov, 15 years ago

trunk: Merged in qt 4.6.1 sources.

File size: 8.6 KB
Line 
1/****************************************************************************
2**
3** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
4** All rights reserved.
5** Contact: Nokia Corporation ([email protected])
6**
7** This file is part of the QtGui module of the Qt Toolkit.
8**
9** $QT_BEGIN_LICENSE:LGPL$
10** Commercial Usage
11** Licensees holding valid Qt Commercial licenses may use this file in
12** accordance with the Qt Commercial License Agreement provided with the
13** Software or, alternatively, in accordance with the terms contained in
14** a written agreement between you and Nokia.
15**
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.
23**
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.
27**
28** GNU General Public License Usage
29** Alternatively, this file may be used under the terms of the GNU
30** General Public License version 3.0 as published by the Free Software
31** Foundation and appearing in the file LICENSE.GPL included in the
32** packaging of this file. Please review the following information to
33** ensure the GNU General Public License version 3.0 requirements will be
34** met: http://www.gnu.org/copyleft/gpl.html.
35**
36** If you have questions regarding the use of this file, please contact
37** Nokia at [email protected].
38** $QT_END_LICENSE$
39**
40****************************************************************************/
41
42/****************************************************************************
43**
44** Copyright (c) 2007-2008, Apple, Inc.
45**
46** All rights reserved.
47**
48** Redistribution and use in source and binary forms, with or without
49** modification, are permitted provided that the following conditions are met:
50**
51** * Redistributions of source code must retain the above copyright notice,
52** this list of conditions and the following disclaimer.
53**
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.
57**
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.
61**
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.
73**
74****************************************************************************/
75
76#import <Cocoa/Cocoa.h>
77
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>
84
85QT_BEGIN_NAMESPACE
86
87QT_USE_NAMESPACE
88
89/*****************************************************************************
90 Externals
91 *****************************************************************************/
92
93/*****************************************************************************
94 QDesktopWidget member functions
95 *****************************************************************************/
96
97Q_GLOBAL_STATIC(QDesktopWidgetImplementation, qdesktopWidgetImplementation)
98
99QDesktopWidgetImplementation::QDesktopWidgetImplementation()
100 : appScreen(0)
101{
102 onResize();
103}
104
105QDesktopWidgetImplementation::~QDesktopWidgetImplementation()
106{
107}
108
109QDesktopWidgetImplementation *QDesktopWidgetImplementation::instance()
110{
111 return qdesktopWidgetImplementation();
112}
113
114QRect QDesktopWidgetImplementation::availableRect(int screenIndex) const
115{
116 if (screenIndex < 0 || screenIndex >= screenCount)
117 screenIndex = appScreen;
118
119 return availableRects[screenIndex].toRect();
120}
121
122QRect QDesktopWidgetImplementation::screenRect(int screenIndex) const
123{
124 if (screenIndex < 0 || screenIndex >= screenCount)
125 screenIndex = appScreen;
126
127 return screenRects[screenIndex].toRect();
128}
129
130void QDesktopWidgetImplementation::onResize()
131{
132 QMacCocoaAutoReleasePool pool;
133 NSArray *displays = [NSScreen screens];
134 screenCount = [displays count];
135
136 screenRects.clear();
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 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
146 r = [[displays objectAtIndex:i] visibleFrame];
147 flippedY = - r.origin.y + // account for position offset and
148 primaryRect.size.height - r.size.height; // height difference.
149 availableRects.append(QRectF(r.origin.x, flippedY,
150 r.size.width, r.size.height));
151 }
152}
153
154
155
156QDesktopWidget::QDesktopWidget()
157 : QWidget(0, Qt::Desktop)
158{
159 setObjectName(QLatin1String("desktop"));
160 setAttribute(Qt::WA_WState_Visible);
161}
162
163QDesktopWidget::~QDesktopWidget()
164{
165}
166
167bool QDesktopWidget::isVirtualDesktop() const
168{
169 return true;
170}
171
172int QDesktopWidget::primaryScreen() const
173{
174 return qdesktopWidgetImplementation()->appScreen;
175}
176
177int QDesktopWidget::numScreens() const
178{
179 return qdesktopWidgetImplementation()->screenCount;
180}
181
182QWidget *QDesktopWidget::screen(int)
183{
184 return this;
185}
186
187const QRect QDesktopWidget::availableGeometry(int screen) const
188{
189 return qdesktopWidgetImplementation()->availableRect(screen);
190}
191
192const QRect QDesktopWidget::screenGeometry(int screen) const
193{
194 return qdesktopWidgetImplementation()->screenRect(screen);
195}
196
197int QDesktopWidget::screenNumber(const QWidget *widget) const
198{
199 QDesktopWidgetImplementation *d = qdesktopWidgetImplementation();
200 if (!widget)
201 return d->appScreen;
202 QRect frame = widget->frameGeometry();
203 if (!widget->isWindow())
204 frame.moveTopLeft(widget->mapToGlobal(QPoint(0,0)));
205 int maxSize = -1, maxScreen = -1;
206 for (int i = 0; i < d->screenCount; ++i) {
207 QRect rr = d->screenRect(i);
208 QRect sect = rr.intersected(frame);
209 int size = sect.width() * sect.height();
210 if (size > maxSize && sect.width() > 0 && sect.height() > 0) {
211 maxSize = size;
212 maxScreen = i;
213 }
214 }
215 return maxScreen;
216}
217
218int QDesktopWidget::screenNumber(const QPoint &point) const
219{
220 QDesktopWidgetImplementation *d = qdesktopWidgetImplementation();
221 int closestScreen = -1;
222 int shortestDistance = INT_MAX;
223 for (int i = 0; i < d->screenCount; ++i) {
224 QRect rr = d->screenRect(i);
225 int thisDistance = QWidgetPrivate::pointToRect(point, rr);
226 if (thisDistance < shortestDistance) {
227 shortestDistance = thisDistance;
228 closestScreen = i;
229 }
230 }
231 return closestScreen;
232}
233
234void QDesktopWidget::resizeEvent(QResizeEvent *)
235{
236 QDesktopWidgetImplementation *d = qdesktopWidgetImplementation();
237
238 const int oldScreenCount = d->screenCount;
239 const QVector<QRectF> oldRects(d->screenRects);
240 const QVector<QRectF> oldWorks(d->availableRects);
241
242 d->onResize();
243
244 for (int i = 0; i < qMin(oldScreenCount, d->screenCount); ++i) {
245 if (oldRects.at(i) != d->screenRects.at(i))
246 emit resized(i);
247 }
248 for (int i = 0; i < qMin(oldScreenCount, d->screenCount); ++i) {
249 if (oldWorks.at(i) != d->availableRects.at(i))
250 emit workAreaResized(i);
251 }
252
253 if (oldScreenCount != d->screenCount)
254 emit screenCountChanged(d->screenCount);
255}
256
257QT_END_NAMESPACE
Note: See TracBrowser for help on using the repository browser.